]> icculus.org git repositories - taylor/freespace2.git/blob - include/2d.h
Initial revision
[taylor/freespace2.git] / include / 2d.h
1 /*
2  * $Logfile: /Freespace2/code/Graphics/2d.h $
3  * $Revision$
4  * $Date$
5  * $Author$
6  *
7  * Header file for 2d primitives.
8  *
9  * $Log$
10  * Revision 1.1  2002/05/03 03:28:12  root
11  * Initial revision
12  *
13  * 
14  * 16    8/30/99 5:01p Dave
15  * Made d3d do less state changing in the nebula. Use new chat server for
16  * PXO.
17  * 
18  * 15    8/16/99 9:45a Jefff
19  * changes to cursor management to allow a 2nd temporary cursor
20  * 
21  * 14    7/15/99 3:07p Dave
22  * 32 bit detection support. Mouse coord commandline.
23  * 
24  * 13    7/14/99 9:42a Dave
25  * Put in clear_color debug function. Put in base for 3dnow stuff / P3
26  * stuff
27  * 
28  * 12    7/09/99 9:51a Dave
29  * Added thick polyline code.
30  * 
31  * 11    6/29/99 10:35a Dave
32  * Interface polygon bitmaps! Whee!
33  * 
34  * 10    2/03/99 11:44a Dave
35  * Fixed d3d transparent textures.
36  * 
37  * 9     1/30/99 5:08p Dave
38  * More new hi-res stuff.Support for nice D3D textures.
39  * 
40  * 8     1/24/99 11:36p Dave
41  * First full rev of beam weapons. Very customizable. Removed some bogus
42  * Int3()'s in low level net code.
43  * 
44  * 7     12/21/98 5:02p Dave
45  * Modified all hud elements to be multi-resolution friendly.
46  * 
47  * 6     12/18/98 1:49a Dave
48  * Fixed Fred initialization problem resulting from hi-res mode changes.
49  * 
50  * 5     12/18/98 1:13a Dave
51  * Rough 1024x768 support for Direct3D. Proper detection and usage through
52  * the launcher.
53  * 
54  * 4     12/06/98 2:36p Dave
55  * Drastically improved nebula fogging.
56  * 
57  * 3     11/11/98 5:37p Dave
58  * Checkin for multiplayer testing.
59  * 
60  * 2     10/07/98 10:52a Dave
61  * Initial checkin.
62  * 
63  * 1     10/07/98 10:48a Dave
64  * 
65  * 75    5/20/98 9:45p John
66  * added code so the places in code that change half the palette don't
67  * have to clear the screen.
68  * 
69  * 74    5/06/98 5:30p John
70  * Removed unused cfilearchiver.  Removed/replaced some unused/little used
71  * graphics functions, namely gradient_h and _v and pixel_sp.   Put in new
72  * DirectX header files and libs that fixed the Direct3D alpha blending
73  * problems.
74  * 
75  * 73    4/14/98 12:15p John
76  * Made 16-bpp movies work.
77  * 
78  * 72    4/10/98 5:20p John
79  * Changed RGB in lighting structure to be ubytes.  Removed old
80  * not-necessary 24 bpp software stuff.
81  * 
82  * 71    3/25/98 8:07p John
83  * Restructured software rendering into two modules; One for windowed
84  * debug mode and one for DirectX fullscreen.   
85  * 
86  * 70    3/24/98 8:31a John
87  * Added function to set gamma
88  * 
89  * 69    3/17/98 5:55p John
90  * Added code to dump Glide frames.   Moved Allender's  "hack" code out of
91  * Freespace.cpp into the proper place, graphics lib.
92  * 
93  * 68    3/12/98 5:36p John
94  * Took out any unused shaders.  Made shader code take rgbc instead of
95  * matrix and vector since noone used it like a matrix and it would have
96  * been impossible to do in hardware.   Made Glide implement a basic
97  * shader for online help.  
98  * 
99  * 67    3/10/98 4:18p John
100  * Cleaned up graphics lib.  Took out most unused gr functions.   Made D3D
101  * & Glide have popups and print screen.  Took out all >8bpp software
102  * support.  Made Fred zbuffer.  Made zbuffer allocate dynamically to
103  * support Fred.  Made zbuffering key off of functions rather than one
104  * global variable.
105  * 
106  * 66    2/07/98 7:50p John
107  * Added code so that we can use the old blending type of alphacolors if
108  * we want to.  Made the stars use them.
109  * 
110  * 65    1/08/98 1:54p John
111  * Added code to fix palette problems when Alt+Tabbing
112  * 
113  * 64    12/30/97 6:46p John
114  * Added first rev of palette fade in out functions
115  * 
116  * 63    12/03/97 10:47a John
117  * added functions to save/restore entire screens.
118  * 
119  * 62    12/02/97 3:59p John
120  * Added first rev of thruster glow, along with variable levels of
121  * translucency, which retquired some restructing of palman.
122  * 
123  * 61    11/20/97 9:51a John
124  * added code to force screen to 16-bit even if rendering 8.
125  * 
126  * 60    11/03/97 10:08p Hoffoss
127  * Changed gr_get_string_size to utilize an optional length specifier, if
128  * you want to use non-null terminated strings.
129  * 
130  * 59    10/19/97 12:55p John
131  * new code to lock / unlock surfaces for smooth directx integration.
132  * 
133  * 58    10/03/97 10:02a John
134  * added better comments for lines.
135  * 
136  * 57    10/03/97 9:10a John
137  * added better antialiased line drawer
138  * 
139  * 56    9/23/97 10:45a John
140  * made so you can tell bitblt code to rle a bitmap by passing flag to
141  * gr_set_bitmap
142  * 
143  * 55    9/07/97 10:01p Lawrance
144  * add in support for animating mouse pointer
145  * 
146  * 54    8/04/97 4:47p John
147  * added gr_aascaler.
148  * 
149  * 53    7/16/97 3:07p John
150  * 
151  * 52    7/10/97 2:06p John
152  * added code to specify alphablending type for bitmaps.
153  * 
154  * 51    6/25/97 2:35p John
155  * added some functions to use the windows font for Fred.
156  * 
157  * 50    6/17/97 7:04p John
158  * added d3d support for gradients.
159  * fixed some color bugs by adding screen signatures instead of watching
160  * flags and palette changes.
161  * 
162  * 49    6/17/97 12:03p John
163  * Moved color/alphacolor functions into their own module.  Made all color
164  * functions be part of the low-level graphics drivers, not just the
165  * grsoft.
166  * 
167  * 48    6/13/97 5:35p John
168  * added some antialiased bitmaps and lines
169  * 
170  * 47    6/11/97 5:49p John
171  * Changed palette code to only recalculate alphacolors when needed, not
172  * when palette changes.
173  * 
174  * 46    6/11/97 4:11p John
175  * addec function to get font height
176  * 
177  * 45    6/11/97 1:12p John
178  * Started fixing all the text colors in the game.
179  * 
180  * 44    6/09/97 9:24a John
181  * Changed the way fonts are set.
182  * 
183  * 43    6/06/97 4:41p John
184  * Fixed alpha colors to be smoothly integrated into gr_set_color_fast
185  * code.
186  * 
187  * 42    6/05/97 4:53p John
188  * First rev of new antialiased font stuff.
189  * 
190  * 41    5/29/97 3:09p John
191  * Took out debug menu.  
192  * Made software scaler draw larger bitmaps.
193  * Optimized Direct3D some.
194  * 
195  * 40    5/14/97 10:53a John
196  * fixed some discrepencies between d3d and software palette setting.
197  * 
198  * 39    5/12/97 3:09p John
199  * fixed a stupid macro bug.
200  * 
201  * 38    5/12/97 12:27p John
202  * Restructured Graphics Library to add support for multiple renderers.
203  * 
204  * 37    4/28/97 4:46p John
205  * 
206  * 36    4/23/97 5:26p John
207  * First rev of new debug console stuff.
208  * 
209  * 35    3/12/97 2:51p John
210  * Added some test code for tmapper.  
211  * 
212  * 34    3/12/97 9:25a John
213  * fixed a bug with zbuffering.  Reenabled it by default.
214  * 
215  * 33    3/04/97 3:36p John
216  * took out old debug "h' key.   Made zbuffer flag bit bit field so you
217  * can turn on/off each value.   Fixed a bug with turret rotation where
218  * different handedness turrets wouldn't work.   Fixed a bug with two
219  * large ships within each other's radius not rendering correctly.
220  * 
221  * 32    1/27/97 9:08a John
222  * Added code to turn zbuffering on/off in call to g3_start_frame
223  * 
224  * 31    1/09/97 11:35a John
225  * Added some 2d functions to get/put screen images.
226  * 
227  * 30    1/07/97 2:01p John
228  * Fairly fast zbuffering for object sorting.
229  * 
230  * 29    1/06/97 2:44p John
231  * Added in slow (but correct) zbuffering
232  * 
233  * 28    12/11/96 12:41p John
234  * Added new code to draw 3d laser using 2d ellipses.
235  * 
236  * 27    12/10/96 10:37a John
237  * Restructured texture mapper to remove some overhead from each scanline
238  * setup.  This gave about a 30% improvement drawing trans01.pof, which is
239  * a really complex model.  In the process, I cleaned up the scanline
240  * functions and separated them into different modules for each pixel
241  * depth.   
242  * 
243  * 26    11/21/96 11:21a John
244  * Made gr_get_string_size handle multi line text.
245  * Took out gr_get_multiline_string_size
246  * 
247  * 25    11/20/96 10:01a Hoffoss
248  * A few minor improvements.
249  * 
250  * 24    11/18/96 4:35p Allender
251  * new 16bpp gradient functions
252  * 
253  * 23    11/18/96 12:36p John
254  * Added code to dump screen to a PCX file.
255  * 
256  * 22    11/18/96 11:40a John
257  * Added faster gr_set_color method.
258  * 
259  * 21    11/15/96 3:34p Allender
260  * added bpp variable to the shader structure
261  * 
262  * 20    11/13/96 6:47p John
263  * Added gr_flip function.
264  * 
265  * 19    11/13/96 10:10a John
266  * Increases MAX_WIDTH & HEIGHT for Jasen's massive 1600x1200 display.
267  * 
268  * 18    10/30/96 10:36a Lawrance
269  * added gr_diamond function
270  * 
271  * 17    10/26/96 2:56p John
272  * Got gradient code working.
273  * 
274  * 16    10/26/96 1:40p John
275  * Added some now primitives to the 2d library and
276  * cleaned up some old ones.
277  *
278  * $NoKeywords: $
279  */
280
281 #ifndef _GRAPHICS_H
282 #define _GRAPHICS_H
283
284 /* ========================= pixel plotters =========================
285 In the 2d/texture mapper, bitmaps to be drawn will be passed by number.
286 The 2d function will call a bmpman function to get the bitmap into whatever
287 format it needs.  Then it will render.   The only pixels that will ever 
288 get drawn go thru the 2d/texture mapper libraries only.   This will make
289 supporting accelerators and psx easier.   Colors will always be set with
290 the color set functions.
291
292 gr_surface_flip()       switch onscreen, offscreen
293
294 gr_set_clip(x,y,w,h)    // sets the clipping region
295 gr_reset_clip(x,y,w,h)  // sets the clipping region
296 gr_set_color --? 8bpp, 15bpp?
297 gr_set_font(int fontnum)
298 // see GR_ALPHABLEND defines for values for alphablend_mode
299 // see GR_BITBLT_MODE defines for bitblt_mode.
300 // Alpha = scaler for intensity
301 gr_set_bitmap( int bitmap_num, int alphblend_mode, int bitblt_mode, float alpha )       
302 gr_set_shader( int value )  0=normal -256=darken, 256=brighten
303 gr_set_palette( ubyte * palette ) 
304
305 gr_clear()      // clears entire clipping region
306 gr_bitmap(x,y)
307 gr_bitmap_ex(x,y,w,h,sx,sy)
308 gr_rect(x,y,w,h)
309 gr_shade(x,y,w,h)
310 gr_string(x,y,char * text)
311 gr_line(x1,y1,x2,y2)
312
313  
314 */
315
316 #include "pstypes.h"
317 #include "tmapper.h"
318
319 // This is a structure used by the shader to keep track
320 // of the values you want to use in the shade primitive.
321 typedef struct shader {
322         uint    screen_sig;                                     // current mode this is in
323         float   r,g,b,c;                                                // factors and constant
324         ubyte   lookup[256];
325 } shader;
326
327 #define AC_TYPE_NONE            0               // Not an alphacolor
328 #define AC_TYPE_HUD             1               // Doesn't change hue depending on background.  Used for HUD stuff.
329 #define AC_TYPE_BLEND   2               // Changes hue depending on background.  Used for stars, etc.
330
331 // NEVER REFERENCE THESE VALUES OUTSIDE OF THE GRAPHICS LIBRARY!!!
332 // If you need to get the rgb values of a "color" struct call
333 // gr_get_colors after calling gr_set_colors_fast.
334 typedef struct color {
335         uint            screen_sig;
336         ubyte           red;
337         ubyte           green;
338         ubyte           blue;
339         ubyte           alpha;
340         ubyte           ac_type;                                                        // The type of alphacolor.  See AC_TYPE_??? defines
341         int             is_alphacolor;
342         ubyte           raw8;
343         int             alphacolor;
344         int             magic;          
345 } color;
346
347 #define GR_ALPHABLEND_NONE                      0               // no blending
348 #define GR_ALPHABLEND_FILTER            1               // 50/50 mix of foreground, background, using intensity as alpha
349
350 #define GR_BITBLT_MODE_NORMAL           0               // Normal bitblting
351 #define GR_BITBLT_MODE_RLE                      1               // RLE would be faster
352
353 // fog modes
354 #define GR_FOGMODE_NONE                         0               // set this to turn off fog
355 #define GR_FOGMODE_FOG                          1               // linear fog
356
357 typedef struct screen {
358         uint    signature;                      // changes when mode or palette or width or height changes
359         int     max_w, max_h;           // Width and height
360         int     res;                                    // GR_640 or GR_1024
361         int     mode;                                   // What mode gr_init was called with.
362         float   aspect;                         // Aspect ratio
363         int     rowsize;                                // What you need to add to go to next row (includes bytes_per_pixel)
364         int     bits_per_pixel; // How many bits per pixel it is. (7,8,15,16,24,32)
365         int     bytes_per_pixel;        // How many bytes per pixel (1,2,3,4)
366         int     offset_x, offset_y;             // The offsets into the screen
367         int     clip_width, clip_height;
368
369         float fog_near, fog_far;
370
371         // the clip_l,r,t,b are used internally.  left and top are
372         // actually always 0, but it's nice to have the code work with
373         // arbitrary clipping regions.
374         int             clip_left, clip_right, clip_top, clip_bottom;   
375
376         int             current_alphablend_mode;                // See GR_ALPHABLEND defines above
377         int             current_bitblt_mode;                            // See GR_BITBLT_MODE defines above
378         int             current_fog_mode;                                       // See GR_FOGMODE_* defines above
379         int             current_bitmap;
380         int             current_bitmap_sx;                              // bitmap x section
381         int             current_bitmap_sy;                              // bitmap y section
382         color           current_color;
383         color           current_fog_color;                              // current fog color
384         color           current_clear_color;                            // current clear color
385         shader  current_shader;
386         float           current_alpha;
387         void            *offscreen_buffer;                              // NEVER ACCESS!  This+rowsize*y = screen offset
388         void            *offscreen_buffer_base;                 // Pointer to lowest address of offscreen buffer
389
390         //switch onscreen, offscreen
391         void (*gf_flip)();
392         void (*gf_flip_window)(uint _hdc, int x, int y, int w, int h );
393
394         // Sets the current palette
395         void (*gf_set_palette)(ubyte * new_pal, int restrict_alphacolor = 0);
396
397         // Fade the screen in/out
398         void (*gf_fade_in)(int instantaneous);
399         void (*gf_fade_out)(int instantaneous);
400
401         // Flash the screen
402         void (*gf_flash)( int r, int g, int b );
403
404         // sets the clipping region
405         void (*gf_set_clip)(int x, int y, int w, int h);
406
407         // resets the clipping region to entire screen
408         void (*gf_reset_clip)();
409
410         void (*gf_set_color)( int r, int g, int b );
411         void (*gf_get_color)( int * r, int * g, int * b );
412         void (*gf_init_color)( color * dst, int r, int g, int b );
413
414         void (*gf_init_alphacolor)( color * dst, int r, int g, int b, int alpha, int type=AC_TYPE_HUD );
415         void (*gf_set_color_fast)( color * dst );
416
417         void (*gf_set_font)(int fontnum);
418
419         // Sets the current bitmap
420         void (*gf_set_bitmap)( int bitmap_num, int alphablend=GR_ALPHABLEND_NONE, int bitbltmode=GR_BITBLT_MODE_NORMAL, float alpha=1.0f, int sx = -1, int sy = -1 );
421
422         // Call this to create a shader.   
423         // This function takes a while, so don't call it once a frame!
424         // r,g,b, and c should be between -1.0 and 1.0f
425
426         // The matrix is used as follows:
427         // Dest(r) = Src(r)*r + Src(g)*r + Src(b)*r + c;
428         // Dest(g) = Src(r)*g + Src(g)*g + Src(b)*g + c;
429         // Dest(b) = Src(r)*b + Src(g)*b + Src(b)*b + c;
430         // For instance, to convert to greyscale, use
431         // .3 .3 .3  0
432         // To turn everything green, use:
433         //  0 .3  0  0
434         void (*gf_create_shader)(shader * shade, float r, float g, float b, float c );
435
436         // Initialize the "shader" by calling gr_create_shader()
437         // Passing a NULL makes a shader that turns everything black.
438         void (*gf_set_shader)( shader * shade );
439
440         // clears entire clipping region to current color
441         void (*gf_clear)();
442
443         // void (*gf_bitmap)(int x,int y);
444         // void (*gf_bitmap_ex)(int x,int y,int w,int h,int sx,int sy);
445
446         void (*gf_aabitmap)(int x, int y);
447         void (*gf_aabitmap_ex)(int x, int y, int w, int h, int sx, int sy);
448
449         void (*gf_rect)(int x, int y, int w, int h);
450         void (*gf_shade)(int x, int y, int w, int h);
451         void (*gf_string)(int x, int y, char * text);
452
453         // Draw a gradient line... x1,y1 is bright, x2,y2 is transparent.
454         void (*gf_gradient)(int x1, int y1, int x2, int y2);
455  
456         void (*gf_circle)(int x, int y, int r);
457
458         // Integer line. Used to draw a fast but pixely line.  
459         void (*gf_line)(int x1, int y1, int x2, int y2);
460
461         // Draws an antialiased line is the current color is an 
462         // alphacolor, otherwise just draws a fast line.  This
463         // gets called internally by g3_draw_line.   This assumes
464         // the vertex's are already clipped, so call g3_draw_line
465         // not this if you have two 3d points.
466         void (*gf_aaline)(vertex *v1, vertex *v2);
467
468         void (*gf_pixel)( int x, int y );
469
470         // Scales current bitmap between va and vb with clipping
471         void (*gf_scaler)(vertex *va, vertex *vb );
472
473         // Scales current bitmap between va and vb with clipping, draws an aabitmap
474         void (*gf_aascaler)(vertex *va, vertex *vb );
475
476         // Texture maps the current bitmap.  See TMAP_FLAG_?? defines for flag values
477         void (*gf_tmapper)(int nv, vertex *verts[], uint flags );
478
479         // dumps the current screen to a file
480         void (*gf_print_screen)(char * filename);
481
482         // Call once before rendering anything.
483         void (*gf_start_frame)();
484
485         // Call after rendering is over.
486         void (*gf_stop_frame)();
487
488         // Retrieves the zbuffer mode.
489         int (*gf_zbuffer_get)();
490
491         // Sets mode.  Returns previous mode.
492         int (*gf_zbuffer_set)(int mode);
493
494         // Clears the zbuffer.  If use_zbuffer is FALSE, then zbuffering mode is ignored and zbuffer is always off.
495         void (*gf_zbuffer_clear)(int use_zbuffer);
496         
497         // Saves screen. Returns an id you pass to restore and free.
498         int (*gf_save_screen)();
499         
500         // Resets clip region and copies entire saved screen to the screen.
501         void (*gf_restore_screen)(int id);
502
503         // Frees up a saved screen.
504         void (*gf_free_screen)(int id);
505
506         // CODE FOR DUMPING FRAMES TO A FILE
507         // Begin frame dumping
508         void (*gf_dump_frame_start)( int first_frame_number, int nframes_between_dumps );
509
510         // Dump the current frame to file
511         void (*gf_dump_frame)();
512
513         // Dump the current frame to file
514         void (*gf_dump_frame_stop)();
515
516         // Sets the gamma
517         void (*gf_set_gamma)(float gamma);
518
519         // Lock/unlock the screen
520         // Returns non-zero if sucessful (memory pointer)
521         uint (*gf_lock)();
522         void (*gf_unlock)();
523
524         // grab a region of the screen. assumes data is large enough
525         void (*gf_get_region)(int front, int w, int h, ubyte *data);
526
527         // set fog attributes
528         void (*gf_fog_set)(int fog_mode, int r, int g, int b, float fog_near = -1.0f, float fog_far = -1.0f);   
529
530         // get the current pixel color in the framebuffer 
531         void (*gf_get_pixel)(int x, int y, int *r, int *g, int *b);
532
533         // poly culling
534         void (*gf_set_cull)(int cull);
535
536         // cross fade
537         void (*gf_cross_fade)(int bmap1, int bmap2, int x1, int y1, int x2, int y2, float pct);
538
539         // filtering
540         void (*gf_filter_set)(int filter);
541
542         // set a texture into cache. for sectioned bitmaps, pass in sx and sy to set that particular section of the bitmap
543         int (*gf_tcache_set)(int bitmap_id, int bitmap_type, float *u_scale, float *v_scale, int fail_on_full = 0, int sx = -1, int sy = -1, int force = 0);    
544
545         // set the color to be used when clearing the background
546         void (*gf_set_clear_color)(int r, int g, int b);
547 } screen;
548
549 // cpu types
550 extern int Gr_amd3d;
551 extern int Gr_katmai;
552 extern int Gr_cpu;      
553 extern int Gr_mmx;
554
555 // handy macro
556 #define GR_MAYBE_CLEAR_RES(bmap)                do  { int bmw = -1; int bmh = -1; if(bmap != -1){ bm_get_info( bmap, &bmw, &bmh); if((bmw != gr_screen.max_w) || (bmh != gr_screen.max_h)){gr_clear();} } else {gr_clear();} } while(0);
557
558 //Window's interface to set up graphics:
559 //--------------------------------------
560 // Call this at application startup
561
562 #define GR_SOFTWARE                                     (100)           // Software renderer using standard Win32 functions in a window.
563 #define GR_DIRECTDRAW                           (101)           // Software renderer using DirectDraw fullscreen.
564 #define GR_DIRECT3D                                     (102)           // Use Direct3d hardware renderer
565 #define GR_GLIDE                                                (103)           // Use Glide hardware renderer
566 #define GR_OPENGL                                               (104)           // Use OpenGl hardware renderer
567
568 // resolution constants   - always keep resolutions in ascending order and starting from 0  
569 #define GR_NUM_RESOLUTIONS                      2
570 #define GR_640                                                  0               // 640 x 480
571 #define GR_1024                                         1               // 1024 x 768
572
573 extern int gr_init(int res, int mode, int depth = 16, int fred_x = -1, int fred_y = -1 );
574
575 // Call this when your app ends.
576 extern void gr_close();
577
578 extern screen gr_screen;
579
580 #define GR_ZBUFF_NONE   0
581 #define GR_ZBUFF_WRITE  (1<<0)
582 #define GR_ZBUFF_READ   (1<<1)
583 #define GR_ZBUFF_FULL   (GR_ZBUFF_WRITE|GR_ZBUFF_READ)
584
585 // Returns -1 if couldn't init font, otherwise returns the
586 // font id number.  If you call this twice with the same typeface,
587 // it will return the same font number both times.  This font is
588 // then set to be the current font, and default font if none is 
589 // yet specified.
590 int gr_init_font( char * typeface );
591
592 // Does formatted printing.  This calls gr_string after formatting,
593 // so if you don't need to format the string, then call gr_string
594 // directly.
595 extern void _cdecl gr_printf( int x, int y, char * format, ... );
596
597 // Returns the size of the string in pixels in w and h
598 extern void gr_get_string_size( int *w, int *h, char * text, int len = 9999 );
599
600 // Returns the height of the current font
601 extern int gr_get_font_height();
602
603 extern void gr_set_palette(char *name, ubyte *palette, int restrict_to_128 = 0);
604
605 // These two functions use a Windows mono font.  Only for use
606 // in the editor, please.
607 void gr_get_string_size_win(int *w, int *h, char *text);
608 void gr_string_win(int x, int y, char *s );
609
610 // set the mouse pointer to a specific bitmap, used for animating cursors
611 #define GR_CURSOR_LOCK          1
612 #define GR_CURSOR_UNLOCK        2
613 void gr_set_cursor_bitmap(int n, int lock = 0);
614 int gr_get_cursor_bitmap();
615 extern int Web_cursor_bitmap;
616
617 // Called by OS when application gets/looses focus
618 extern void gr_activate(int active);
619
620 #define GR_CALL(x)                      (*x)
621
622 // These macros make the function indirection look like the
623 // old Descent-style gr_xxx calls.
624
625 #define gr_print_screen         GR_CALL(gr_screen.gf_print_screen)
626
627 #define gr_flip                         GR_CALL(gr_screen.gf_flip)
628 #define gr_flip_window          GR_CALL(gr_screen.gf_flip_window)
629
630 #define gr_set_clip                     GR_CALL(gr_screen.gf_set_clip)
631 #define gr_reset_clip           GR_CALL(gr_screen.gf_reset_clip)
632 #define gr_set_font                     GR_CALL(gr_screen.gf_set_font)
633
634 #define gr_init_color           GR_CALL(gr_screen.gf_init_color)
635 #define gr_init_alphacolor      GR_CALL(gr_screen.gf_init_alphacolor)
636 #define gr_set_color                    GR_CALL(gr_screen.gf_set_color)
637 #define gr_get_color                    GR_CALL(gr_screen.gf_get_color)
638 #define gr_set_color_fast       GR_CALL(gr_screen.gf_set_color_fast)
639
640 #define gr_set_bitmap           GR_CALL(gr_screen.gf_set_bitmap)
641
642 #define gr_create_shader        GR_CALL(gr_screen.gf_create_shader)
643 #define gr_set_shader           GR_CALL(gr_screen.gf_set_shader)
644 #define gr_clear                                GR_CALL(gr_screen.gf_clear)
645 // #define gr_bitmap                            GR_CALL(gr_screen.gf_bitmap)
646 // #define gr_bitmap_ex                 GR_CALL(gr_screen.gf_bitmap_ex)
647 #define gr_aabitmap                     GR_CALL(gr_screen.gf_aabitmap)
648 #define gr_aabitmap_ex          GR_CALL(gr_screen.gf_aabitmap_ex)
649 #define gr_rect                         GR_CALL(gr_screen.gf_rect)
650 #define gr_shade                                GR_CALL(gr_screen.gf_shade)
651 #define gr_string                               GR_CALL(gr_screen.gf_string)
652
653 #define gr_circle                               GR_CALL(gr_screen.gf_circle)
654
655 #define gr_line                         GR_CALL(gr_screen.gf_line)
656 #define gr_aaline                               GR_CALL(gr_screen.gf_aaline)
657 #define gr_pixel                                GR_CALL(gr_screen.gf_pixel)
658 #define gr_scaler                               GR_CALL(gr_screen.gf_scaler)
659 #define gr_aascaler                     GR_CALL(gr_screen.gf_aascaler)
660 #define gr_tmapper                      GR_CALL(gr_screen.gf_tmapper)
661
662 #define gr_gradient                     GR_CALL(gr_screen.gf_gradient)
663
664
665 #define gr_fade_in                      GR_CALL(gr_screen.gf_fade_in)
666 #define gr_fade_out                     GR_CALL(gr_screen.gf_fade_out)
667 #define gr_flash                                GR_CALL(gr_screen.gf_flash)
668
669 #define gr_zbuffer_get          GR_CALL(gr_screen.gf_zbuffer_get)
670 #define gr_zbuffer_set          GR_CALL(gr_screen.gf_zbuffer_set)
671 #define gr_zbuffer_clear        GR_CALL(gr_screen.gf_zbuffer_clear)
672
673 #define gr_save_screen          GR_CALL(gr_screen.gf_save_screen)
674 #define gr_restore_screen       GR_CALL(gr_screen.gf_restore_screen)
675 #define gr_free_screen          GR_CALL(gr_screen.gf_free_screen)
676
677 #define gr_dump_frame_start     GR_CALL(gr_screen.gf_dump_frame_start)
678 #define gr_dump_frame_stop              GR_CALL(gr_screen.gf_dump_frame_stop)
679 #define gr_dump_frame                   GR_CALL(gr_screen.gf_dump_frame)
680
681 #define gr_set_gamma                    GR_CALL(gr_screen.gf_set_gamma)
682
683 #define gr_lock                         GR_CALL(gr_screen.gf_lock)
684 #define gr_unlock                               GR_CALL(gr_screen.gf_unlock)
685
686 #define gr_get_region           GR_CALL(gr_screen.gf_get_region)
687
688 #define gr_fog_set                      GR_CALL(gr_screen.gf_fog_set)
689
690 #define gr_get_pixel                    GR_CALL(gr_screen.gf_get_pixel)
691
692 #define gr_set_cull                     GR_CALL(gr_screen.gf_set_cull)
693
694 #define gr_cross_fade           GR_CALL(gr_screen.gf_cross_fade)
695
696 #define gr_filter_set           GR_CALL(gr_screen.gf_filter_set)
697
698 #define gr_tcache_set           GR_CALL(gr_screen.gf_tcache_set)
699
700 #define gr_set_clear_color      GR_CALL(gr_screen.gf_set_clear_color)
701
702 // new bitmap functions
703 extern int Gr_bitmap_poly;
704 void gr_bitmap(int x, int y);
705 void gr_bitmap_ex(int x, int y, int w, int h, int sx, int sy);
706
707 // special function for drawing polylines. this function is specifically intended for
708 // polylines where each section is no more than 90 degrees away from a previous section.
709 // Moreover, it is _really_ intended for use with 45 degree angles. 
710 void gr_pline_special(vector **pts, int num_pts, int thickness);
711
712 #endif
713