Home | History | Annotate | Download | only in INCLUDE
      1 /****************************************************************************
      2 *
      3 *						MegaGraph Graphics Library
      4 *
      5 *                   Copyright (C) 1996 SciTech Software.
      6 *							All rights reserved.
      7 *
      8 * Filename:		$Workfile:   mgraph.h  $
      9 * Version:		$Revision:   1.29  $
     10 *
     11 * Language:		ANSI C
     12 * Environment:	IBM PC (MS DOS)
     13 *
     14 * Description:	Header file for the MegaGraph Graphics Library. You can
     15 *				defined one of the following to specify which MGL API you
     16 *				wish to use.
     17 *
     18 *					MGL_LITE	- Compile for the MGL/Lite API
     19 *					MGL_PRO		- Compile for the MGL/Pro API
     20 *					MGL_FIX3D	- Compile for the MGL/3D API (fixed point)
     21 *					MGL_FLT3D	- Compile for the MGL/3D API (floating point)
     22 *
     23 *				If you do not define any of these, MGL_FIX3D will be defined
     24 *				automatically for compatibility with older versions of the
     25 *				MGL.
     26 *
     27 * $Date:   11 Mar 1997 16:46:42  $ $Author:   KendallB  $
     28 *
     29 ****************************************************************************/
     30 
     31 #ifndef	__MGRAPH_H
     32 #define	__MGRAPH_H
     33 
     34 #include <stdio.h>
     35 
     36 #ifndef	__DEBUG_H
     37 #include "debug.h"
     38 #endif
     39 
     40 #if	!defined(MGL_LITE) && !defined(MGL_PRO) && !defined(MGL_FIX3D) \
     41 	&& !defined(MGL_FLT3D)
     42 #define	MGL_FIX3D
     43 #endif
     44 
     45 #if	defined(MGL_FIX3D) || defined(MGL_FLT3D)
     46 #define	MGL_3D
     47 #endif
     48 
     49 /*---------------------- Macros and type definitions ----------------------*/
     50 
     51 #pragma pack(1)				/* Pack structures to byte granularity		*/
     52 
     53 /* Define the version number for the MGL release */
     54 
     55 #define MGL_VERSION_STR     "3.1"
     56 
     57 /* Define the calling conventions for all public MGL functions. If we
     58  * are compiling the MGL as a DLL, then all public functions are compiled
     59  * and exported with standard C calling conventions, otherwise we use
     60  * the default calling conventions provided by the compiler.
     61  *
     62  * Note that because Watcom C++ uses register based parameter passing
     63  * by default we also provide special DLL's for watcom that are compiled
     64  * with register parameter passing. This is necessary to work with all
     65  * the extra libraries provided as they are all compiled to call MGL
     66  * functions with arguments in registers whenever possible. You can still
     67  * use the standard DLL but if you do you will need to re-compile all
     68  * of the extra libraries with the MGL_DLL #define to change the calling
     69  * conventions for the MGL functions.
     70  */
     71 
     72 #if		defined(MGL_DLL)
     73 #define	MGLAPI	_EXPORT __cdecl
     74 #else
     75 #define	MGLAPI	_EXPORT _PUBAPI
     76 #endif
     77 #define	ASMAPI	_EXPORT __cdecl
     78 
     79 /* Define a type for integers used in the library. For most environments
     80  * we simply define it as a normal integer (16 or 32 bits), however for
     81  * 16 bit Windows it is defined as a 32 bit integer as all the real code
     82  * lives in a 32 bit DLL that uses 32 bit integers.
     83  */
     84 
     85 #ifndef	__M_INT_DEFINED
     86 #if	defined(__WINDOWS16__)
     87 typedef	long			m_int;
     88 typedef unsigned long	m_uint;
     89 #else
     90 typedef int				m_int;
     91 typedef	unsigned int	m_uint;
     92 #endif
     93 #define	__M_INT_DEFINED
     94 #endif
     95 
     96 /* Define the graphics subsystems available	*/
     97 
     98 typedef enum {
     99 	grDETECT		= -1,	/* Auto detect the graphics subsystem		*/
    100 	grNONE			= 0,	/* No graphics hardware detected			*/
    101 	grVGA,					/* Standard VGA								*/
    102 	grVESA,					/* VESA VBE compliant SuperVGA				*/
    103 	grSVGA,					/* Unaccelerated SuperVGA					*/
    104 	grACCEL,				/* Accelerated SuperVGA						*/
    105 	grDDRAW,				/* Unaccelerated DirectDraw					*/
    106 	grDDRAWACCEL,			/* Accelerated DirectDraw 					*/
    107 	grDDRAW3D,				/* 3D Accelerated DirectDraw 				*/
    108 	grMAXDRIVER,			/* Maximum driver number					*/
    109 	} MGL_driverType;
    110 
    111 /* Graphics modes supported	- the only video modes supported by this
    112  * graphics library are those that support at least 16 colors per pixel.
    113  */
    114 
    115 typedef enum {
    116 	/* 16 color VGA video modes */
    117 
    118 	grVGA_320x200x16,
    119 	grVGA_640x200x16,
    120 	grVGA_640x350x16,
    121 	grVGA_640x400x16,
    122 	grVGA_640x480x16,
    123 	grSVGA_800x600x16,
    124 
    125 	/* 256 color VGA ModeX video modes */
    126 
    127 	grVGAX_320x200x256,
    128 	grVGAX_320x240x256,
    129 	grVGAX_320x400x256,
    130 	grVGAX_320x480x256,
    131 
    132 	/* 256 color VGA video modes */
    133 
    134 	grVGA_320x200x256,
    135 
    136 	/* 256 color VGA/SuperVGA video modes */
    137 
    138 	grSVGA_320x200x256,
    139 	grSVGA_320x240x256,
    140 	grSVGA_320x400x256,
    141 	grSVGA_320x480x256,
    142 	grSVGA_400x300x256,
    143 	grSVGA_512x384x256,
    144 	grSVGA_640x350x256,
    145 	grSVGA_640x400x256,
    146 	grSVGA_640x480x256,
    147 	grSVGA_800x600x256,
    148 	grSVGA_1024x768x256,
    149 	grSVGA_1152x864x256,
    150 	grSVGA_1280x960x256,
    151 	grSVGA_1280x1024x256,
    152 	grSVGA_1600x1200x256,
    153 
    154 	/* 32,768 color Super VGA video modes */
    155 
    156     grSVGA_320x200x32k,
    157 	grSVGA_320x240x32k,
    158 	grSVGA_320x400x32k,
    159 	grSVGA_320x480x32k,
    160 	grSVGA_400x300x32k,
    161 	grSVGA_512x384x32k,
    162 	grSVGA_640x350x32k,
    163     grSVGA_640x400x32k,
    164     grSVGA_640x480x32k,
    165     grSVGA_800x600x32k,
    166     grSVGA_1024x768x32k,
    167 	grSVGA_1152x864x32k,
    168 	grSVGA_1280x960x32k,
    169 	grSVGA_1280x1024x32k,
    170     grSVGA_1600x1200x32k,
    171 
    172 	/* 65,536 color Super VGA video modes */
    173 
    174     grSVGA_320x200x64k,
    175 	grSVGA_320x240x64k,
    176 	grSVGA_320x400x64k,
    177 	grSVGA_320x480x64k,
    178 	grSVGA_400x300x64k,
    179 	grSVGA_512x384x64k,
    180 	grSVGA_640x350x64k,
    181 	grSVGA_640x400x64k,
    182 	grSVGA_640x480x64k,
    183 	grSVGA_800x600x64k,
    184 	grSVGA_1024x768x64k,
    185 	grSVGA_1152x864x64k,
    186 	grSVGA_1280x960x64k,
    187 	grSVGA_1280x1024x64k,
    188 	grSVGA_1600x1200x64k,
    189 
    190 	/* 16 million color, 24 bits per pixel Super VGA video modes */
    191 
    192 	grSVGA_320x200x16m,
    193 	grSVGA_320x240x16m,
    194 	grSVGA_320x400x16m,
    195 	grSVGA_320x480x16m,
    196 	grSVGA_400x300x16m,
    197 	grSVGA_512x384x16m,
    198 	grSVGA_640x350x16m,
    199 	grSVGA_640x400x16m,
    200 	grSVGA_640x480x16m,
    201 	grSVGA_800x600x16m,
    202 	grSVGA_1024x768x16m,
    203 	grSVGA_1152x864x16m,
    204 	grSVGA_1280x960x16m,
    205 	grSVGA_1280x1024x16m,
    206 	grSVGA_1600x1200x16m,
    207 
    208 	/* 16 million color, 32 bits per pixel Super VGA video modes */
    209 
    210 	grSVGA_320x200x4G,
    211 	grSVGA_320x240x4G,
    212 	grSVGA_320x400x4G,
    213 	grSVGA_320x480x4G,
    214 	grSVGA_400x300x4G,
    215 	grSVGA_512x384x4G,
    216 	grSVGA_640x350x4G,
    217 	grSVGA_640x400x4G,
    218 	grSVGA_640x480x4G,
    219 	grSVGA_800x600x4G,
    220 	grSVGA_1024x768x4G,
    221 	grSVGA_1152x864x4G,
    222 	grSVGA_1280x960x4G,
    223 	grSVGA_1280x1024x4G,
    224 	grSVGA_1600x1200x4G,
    225 
    226 	/* Render into Windowing System DC (Windows, OS/2 PM, X11) */
    227 
    228 	grWINDOWED,
    229 
    230 	grMAXMODE,					/* Maximum mode number					*/
    231 	} MGL_modeType;
    232 
    233 /* MGL_result() error codes	*/
    234 
    235 typedef enum {
    236 	grOK			= 0,	/* No error									*/
    237 	grNoInit		= -1,	/* Graphics driver has not been installed	*/
    238 	grNotDetected	= -2,	/* Graphics hardware was not detected		*/
    239 	grDriverNotFound= -3,	/* Graphics driver file not found			*/
    240 	grBadDriver		= -4,	/* File loaded was not a graphics driver	*/
    241 	grLoadMem		= -5,	/* Not enough memory to load graphics driver*/
    242 	grInvalidMode	= -6,	/* Invalid graphics mode for selected driver*/
    243 	grError			= -8,	/* General graphics error					*/
    244 	grInvalidName	= -9,	/* Invalid driver name						*/
    245 	grNoMem			= -10,	/* Not enough memory to perform operation	*/
    246 	grNoModeSupport	= -11,	/* Select video mode not supported by hard.	*/
    247 	grInvalidFont	= -12,	/* Invalid font data						*/
    248 	grBadFontFile	= -13,	/* File loaded was not a font file			*/
    249 	grFontNotFound	= -14,	/* Font file was not found					*/
    250 	grOldDriver     = -15,	/* Driver file is an old version			*/
    251 	grInvalidDevice	= -16,	/* Invalid device for selected operation	*/
    252 	grInvalidDC		= -17,	/* Invalid device context					*/
    253 	grInvalidCursor	= -18,	/* Invalid cursor file						*/
    254 	grCursorNotFound= -19,	/* Cursor file was not found				*/
    255 	grInvalidIcon	= -20,	/* Invalid icon file						*/
    256 	grIconNotFound	= -21,	/* Icon file was not found					*/
    257 	grInvalidBitmap = -22,	/* Invalid bitmap file						*/
    258 	grBitmapNotFound= -23,	/* Bitmap file was not found				*/
    259 	grZbufferTooBig	= -24,	/* Zbuffer allocation is too large			*/
    260 	grNewFontFile	= -25,	/* Only Windows 2.x font files supported	*/
    261 	grNoDoubleBuff  = -26,	/* Double buffering is not available		*/
    262 	grNoHardwareBlt	= -28,	/* No hardware bitBlt for OffscreenDC		*/
    263 	grNoOffscreenMem= -29,	/* No available offscreen memory			*/
    264 	grInvalidPF		= -30,	/* Invalid pixel format for memory DC		*/
    265 
    266 	grLastError		= -31,	/* Last error number in list				*/
    267 	} MGL_errorType;
    268 
    269 #define	MGL_CLIPON		true
    270 #define	MGL_CLIPOFF		false
    271 
    272 /* Color mapped modes */
    273 
    274 typedef enum {
    275 	MGL_CMAP_MODE,					/* Normal Color mapped mode 	*/
    276 	MGL_DITHER_RGB_MODE,			/* 24 bit RGB halftone dithered	*/
    277 	} MGL_colorModes;
    278 
    279 /* Standard colors - this is the standard set of colors for the IBM PC. The
    280  * default palette will have been programmed to contain these values when a
    281  * graphics modes is started. If the palette has been changed, they will
    282  * not correspond to the actual colors on the screen. Under a Windowing
    283  * manage environment these colors will also not be setup by default.
    284  */
    285 
    286 enum MGL_COLORS {
    287 	MGL_BLACK,						/* dark colors	*/
    288 	MGL_BLUE,
    289 	MGL_GREEN,
    290 	MGL_CYAN,
    291 	MGL_RED,
    292 	MGL_MAGENTA,
    293 	MGL_BROWN,
    294 	MGL_LIGHTGRAY,
    295 	MGL_DARKGRAY,					/* light colors	*/
    296 	MGL_LIGHTBLUE,
    297 	MGL_LIGHTGREEN,
    298 	MGL_LIGHTCYAN,
    299 	MGL_LIGHTRED,
    300 	MGL_LIGHTMAGENTA,
    301 	MGL_YELLOW,
    302 	MGL_WHITE,
    303 	};
    304 
    305 /* Windows standard color indices for 256 color bitmaps. 8,9,246,247 are
    306  * reserved and you should not count on these colors always being the
    307  * same. For 16 color bitmaps, colors 248-255 map to colors 8-15.
    308  */
    309 
    310 enum MGL_WIN_COLORS {
    311 	MGL_WIN_BLACK 			= 0,
    312 	MGL_WIN_DARKRED			= 1,
    313 	MGL_WIN_DARKGREEN		= 2,
    314 	MGL_WIN_DARKYELLOW		= 3,
    315 	MGL_WIN_DARKBLUE		= 4,
    316 	MGL_WIN_DARKMAGENTA		= 5,
    317 	MGL_WIN_DARKCYAN		= 6,
    318 	MGL_WIN_LIGHTGRAY		= 7,
    319 	MGL_WIN_TURQUOISE		= 8,		/* Reserved; dont count on this	*/
    320 	MGL_WIN_SKYBLUE			= 9,		/* Reserved; dont count on this	*/
    321 	MGL_WIN_CREAM			= 246,		/* Reserved; dont count on this	*/
    322 	MGL_WIN_MEDIUMGRAY		= 247,		/* Reserved; dont count on this	*/
    323 	MGL_WIN_DARKGRAY		= 248,
    324 	MGL_WIN_LIGHTRED		= 249,
    325 	MGL_WIN_LIGHTGREEN		= 250,
    326 	MGL_WIN_LIGHTYELLOW		= 251,
    327 	MGL_WIN_LIGHTBLUE		= 252,
    328 	MGL_WIN_LIGHTMAGENTA	= 253,
    329     MGL_WIN_LIGHTCYAN		= 254,
    330 	MGL_WIN_WHITE 			= 255,
    331 	};
    332 
    333 typedef enum {
    334 	MGL_MARKER_SQUARE,
    335 	MGL_MARKER_CIRCLE,
    336 	MGL_MARKER_X,
    337 	} MGL_markerStyleType;
    338 
    339 typedef enum {						/* Write mode operators				*/
    340 	MGL_REPLACE_MODE,				/* Replace mode						*/
    341 	MGL_AND_MODE,					/* AND mode							*/
    342 	MGL_OR_MODE,					/* OR mode							*/
    343 	MGL_XOR_MODE,					/* XOR mode							*/
    344 	} MGL_writeModeType;
    345 
    346 typedef enum {
    347 	MGL_BITMAP_SOLID,
    348 	MGL_BITMAP_OPAQUE,
    349 	MGL_BITMAP_TRANSPARENT,
    350 	MGL_PIXMAP,
    351 	} MGL_fillStyleType;
    352 
    353 typedef enum {
    354 	MGL_LINE_PENSTYLE,				/* Line drawn in current pen style	*/
    355 	MGL_LINE_STIPPLE,				/* Line drawn with current stipple	*/
    356 	} MGL_lineStyleType;
    357 
    358 typedef enum {
    359 	MGL_CONVEX_POLYGON,				/* Monotone vertical polygon		*/
    360 	MGL_COMPLEX_POLYGON,			/* Non-Simple polygons				*/
    361 	MGL_AUTO_POLYGON,				/* Auto detect the polygon type		*/
    362 	} MGL_polygonType;
    363 
    364 /* Text manipulation defines */
    365 
    366 typedef enum {
    367 	MGL_LEFT_TEXT		=	0,		/* Justify from left				*/
    368 	MGL_TOP_TEXT		=	0,		/* Justify from top					*/
    369 	MGL_CENTER_TEXT		=	1,		/* Center the text					*/
    370 	MGL_RIGHT_TEXT		=	2,		/* Justify from right				*/
    371 	MGL_BOTTOM_TEXT		=	2,		/* Justify from bottom				*/
    372 	MGL_BASELINE_TEXT	=	3,		/* Justify from the baseline		*/
    373 	} MGL_textJustType;
    374 
    375 typedef enum {
    376 	MGL_LEFT_DIR		=	0,		/* Text goes to left				*/
    377 	MGL_UP_DIR			=	1,		/* Text goes up						*/
    378 	MGL_RIGHT_DIR		=	2,		/* Text goes right					*/
    379 	MGL_DOWN_DIR		=	3,		/* Text goes down					*/
    380 	} MGL_textDirType;
    381 
    382 /* Font types */
    383 
    384 typedef enum {
    385 	MGL_VECTORFONT = 1,				/* Vector font						*/
    386 	MGL_FIXEDFONT,					/* Fixed width bitmap font			*/
    387 	MGL_PROPFONT,					/* Proportional width bitmap font	*/
    388 	} MGL_fontType;
    389 
    390 /* Palette rotation directions */
    391 
    392 typedef enum {
    393 	MGL_ROTATE_UP,					/* Rotate the palette values up		*/
    394 	MGL_ROTATE_DOWN,				/* Rotate the palette values down	*/
    395 	} MGL_palRotateType;
    396 
    397 /* Border drawing routine styles */
    398 
    399 typedef enum {
    400 	MGL_BDR_INSET,					/* Interior is inset into screen	*/
    401 	MGL_BDR_OUTSET,					/* Interior is outset from screen	*/
    402 	MGL_BDR_OUTLINE,				/* Border is 3d outline				*/
    403 	} MGL_bdrStyleType;
    404 
    405 /* Standard display driver names 	*/
    406 
    407 #define	MGL_VGA4NAME		"VGA4.DRV"		/* Standard VGA drivers			*/
    408 #define	MGL_VGA8NAME		"VGA8.DRV"
    409 #define	MGL_VGAXNAME		"VGAX.DRV"
    410 
    411 #define	MGL_SVGA4NAME		"SVGA4.DRV"		/* Generic SuperVGA drivers		*/
    412 #define	MGL_SVGA8NAME		"SVGA8.DRV"
    413 #define	MGL_SVGA16NAME		"SVGA16.DRV"
    414 #define	MGL_SVGA24NAME		"SVGA24.DRV"
    415 #define	MGL_SVGA32NAME		"SVGA32.DRV"
    416 
    417 #define	MGL_LINEAR8NAME		"LINEAR8.DRV"	/* Linear framebuffer drivers	*/
    418 #define	MGL_LINEAR16NAME	"LINEAR16.DRV"
    419 #define	MGL_LINEAR24NAME	"LINEAR24.DRV"
    420 #define	MGL_LINEAR32NAME	"LINEAR32.DRV"
    421 
    422 #define	MGL_ACCEL8NAME		"ACCEL8.DRV"	/* VBE/AF Accelerated drivers	*/
    423 #define	MGL_ACCEL16NAME		"ACCEL16.DRV"
    424 #define	MGL_ACCEL24NAME		"ACCEL24.DRV"
    425 #define	MGL_ACCEL32NAME		"ACCEL32.DRV"
    426 
    427 #define	MGL_DDRAW8NAME		"DDRAW8.DRV"	/* DirectDraw drivers			*/
    428 #define	MGL_DDRAW16NAME		"DDRAW16.DRV"
    429 #define	MGL_DDRAW24NAME		"DDRAW24.DRV"
    430 #define	MGL_DDRAW32NAME		"DDRAW32.DRV"
    431 
    432 /* Standard memory driver names 	*/
    433 
    434 #define	MGL_PACKED1NAME		"PACK1.DRV"
    435 #define	MGL_PACKED4NAME		"PACK4.DRV"
    436 #define	MGL_PACKED8NAME		"PACK8.DRV"
    437 #define	MGL_PACKED16NAME	"PACK16.DRV"
    438 #define	MGL_PACKED24NAME	"PACK24.DRV"
    439 #define	MGL_PACKED32NAME	"PACK32.DRV"
    440 
    441 /* Standard bitmap names	*/
    442 
    443 #define	MGL_EMPTY_FILL	_MGL_getEmptyPat()
    444 #define	MGL_GRAY_FILL	_MGL_getGrayPat()
    445 #define	MGL_SOLID_FILL	_MGL_getSolidPat()
    446 
    447 /* Event message masks for keyDown events */
    448 
    449 #define	EVT_ASCIIMASK	0x00FF	/* Ascii code of key pressed			*/
    450 #define	EVT_SCANMASK	0xFF00	/* Scan code of key pressed				*/
    451 #define	EVT_COUNTMASK	0x7FFF0000L		/* Count for KEYREPEAT's		*/
    452 
    453 #define	EVT_asciiCode(m)	( (uchar) (m & EVT_ASCIIMASK) )
    454 #define	EVT_scanCode(m)		( (uchar) ( (m & EVT_SCANMASK) >> 8 ) )
    455 #define	EVT_repeatCount(m)	( (short) ( (m & EVT_COUNTMASK) >> 16 ) )
    456 
    457 /* Event message masks for mouse events */
    458 
    459 #define	EVT_LEFTBMASK	0x0001	/* Left button is bit 0					*/
    460 #define	EVT_RIGHTBMASK	0x0004	/* Right button is bit 1				*/
    461 #define	EVT_BOTHBMASK	0x0005	/* Both left and right together			*/
    462 #define	EVT_ALLBMASK	0x0005	/* All buttons pressed					*/
    463 
    464 /* Modifier masks */
    465 
    466 #define	EVT_LEFTBUT		0x0001	/* Set if left button was down			*/
    467 #define	EVT_RIGHTBUT	0x0002	/* Set if right button was down			*/
    468 #define	EVT_RIGHTSHIFT	0x0008	/* Set if right shift down				*/
    469 #define	EVT_LEFTSHIFT	0x0010	/* Set if left shift down				*/
    470 #define	EVT_CTRLSTATE	0x0020	/* Set if ctrl key down					*/
    471 #define	EVT_ALTSTATE	0x0040	/* Set if alt key down					*/
    472 #define	EVT_LEFTCTRL	0x0080	/* Set if left ctrl key down			*/
    473 #define	EVT_LEFTALT		0x0100	/* Set if left alt key down				*/
    474 #define	EVT_SHIFTKEY	0x0018	/* Any shift key						*/
    475 
    476 /* Event codes */
    477 
    478 #define	EVT_NULLEVT		0x0000	/* A null event							*/
    479 #define	EVT_KEYDOWN		0x0001	/* Key down event						*/
    480 #define	EVT_KEYREPEAT	0x0002	/* Key repeat event						*/
    481 #define	EVT_KEYUP		0x0004	/* Key up event							*/
    482 #define	EVT_MOUSEDOWN	0x0008	/* Mouse down event						*/
    483 #define	EVT_MOUSEUP		0x0010	/* Mouse up event						*/
    484 #define	EVT_MOUSEMOVE	0x0020	/* Mouse movement event					*/
    485 #define	EVT_TIMERTICK	0x0040	/* Timer tick event						*/
    486 #define	EVT_USEREVT		0x0080	/* First user event						*/
    487 
    488 /* Event code masks */
    489 
    490 #define	EVT_KEYEVT		(EVT_KEYDOWN | EVT_KEYREPEAT | EVT_KEYUP)
    491 #define	EVT_MOUSEEVT	(EVT_MOUSEDOWN | EVT_MOUSEUP | EVT_MOUSEMOVE)
    492 #define	EVT_MOUSECLICK	(EVT_MOUSEDOWN | EVT_MOUSEUP)
    493 #define	EVT_EVERYEVT	0xFFFF
    494 
    495 /* Suspend Application callback type codes. This callback is called
    496  * when the user presses one of the corresponding keys indicating that
    497  * they wish to change the active application. The MGL will catch these
    498  * events and if you have registered a callback, will call the callback to
    499  * save the state of the application so that it can be properly restored
    500  * when the user switches back to your application. The MGL takes care of
    501  * all the details about saving and restoring the state of the hardware,
    502  * and all your application needs to do is save its own state so that you can
    503  * re-draw the application screen upon re-activation.
    504  *
    505  * NOTE: Your application suspend callback may get called twice with the
    506  *		 MGL_DEACTIVATE flag in order to test whether the switch should
    507  *		 occur (under both DirectDraw and WinDirect fullscreen modes).
    508  *
    509  * NOTE: When your callback is called with the MGL_DEACTIVATE flag, you
    510  *		 cannot assume that you have access to the display memory surfaces
    511  *		 as they may have been lost by the time your callback has been called.
    512  */
    513 
    514 #define	MGL_DEACTIVATE	0x0001	/* Application losing active focus		*/
    515 #define	MGL_REACTIVATE	0x0002	/* Application regaining active focus	*/
    516 
    517 /* Return codes from the suspend application callback. The normal value
    518  * to be returned is MGL_SUSPEND_APP and this will cause the app to be
    519  * suspended while back in GDI mode until the app is re-activated again
    520  * by the user.
    521  *
    522  * MGL_NO_DEACTIVATE signals to WinDirect that the application does not want
    523  * to allow switching to occur, and the switch request will be ignored and
    524  * the app will remain in fullscreen mode.
    525  *
    526  * MGL_NO_SUSPEND_APP can be used to tell WinDirect to switch back to the
    527  * desktop, but not to suspend the application. This must be used with
    528  * care as the suspend application callback is then responsible for setting
    529  * a flag in the application that will stop the application from doing any
    530  * rendering to the framebuffer while the application is in GDI mode. This
    531  * return value is useful for games that need to maintain network
    532  * connectivity while the user has temporarily switched back to GDI mode.
    533  */
    534 
    535 #define	MGL_NO_DEACTIVATE	0	/* Dont allow app to be deactivated 	*/
    536 #define	MGL_SUSPEND_APP		1	/* Suspend application until restored	*/
    537 #define	MGL_NO_SUSPEND_APP	2	/* Dont suspend, but allow switch		*/
    538 
    539 /* Here we define the structures used to represent points and rectangles */
    540 
    541 typedef struct {
    542 	m_int	x,y;
    543 	} point_t;
    544 
    545 typedef	struct {
    546 	m_int	left;
    547 	m_int	top;
    548 	m_int	right;
    549 	m_int	bottom;
    550 	} rect_t;
    551 
    552 /* All colors are represented as longs by the library. This allows
    553  * code to work correctly with up to 24 bit color device drivers. The
    554  * device drivers themselves expect the color to be a color index if in
    555  * a color mapped mode, or a 15/16/24 bit RGB tuple in a hicolor or truecolor
    556  * mode. You can use the appropriate routines to pack and unpack
    557  * colors into the color_t format.
    558  */
    559 
    560 typedef	ulong		color_t;
    561 
    562 /* Define the value used to clear the software ZBuffer. The MGL always uses
    563  * a > operator for the z compare, and the smallest value is 0.
    564  */
    565 
    566 #define	MGL_ZCLEARVAL	0
    567 
    568 /* Structures for passing vertex information to polygon rendering routines.
    569  * All fixed point coordinates are passed in 16.16 signed fixed point
    570  * format, while zbuffer coordinates are passed in 4.28 signed fixed point
    571  * format. The sign bit is used purely for overflow and arithmetic
    572  * internally, and all user passed zbuffer values should be greater than
    573  * 0. All shaded rendering routines either take a color index in 8.16 fixed
    574  * point format (range 0-255.9) or separate RGB components in 8.16 fixed
    575  * point format (range 0-255.9).
    576  */
    577 
    578 #ifdef	__FX_FIXED_H
    579 #define	fix32_t			FXFixed
    580 #else
    581 typedef	long			fix32_t;
    582 #endif
    583 typedef	fix32_t			fxcolor_t;
    584 typedef	long			zfix32_t;
    585 
    586 typedef	struct {
    587 	fix32_t x,y;
    588 	} fxpoint_t;
    589 
    590 typedef	struct {
    591 	fxcolor_t	r,g,b;
    592 	} fxrgb_t;
    593 
    594 typedef struct {
    595 	fix32_t		w,s,t;
    596 	} fxtex_t;
    597 
    598 typedef	struct {
    599 	fxcolor_t	c;
    600 	fxpoint_t   p;
    601 	} fxpointc_t;
    602 
    603 typedef	struct {
    604 	fxrgb_t		c;
    605 	fxpoint_t	p;
    606 	} fxpointrgb_t;
    607 
    608 typedef	struct {
    609 	fxpoint_t	p;
    610 	zfix32_t	z;
    611 	} fxpointz_t;
    612 
    613 typedef	struct {
    614 	fxcolor_t	c;
    615 	fxpoint_t	p;
    616 	zfix32_t	z;
    617 	} fxpointcz_t;
    618 
    619 typedef	struct {
    620 	fxrgb_t		c;
    621 	fxpoint_t	p;
    622 	zfix32_t	z;
    623 	} fxpointrgbz_t;
    624 
    625 /* Macros to convert between integer and 32 bit fixed point format */
    626 
    627 #define	MGL_FIX_1			0x10000L
    628 #define	MGL_FIX_2			0x20000L
    629 #define	MGL_FIX_HALF		0x08000L
    630 #define	MGL_TOFIX(i)		((long)(i) << 16)
    631 #define MGL_FIXTOINT(f)		((m_int)((f) >> 16))
    632 #define	MGL_FIXROUND(f) 	((m_int)(((f) + MGL_FIX_HALF) >> 16))
    633 
    634 #define	MGL_ZFIX_1			0x10000000L
    635 #define	MGL_ZFIX_HALF		0x08000000L
    636 #define MGL_FIXTOZ(i)		((i) << 12)
    637 #define	MGL_ZTOFIX(i)		((i) >> 12)
    638 #define	MGL_TOZFIX(i)		((long)(i) << 28)
    639 #define MGL_ZFIXTOINT(f)	((m_int)((f) >> 28))
    640 #define	MGL_ZFIXROUND(f) 	((m_int)(((f) + MGL_ZFIX_HALF) >> 28))
    641 
    642 /* Region structure */
    643 
    644 #ifdef	BUILD_MGL
    645 struct _span_t;
    646 typedef	struct _span_t	span_t;
    647 #else
    648 typedef void		span_t;
    649 #endif
    650 
    651 typedef struct {
    652 	rect_t      rect;			/* Bounding rectangle for region		*/
    653 	span_t		*spans;			/* Start of span list for region		*/
    654 	} region_t;
    655 
    656 /* Palette entry structure	*/
    657 
    658 typedef struct {
    659 	uchar	blue;				/* Blue component of color				*/
    660 	uchar	green;				/* Green component of color				*/
    661 	uchar	red;				/* Blue component of color				*/
    662 	uchar	alpha;				/* Alpha or alignment byte				*/
    663 	} palette_t;
    664 
    665 /* Maximum value for each palette entry component */
    666 
    667 #define	PALMAX		255				/* Max value for palette components	*/
    668 
    669 /* Pixel format structure */
    670 
    671 typedef struct {
    672 	uchar	redMask,greenMask;		/* Mask values for pixels			*/
    673 	uchar	blueMask,rsvdMask;
    674 	m_int	redPos,redAdjust;		/* Red position and adjustment		*/
    675 	m_int	greenPos,greenAdjust;	/* Green position and adjustment	*/
    676 	m_int	bluePos,blueAdjust;		/* Blue position and adjustment		*/
    677 	m_int	rsvdPos,rsvdAdjust;		/* Reserved position and adjustment */
    678 	} pixel_format_t;
    679 
    680 /* Structure to hold arc coordinate information */
    681 
    682 typedef struct {
    683 	m_int	x,y;					/* Centre point of the arc			*/
    684 	m_int	startX,startY;			/* Starting point on arc			*/
    685 	m_int	endX,endY;				/* Ending point on arc				*/
    686 	} arc_coords_t;
    687 
    688 /* Mouse cursor structure */
    689 
    690 typedef	struct {
    691 	ulong		xorMask[32];
    692 	ulong		andMask[32];
    693 	m_int		xHotSpot;
    694 	m_int		yHotSpot;
    695 	} cursor_t;
    696 
    697 /* Bitmap structure - always packed pixel DIB format */
    698 
    699 typedef struct {
    700 	m_int		width;				/* Width of bitmap in pixels		*/
    701 	m_int		height;				/* Height of bitmap in pixels		*/
    702 	m_int		bitsPerPixel;		/* Pixel width						*/
    703 	m_int		bytesPerLine;		/* Bytes per line value for surface */
    704 	uchar		*surface;			/* Pointer to bitmap surface		*/
    705 	palette_t	*pal;				/* Palette (NULL if not loaded)		*/
    706 	pixel_format_t *pf;				/* Pixel format (NULL if none)		*/
    707 
    708 	/* ... palette, pixel format and bitmap data are store contiguously */
    709 	} bitmap_t;
    710 
    711 /* Icon structure - can be 32x23, 64x64 or in fact any size */
    712 
    713 typedef struct {
    714 	m_int		byteWidth;			/* Byte with for AND mask			*/
    715 	uchar		*andMask;			/* Hold punch mask for icon			*/
    716 	bitmap_t	xorMask;			/* XOR mask for the icon			*/
    717 
    718 	/* ... AND mask and bitmap structure are stored contiguously */
    719 	} icon_t;
    720 
    721 /* Default cursor name */
    722 
    723 #define	MGL_DEF_CURSOR		_MGL_getDefCursor()
    724 
    725 /* Generic Font structure */
    726 
    727 #define	_MGL_FNAMESIZE		58
    728 
    729 typedef struct {
    730 	char			name[_MGL_FNAMESIZE];/* Name of the font			*/
    731 	short			fontType;		/* Type of font						*/
    732 	short			maxWidth;		/* Maximum character width			*/
    733 	short			maxKern;		/* Maximum character kern			*/
    734 	short			fontWidth;		/* Font width						*/
    735 	short			fontHeight;		/* Font height						*/
    736 	short			ascent;			/* Font ascent value				*/
    737 	short			descent;		/* Font descent value				*/
    738 	short			leading;		/* Font leading value				*/
    739 	} font_t;
    740 
    741 /* Character and font metrics structure */
    742 
    743 typedef struct {
    744 	m_int			width;			/* Width of character or font		*/
    745 	m_int			fontWidth;		/* Character width (tightest fit)	*/
    746 	m_int			fontHeight;		/* Height of the font				*/
    747 	m_int			ascent;			/* Ascent value						*/
    748 	m_int			descent;		/* Descent value					*/
    749 	m_int			leading;		/* Leading value					*/
    750 	m_int			kern;			/* Kern value						*/
    751 	} metrics_t;
    752 
    753 /* Text settings structure */
    754 
    755 typedef struct {
    756 	m_int			horizJust;		/* Horizontal justfication			*/
    757 	m_int			vertJust;		/* Vertical justification			*/
    758 	m_int			dir;			/* Text drawing direction			*/
    759 	m_int 			szNumerx;		/* Text x size numerator			*/
    760 	m_int 			szNumery;		/* Text y size numerator			*/
    761 	m_int			szDenomx;		/* Text x size denominator			*/
    762 	m_int			szDenomy;		/* Text y size denominator			*/
    763 	m_int			spaceExtra;		/* Space extra term					*/
    764 	font_t 			*font;			/* Currently selected font			*/
    765 	} text_settings_t;
    766 
    767 /* Macros to access the (left,top) and (right,bottom) points of a
    768  * rectangle.
    769  */
    770 
    771 #define	MGL_leftTop(r)		(((point_t *) &(r))[0])
    772 #define	MGL_rightBottom(r)	(((point_t *) &(r))[1])
    773 
    774 typedef uchar	pattern_t[8];
    775 typedef color_t	pixpattern_t[8][8];
    776 
    777 /* Attributes structure */
    778 
    779 typedef struct {
    780 	color_t			color;			/* Foreground color					*/
    781 	color_t			backColor;		/* Background color					*/
    782 	m_int			colorMode;		/* Current color mode				*/
    783 	m_int			markerSize;		/* Size of markers in pixels		*/
    784 	m_int			markerStyle;	/* Style of markers					*/
    785 	color_t			markerColor;	/* Color to draw markers in			*/
    786 	color_t			bdrBright;		/* Border bright color				*/
    787 	color_t			bdrDark;		/* Border dark color				*/
    788 	point_t			CP;				/* Graphics pen position			*/
    789 	m_int			writeMode;		/* Scan conversion write mode op.	*/
    790 	m_int			penStyle;		/* Pen style						*/
    791 	m_int			penHeight;		/* Height of pen					*/
    792 	m_int			penWidth;		/* Width of pen						*/
    793 	pattern_t		penPat;			/* Pattern for pen					*/
    794 	pixpattern_t	penPixPat;		/* Pixmap pattern for pen			*/
    795 	m_int			lineStyle;		/* Line style						*/
    796 	ushort			lineStipple;	/* Line stipple						*/
    797 	m_uint			stippleCount;	/* Current line stipple count		*/
    798 	rect_t			viewPort;		/* Viewport dimensions				*/
    799 	point_t			viewPortOrg;	/* Logical viewport origin			*/
    800 	rect_t			clipRect;		/* Clipping rectangle dimensions	*/
    801 	m_int			clip;			/* Is clipping on?					*/
    802 	m_int			polyType;		/* Polygon drawing type				*/
    803 	text_settings_t	ts;				/* Text drawing attributes			*/
    804 	} attributes_t;
    805 
    806 /* Mode specific format information. This structrure can be used by
    807  * the device driver to build tables of values for all supported modes
    808  */
    809 
    810 typedef struct {
    811 	m_int	xRes;			/* Device x resolution - 1					*/
    812 	m_int	yRes;			/* Device y resolution - 1					*/
    813 	m_int	bitsPerPixel;	/* Number of bits per pixel					*/
    814 	m_int	numberOfPlanes;	/* Number of planes in image				*/
    815 	color_t	maxColor;		/* Maximum number of colors - 1				*/
    816 	m_int	maxPage;		/* Maximum number of video pages - 1		*/
    817 	m_int	bytesPerLine;	/* Number of bytes in a line				*/
    818 	m_int	aspectRatio;	/* Mode aspect ratio (horiz/vert * 1000)	*/
    819 	long	pageSize;		/* Number of bytes in a page				*/
    820 	m_int	scratch1;		/* Scratch pad value 1						*/
    821 	m_int	scratch2;		/* Scratch pad value 2						*/
    822 	char    redMaskSize;            /* Size of direct color red mask    */
    823 	char    redFieldPosition;       /* Bit posn of lsb of red mask      */
    824 	char    greenMaskSize;          /* Size of direct color green mask  */
    825 	char    greenFieldPosition;     /* Bit posn of lsb of green mask    */
    826 	char    blueMaskSize;           /* Size of direct color blue mask   */
    827 	char    blueFieldPosition;      /* Bit posn of lsb of blue mask     */
    828 	char	rsvdMaskSize;			/* Size of reserved mask			*/
    829 	char	rsvdFieldPosition;		/* Bit posn of reserved mask		*/
    830 	} gmode_t;
    831 
    832 /* Public Device Context Structure. The 'surface' member along with the
    833  * gmode_t information block, provides direct access to the active
    834  * display surface for user applications. The MGL virtualises the surface
    835  * in SuperVGA modes that dont have a real linear framebuffer.
    836  */
    837 
    838 typedef struct {
    839 	attributes_t a;			/* Active device attributes					*/
    840 	void	*surface;		/* Pointer to active device surface			*/
    841 	void	*zbuffer;		/* Pointer to Z-buffer if allocated			*/
    842 	m_int	zbits;			/* Bits per zbuffer element					*/
    843 	m_int   zwidth;			/* Width of the zbuffer in pixels			*/
    844 	gmode_t	mi;				/* Mode specific information block			*/
    845 	pixel_format_t pf;		/* Current pixel format for device context	*/
    846 	color_t	*colorTab;		/* Color lookup table cache					*/
    847 	color_t	*shadeTab;		/* Currently active shade table				*/
    848 	m_int	bankOffset;		/* Offset of starting bank number			*/
    849 
    850 	/* Remainder of Device Context structure is private and internal	*/
    851 	} publicDevCtx_t;
    852 
    853 #ifndef	BUILD_MGL
    854 typedef publicDevCtx_t			MGLDC;
    855 #else
    856 struct internalDevCtx_t;
    857 typedef struct internalDevCtx_t	MGLDC;
    858 #endif
    859 
    860 typedef	struct {
    861 	ulong		which;			/* Which window for window manager code	*/
    862 	m_uint		what;			/* Event code							*/
    863 	ulong		when;			/* Clock ticks since midnight			*/
    864 	m_int		where_x;		/* Mouse location 						*/
    865 	m_int		where_y;
    866 	ulong		message;		/* Event specific message				*/
    867 	ulong		modifiers;		/* Modifier flags						*/
    868 	m_int		next;   		/* Next event in queue					*/
    869 	m_int		prev;			/* Previous event in queue				*/
    870 	} event_t;
    871 
    872 /* Structure containing file I/O functions allowing the user application to
    873  * completely replace the MGL's file I/O functions with their own. This
    874  * allows the app to store all MGL related files in a single large file,
    875  * with encryption or compression is desired. By default normal file I/O
    876  * functions will be used.
    877  */
    878 
    879 typedef struct {
    880 	FILE *	(*fopen)(const char *filename,const char *mode);
    881 	int 	(*fclose)(FILE *f);
    882 	int 	(*fseek)(FILE *f,long offset,int whence);
    883 	long 	(*ftell)(FILE *f);
    884 	size_t	(*fread)(void *ptr,size_t size,size_t n,FILE *f);
    885 	size_t	(*fwrite)(const void *ptr,size_t size,size_t n,FILE *f);
    886 	} fileio_t;
    887 
    888 /* Define the flags for the types of direct surface access provided */
    889 
    890 #define	MGL_NO_ACCESS		0x0		/* Surface cannot be accessed		*/
    891 #define	MGL_VIRTUAL_ACCESS	0x1		/* Surface is virtualised 			*/
    892 #define	MGL_LINEAR_ACCESS	0x2		/* Surface can be linearly accessed	*/
    893 #define	MGL_SURFACE_FLAGS	0x3
    894 
    895 /* Define the flags for the types of direct zbuffer access provided */
    896 
    897 #define	MGL_NO_ZACCESS		0x0		/* Zbuffer cannot be accessed		*/
    898 #define	MGL_VIRTUAL_ZACCESS	0x4		/* Zbuffer is virtualised in 		*/
    899 #define	MGL_LINEAR_ZACCESS	0x8		/* Zbuffer can be linearly accessed	*/
    900 #define	MGL_ZBUFFER_FLAGS	0xC
    901 
    902 /* Define the flags for the types of hardware acceleration supported by
    903  * the device context. This will allow the application to tailor the use of
    904  * MGL functions depending upon whether specific hardware support is
    905  * available. Hence applications can use specialised software rendering
    906  * support if the desired hardware support is not available.
    907  *
    908  * NOTE: If the hardware flags are not MGL_HW_NONE, you *must* call
    909  *		 the MGL_beginDirectAccess() and MGL_endDirectAccess() functions
    910  *		 before and after any custom code that does direct framebuffer
    911  *		 rendering!!
    912  *
    913  *		 This is not necessary for non-accelerated device context, so you
    914  *		 might want to optimise these calls out if there is no hardware
    915  *		 acceleration support.
    916  */
    917 
    918 #define	MGL_HW_NONE			0x0000	/* No hardware acceleration			*/
    919 #define	MGL_HW_LINE			0x0010	/* Hardware line drawing			*/
    920 #define	MGL_HW_STIPPLE_LINE	0x0020	/* Hardware stippled line drawing	*/
    921 #define	MGL_HW_POLY			0x0040	/* Hardware polygon filling			*/
    922 #define	MGL_HW_RECT			0x0080	/* Hardware rectangle fill			*/
    923 #define	MGL_HW_PATT_RECT	0x0100	/* Hardware pattern rectangle fill	*/
    924 #define	MGL_HW_CLRPATT_RECT	0x0200	/* Hardware color pattern fill		*/
    925 #define	MGL_HW_SCR_BLT		0x0400	/* Hardware screen/screen bitBlt	*/
    926 #define	MGL_HW_SRCTRANS_BLT	0x0800	/* Hardware source transparent blt	*/
    927 #define	MGL_HW_DSTTRANS_BLT	0x1000	/* Hardware dest. transparent blt	*/
    928 #define	MGL_HW_MONO_BLT		0x2000	/* Hardware monochrome blt			*/
    929 #define	MGL_HW_CLIP			0x4000	/* Hardware clipping				*/
    930 #define	MGL_HW_FLAGS		0xFFF0
    931 
    932 #ifdef	__cplusplus
    933 extern "C" {			/* Use "C" linkage when in C++ mode	*/
    934 #endif
    935 
    936 /*------------------------- Function Prototypes ---------------------------*/
    937 
    938 /*---------------------------------------------------------------------------
    939  * Routines bound to a specific device context. These routines all take
    940  * an MGLDC as a parmeter for the context to work with and hence dont work
    941  * with the current context. If however the context passed is the currently
    942  * active context, all changes to that context are reflected in the
    943  * currently active context as well.
    944  *-------------------------------------------------------------------------*/
    945 
    946 /* Environment detection and initialisation */
    947 
    948 m_int 	MGLAPI MGL_registerDriver(const char *name,void *driver);
    949 void	MGLAPI MGL_unregisterAllDrivers(void);
    950 void	MGLAPI MGL_registerAllDispDrivers(bool useLinear,bool useDirectDraw,bool useWinDirect);
    951 void	MGLAPI MGL_registerAllMemDrivers(void);
    952 void 	MGLAPI MGL_detectGraph(m_int *driver,m_int *mode);
    953 uchar *	MGLAPI MGL_availableModes(void);
    954 m_int	MGLAPI MGL_availablePages(m_int mode);
    955 m_int	MGLAPI MGL_modeResolution(m_int mode,m_int *xRes,m_int *yRes,m_int *bitsPerPixel);
    956 bool	MGLAPI MGL_isDisplayDC(MGLDC *dc);
    957 bool	MGLAPI MGL_isWindowedDC(MGLDC *dc);
    958 bool	MGLAPI MGL_isMemoryDC(MGLDC *dc);
    959 void 	MGLAPI MGL_exit(void);
    960 void 	MGLAPI MGL_setBufSize(unsigned size);
    961 void	MGLAPI MGL_fatalError(const char *msg);
    962 m_int 	MGLAPI MGL_result(void);
    963 void	MGLAPI MGL_setResult(m_int result);
    964 const char * MGLAPI MGL_errorMsg(m_int err);
    965 const char * MGLAPI MGL_modeName(m_int mode);
    966 const char * MGLAPI MGL_modeDriverName(m_int mode);
    967 const char * MGLAPI MGL_driverName(m_int driver);
    968 m_int	MGLAPI MGL_getDriver(MGLDC *dc);
    969 m_int	MGLAPI MGL_getMode(MGLDC *dc);
    970 m_int	MGLAPI MGL_surfaceAccessType(MGLDC *dc);
    971 m_int	MGLAPI MGL_zbufferAccessType(MGLDC *dc);
    972 long	MGLAPI MGL_getHardwareFlags(MGLDC *dc);
    973 void 	MGLAPI MGL_defaultAttributes(MGLDC *dc);
    974 void 	MGLAPI MGL_makeSubDC(MGLDC *dc,m_int left,m_int top,m_int right,m_int bottom);
    975 
    976 /* Viewport and clip rectangle manipulation bound to a specific DC */
    977 
    978 void 	MGLAPI MGL_setViewportDC(MGLDC *dc,rect_t view);
    979 void	MGLAPI MGL_setRelViewportDC(MGLDC *dc,rect_t view);
    980 void 	MGLAPI MGL_getViewportDC(MGLDC *dc,rect_t *view);
    981 void 	MGLAPI MGL_setViewportOrgDC(MGLDC *dc,point_t org);
    982 void	MGLAPI MGL_getViewportOrgDC(MGLDC *dc,point_t *org);
    983 void	MGLAPI MGL_globalToLocalDC(MGLDC *dc,point_t *p);
    984 void	MGLAPI MGL_localToGlobalDC(MGLDC *dc,point_t *p);
    985 m_int 	MGLAPI MGL_maxxDC(MGLDC *dc);
    986 m_int 	MGLAPI MGL_maxyDC(MGLDC *dc);
    987 void 	MGLAPI MGL_setClipRectDC(MGLDC *dc,rect_t clip);
    988 void 	MGLAPI MGL_getClipRectDC(MGLDC *dc,rect_t *clip);
    989 void 	MGLAPI MGL_setClipModeDC(MGLDC *dc,bool mode);
    990 bool 	MGLAPI MGL_getClipModeDC(MGLDC *dc);
    991 
    992 /* Color and palette manipulation */
    993 
    994 color_t	MGLAPI MGL_realColor(MGLDC *dc,m_int color);
    995 color_t	MGLAPI MGL_rgbColor(MGLDC *dc,uchar R,uchar G,uchar B);
    996 void 	MGLAPI MGL_setPaletteEntry(MGLDC *dc,m_int entry,uchar red,uchar green,uchar blue);
    997 void 	MGLAPI MGL_getPaletteEntry(MGLDC *dc,m_int entry,uchar *red,uchar *green,uchar *blue);
    998 void 	MGLAPI MGL_setPalette(MGLDC *dc,palette_t *pal,m_int numColors,m_int startIndex);
    999 void 	MGLAPI MGL_getPalette(MGLDC *dc,palette_t *pal,m_int numColors,m_int startIndex);
   1000 void	ASMAPI MGL_rotatePalette(MGLDC *dc,m_int numColors,m_int startIndex,m_int direction);
   1001 bool	ASMAPI MGL_fadePalette(MGLDC *dc,palette_t *fullIntensity,m_int numColors,m_int startIndex,uchar intensity);
   1002 void	MGLAPI MGL_realizePalette(MGLDC *dc,m_int numColors,m_int startIndex,m_int waitVRT);
   1003 m_int	MGLAPI MGL_getPaletteSize(MGLDC *dc);
   1004 void	MGLAPI MGL_getDefaultPalette(MGLDC *dc,palette_t *pal);
   1005 void 	MGLAPI MGL_setDefaultPalette(MGLDC *dc);
   1006 #ifndef	MGL_LITE
   1007 bool	MGLAPI MGL_checkIdentityPalette(bool enable);
   1008 void	MGLAPI MGL_mapToPalette(MGLDC *dc,palette_t *pal);
   1009 #endif
   1010 
   1011 /* Generic device context information and manipulation */
   1012 
   1013 bool 	MGLAPI MGL_haveWidePalette(MGLDC *dc);
   1014 m_int	MGLAPI MGL_getBitsPerPixel(MGLDC *dc);
   1015 color_t	MGLAPI MGL_maxColor(MGLDC *dc);
   1016 m_int	MGLAPI MGL_maxPage(MGLDC *dc);
   1017 m_int 	MGLAPI MGL_sizex(MGLDC *dc);
   1018 m_int 	MGLAPI MGL_sizey(MGLDC *dc);
   1019 void 	MGLAPI MGL_getPixelFormat(MGLDC *dc,pixel_format_t *pf);
   1020 void	* MGLAPI MGL_computePixelAddr(MGLDC *dc,int x,int y);
   1021 
   1022 /* Double buffering support */
   1023 
   1024 void	MGLAPI MGL_setActivePage(MGLDC *dc,m_int page);
   1025 m_int	MGLAPI MGL_getActivePage(MGLDC *dc);
   1026 void	MGLAPI MGL_setVisualPage(MGLDC *dc,m_int page,m_int waitVRT);
   1027 m_int	MGLAPI MGL_getVisualPage(MGLDC *dc);
   1028 void	MGLAPI MGL_setDisplayStart(MGLDC *dc,m_int x,m_int y,m_int waitFlag);
   1029 void	MGLAPI MGL_getDisplayStart(MGLDC *dc,m_int *x,m_int *y);
   1030 void	MGLAPI MGL_vSync(MGLDC *dc);
   1031 bool	MGLAPI MGL_doubleBuffer(MGLDC *dc);
   1032 void	MGLAPI MGL_singleBuffer(MGLDC *dc);
   1033 void	MGLAPI MGL_swapBuffers(MGLDC *dc,m_int waitVRT);
   1034 
   1035 /* Zbuffering support */
   1036 
   1037 #ifdef	MGL_3D
   1038 m_int	MGLAPI MGL_getHardwareZBufferDepth(MGLDC *dc);
   1039 bool    ASMAPI MGL_zBegin(MGLDC *dc,m_int zbits);
   1040 bool	MGLAPI MGL_zShareZBuffer(MGLDC *dc,MGLDC *dcShared,m_int zbits);
   1041 #endif
   1042 
   1043 /* Event handling support */
   1044 
   1045 bool 	MGLAPI EVT_getNext(event_t *evt,m_uint mask);
   1046 bool	MGLAPI EVT_peekNext(event_t *evt,m_uint mask);
   1047 bool	MGLAPI EVT_post(ulong which,m_uint what,ulong message,ulong modifiers);
   1048 void	MGLAPI EVT_flush(m_uint mask);
   1049 void 	MGLAPI EVT_halt(event_t *evt,m_uint mask);
   1050 m_int	MGLAPI EVT_setTimerTick(m_int ticks);
   1051 
   1052 /*---------------------------------------------------------------------------
   1053  * Routines bound to the currently active context. All these routines work
   1054  * with the currently active context and do not reflect any changes made
   1055  * to the global context to the original user supplied context (because it
   1056  * may be cached). The cached DC is automatically flushed back to the
   1057  * original DC when a new context is enabled with MGL_makeCurrentDC().
   1058  *
   1059  * Before destroying a DC that is current, make sure you call
   1060  * MGL_makeCurrentDC(NULL) first!
   1061  *-------------------------------------------------------------------------*/
   1062 
   1063 /* Routines to change the active global device context */
   1064 
   1065 MGLDC *	MGLAPI MGL_makeCurrentDC(MGLDC *dc);
   1066 bool	MGLAPI MGL_isCurrentDC(MGLDC *dc);
   1067 
   1068 /* Current device context information and manipulation */
   1069 
   1070 m_int 	MGLAPI MGL_getAspectRatio(void);
   1071 void 	MGLAPI MGL_setAspectRatio(m_int aspectRatio);
   1072 void 	ASMAPI MGL_setColor(color_t color);
   1073 void	MGLAPI MGL_setColorRGB(uchar R,uchar G,uchar B);
   1074 void	MGLAPI MGL_setColorCI(m_int index);
   1075 color_t MGLAPI MGL_getColor(void);
   1076 void 	ASMAPI MGL_setBackColor(color_t color);
   1077 color_t MGLAPI MGL_getBackColor(void);
   1078 color_t	ASMAPI MGL_packColor(pixel_format_t *pf,uchar R,uchar G,uchar B);
   1079 void	MGLAPI MGL_unpackColor(pixel_format_t *pf,color_t color,uchar *R,uchar *G,uchar *B);
   1080 color_t	ASMAPI MGL_packColorRGB(uchar R,uchar G,uchar B);
   1081 void	MGLAPI MGL_unpackColorRGB(color_t color,uchar *R,uchar *G,uchar *B);
   1082 color_t	MGLAPI MGL_defaultColor(void);
   1083 #ifndef	MGL_LITE
   1084 void	MGLAPI MGL_setMarkerSize(m_int size);
   1085 m_int	MGLAPI MGL_getMarkerSize(void);
   1086 void	MGLAPI MGL_setMarkerStyle(m_int style);
   1087 m_int	MGLAPI MGL_getMarkerStyle(void);
   1088 void	MGLAPI MGL_setMarkerColor(color_t color);
   1089 color_t	MGLAPI MGL_getMarkerColor(void);
   1090 void	MGLAPI MGL_setBorderColors(color_t bright,color_t dark);
   1091 void	MGLAPI MGL_getBorderColors(color_t *bright,color_t *dark);
   1092 void 	ASMAPI MGL_setWriteMode(m_int mode);
   1093 m_int 	MGLAPI MGL_getWriteMode(void);
   1094 void 	ASMAPI MGL_setPenStyle(m_int style);
   1095 m_int 	MGLAPI MGL_getPenStyle(void);
   1096 void 	MGLAPI MGL_setLineStyle(m_int style);
   1097 m_int 	MGLAPI MGL_getLineStyle(void);
   1098 void 	ASMAPI MGL_setLineStipple(ushort stipple);
   1099 ushort	MGLAPI MGL_getLineStipple(void);
   1100 void 	ASMAPI MGL_setLineStippleCount(m_uint stippleCount);
   1101 m_uint	MGLAPI MGL_getLineStippleCount(void);
   1102 void 	ASMAPI MGL_setPenBitmapPattern(const pattern_t *pat);
   1103 void 	MGLAPI MGL_getPenBitmapPattern(pattern_t *pat);
   1104 void 	ASMAPI MGL_setPenPixmapPattern(const pixpattern_t *pat);
   1105 void 	MGLAPI MGL_getPenPixmapPattern(pixpattern_t *pat);
   1106 void	MGLAPI MGL_setPenSize(m_int height,m_int width);
   1107 void 	MGLAPI MGL_getPenSize(m_int *height,m_int *width);
   1108 #ifndef	MGL_LITE
   1109 void 	MGLAPI MGL_setColorMapMode(m_int mode);
   1110 m_int	MGLAPI MGL_getColorMapMode(void);
   1111 #endif
   1112 void	MGLAPI MGL_setPolygonType(m_int type);
   1113 m_int	MGLAPI MGL_getPolygonType(void);
   1114 #endif
   1115 void 	MGLAPI MGL_getAttributes(attributes_t *attr);
   1116 void 	MGLAPI MGL_restoreAttributes(attributes_t *attr);
   1117 
   1118 /* Device clearing */
   1119 
   1120 void	ASMAPI MGL_clearDevice(void);
   1121 void 	MGLAPI MGL_clearViewport(void);
   1122 
   1123 /* Viewport and clip rectangle manipulation */
   1124 
   1125 void 	MGLAPI MGL_setViewport(rect_t view);
   1126 void	MGLAPI MGL_setRelViewport(rect_t view);
   1127 void 	MGLAPI MGL_getViewport(rect_t *view);
   1128 void 	MGLAPI MGL_setViewportOrg(point_t org);
   1129 void	MGLAPI MGL_getViewportOrg(point_t *org);
   1130 void	MGLAPI MGL_globalToLocal(point_t *p);
   1131 void	MGLAPI MGL_localToGlobal(point_t *p);
   1132 m_int 	MGLAPI MGL_maxx(void);
   1133 m_int 	MGLAPI MGL_maxy(void);
   1134 void 	MGLAPI MGL_setClipRect(rect_t clip);
   1135 void 	MGLAPI MGL_getClipRect(rect_t *clip);
   1136 void 	MGLAPI MGL_setClipMode(bool mode);
   1137 bool 	MGLAPI MGL_getClipMode(void);
   1138 
   1139 /* Pixel plotting */
   1140 
   1141 void 	MGLAPI MGL_pixelCoord(m_int x,m_int y);
   1142 color_t	MGLAPI MGL_getPixelCoord(m_int x,m_int y);
   1143 void	ASMAPI MGL_beginPixel(void);
   1144 void 	MGLAPI MGL_pixelCoordFast(m_int x,m_int y);
   1145 color_t	MGLAPI MGL_getPixelCoordFast(m_int x,m_int y);
   1146 void	ASMAPI MGL_endPixel(void);
   1147 
   1148 /* Line drawing and clipping */
   1149 
   1150 void 	MGLAPI MGL_moveToCoord(m_int x,m_int y);
   1151 void 	MGLAPI MGL_moveRelCoord(m_int dx,m_int dy);
   1152 void 	MGLAPI MGL_lineToCoord(m_int x,m_int y);
   1153 void 	MGLAPI MGL_lineRelCoord(m_int dx,m_int dy);
   1154 m_int 	MGLAPI MGL_getX(void);
   1155 m_int 	MGLAPI MGL_getY(void);
   1156 void	MGLAPI MGL_getCP(point_t* CP);
   1157 void 	MGLAPI MGL_lineCoord(m_int x1,m_int y1,m_int x2,m_int y2);
   1158 void 	MGLAPI MGL_lineCoordFX(fix32_t x1,fix32_t y1,fix32_t x2,fix32_t y2);
   1159 void	MGLAPI MGL_lineCoordFast(m_int x1,m_int y1,m_int x2,m_int y2);
   1160 void	MGLAPI MGL_lineCoordFastFX(fix32_t x1,fix32_t y1,fix32_t x2,fix32_t y2);
   1161 void    MGLAPI MGL_lineEngine(fix32_t x1,fix32_t y1,fix32_t x2,fix32_t y2,void (ASMAPI *plotPoint)(m_int x,m_int y));
   1162 bool	MGLAPI MGL_clipLineFX(fix32_t *x1,fix32_t *y1,fix32_t *x2,fix32_t *y2,fix32_t left,fix32_t top,fix32_t right,fix32_t bottom);
   1163 #ifndef	MGL_LITE
   1164 void 	ASMAPI MGL_scanLine(m_int y,m_int x1,m_int x2);
   1165 #endif
   1166 
   1167 /* Routines to perform bank switching for banked framebuffers for custom
   1168  * rendering code. The first version is callable only from assembler and
   1169  * requires the new bank value to be passed in the DL register. The second
   1170  * version is callable directly from C. DO NOT CALL THESE FUNCTIONS WHEN
   1171  * RUNNING WITH A LINEAR FRAMEBUFFER!!!
   1172  */
   1173 
   1174 void	_ASMAPI SVGA_setBank(void);
   1175 void	_ASMAPI SVGA_setBankC(int bank);
   1176 
   1177 /* Routines to begin/end direct framebuffer access. You must call these
   1178  * functions is you wish to render directly to a hardware accelerated
   1179  * device surface.
   1180  */
   1181 
   1182 void 	ASMAPI MGL_beginDirectAccess(void);
   1183 void 	ASMAPI MGL_endDirectAccess(void);
   1184 
   1185 /* Routines to begin/end fast rendering of flat shaded lines, scanlines
   1186  * and polygons.
   1187  */
   1188 
   1189 void 	ASMAPI MGL_beginDrawing(void);
   1190 void 	ASMAPI MGL_endDrawing(void);
   1191 
   1192 /* Routines to begin/end fast rendering of smooth shaded lines, scanlines
   1193  * and polygons.
   1194  */
   1195 
   1196 #ifdef	MGL_3D
   1197 void 	ASMAPI MGL_beginShadedDrawing(void);
   1198 void 	ASMAPI MGL_endShadedDrawing(void);
   1199 #endif
   1200 
   1201 /* Routines to begin/end fast rendering of flat shaded, zbuffered lines and
   1202  * polygons.
   1203  */
   1204 
   1205 #ifdef	MGL_3D
   1206 void 	ASMAPI MGL_beginZDrawing(void);
   1207 void 	ASMAPI MGL_endZDrawing(void);
   1208 #endif
   1209 
   1210 /* Routines to begin/end fast rendering of smooth shaded, zbuffered lines and
   1211  * polygons.
   1212  */
   1213 
   1214 #ifdef	MGL_3D
   1215 void 	ASMAPI MGL_beginZShadedDrawing(void);
   1216 void 	ASMAPI MGL_endZShadedDrawing(void);
   1217 #endif
   1218 
   1219 /* Polygon drawing: Note that the following fast polygon routines
   1220  * only work with convex polygons. The integer coordinate versions are
   1221  * provided for compatibility only, and convert the coordinates to fixed
   1222  * point and call the appropriate fixed point routines below.
   1223  */
   1224 
   1225 #ifndef	MGL_LITE
   1226 void	MGLAPI MGL_fillPolygon(m_int count,point_t *vArray,m_int xOffset,m_int yOffset);
   1227 void	MGLAPI MGL_fillPolygonFast(m_int count,point_t *vArray,m_int xOffset,m_int yOffset);
   1228 void    ASMAPI MGL_fillPolygonFX(m_int count,fxpoint_t *vArray,m_int vinc,fix32_t xOffset,fix32_t yOffset);
   1229 void    ASMAPI MGL_fillPolygonFastFX(m_int count,fxpoint_t *vArray,m_int vinc,fix32_t xOffset,fix32_t yOffset);
   1230 #endif
   1231 
   1232 /* 3D rasterization routines */
   1233 
   1234 #ifdef	MGL_3D
   1235 void    MGLAPI MGL_zClearCoord(m_int left,m_int top,m_int right,m_int bottom,zfix32_t clearVal);
   1236 #endif
   1237 
   1238 #ifdef	MGL_FIX3D
   1239 void	ASMAPI MGL_cLineCoordFast(fix32_t x1,fix32_t y1,fix32_t c1,fix32_t x2,fix32_t y2,fix32_t c2);
   1240 void	ASMAPI MGL_rgbLineCoordFast(fix32_t x1,fix32_t y1,fix32_t r1,fix32_t g1,fix32_t b1,fix32_t x2,fix32_t y2,fix32_t r2,fix32_t g2,fix32_t b2);
   1241 void	ASMAPI MGL_zLineCoordFast(fix32_t x1,fix32_t y1,zfix32_t z1,fix32_t x2,fix32_t y2,zfix32_t z2);
   1242 void	ASMAPI MGL_czLineCoordFast(fix32_t x1,fix32_t y1,zfix32_t z1,fix32_t c1,fix32_t x2,fix32_t y2,zfix32_t z2,fix32_t c2);
   1243 void	ASMAPI MGL_rgbzLineCoordFast(fix32_t x1,fix32_t y1,zfix32_t z1,fix32_t r1,fix32_t g1,fix32_t b1,fix32_t x2,fix32_t y2,zfix32_t z2,fix32_t r2,fix32_t g2,fix32_t b2);
   1244 
   1245 void	ASMAPI MGL_triFast(fxpoint_t *v1,fxpoint_t *v2,fxpoint_t *v3,fix32_t xOffset,fix32_t yOffset);
   1246 void	ASMAPI MGL_cTriFast(fxpointc_t *v1,fxpointc_t *v2,fxpointc_t *v3,fix32_t xOffset,fix32_t yOffset);
   1247 void	ASMAPI MGL_rgbTriFast(fxpointrgb_t *v1,fxpointrgb_t *v2,fxpointrgb_t *v3,fix32_t xOffset,fix32_t yOffset);
   1248 void	ASMAPI MGL_zTriFast(fxpointz_t *v1,fxpointz_t *v2,fxpointz_t *v3,fix32_t xOffset,fix32_t yOffset,zfix32_t zOffset);
   1249 void	ASMAPI MGL_czTriFast(fxpointcz_t *v1,fxpointcz_t *v2,fxpointcz_t *v3,fix32_t xOffset,fix32_t yOffset,zfix32_t zOffset);
   1250 void	ASMAPI MGL_rgbzTriFast(fxpointrgbz_t *v1,fxpointrgbz_t *v2,fxpointrgbz_t *v3,fix32_t xOffset,fix32_t yOffset,zfix32_t zOffset);
   1251 
   1252 void	ASMAPI MGL_quadFast(fxpoint_t *v1,fxpoint_t *v2,fxpoint_t *v3,fxpoint_t *v4,fix32_t xOffset,fix32_t yOffset);
   1253 void	ASMAPI MGL_cQuadFast(fxpointc_t *v1,fxpointc_t *v2,fxpointc_t *v3,fxpointc_t *v4,fix32_t xOffset,fix32_t yOffset);
   1254 void	ASMAPI MGL_rgbQuadFast(fxpointrgb_t *v1,fxpointrgb_t *v2,fxpointrgb_t *v3,fxpointrgb_t *v4,fix32_t xOffset,fix32_t yOffset);
   1255 void	ASMAPI MGL_zQuadFast(fxpointz_t *v1,fxpointz_t *v2,fxpointz_t *v3,fxpointz_t *v4,fix32_t xOffset,fix32_t yOffset,zfix32_t zOffset);
   1256 void	ASMAPI MGL_czQuadFast(fxpointcz_t *v1,fxpointcz_t *v2,fxpointcz_t *v3,fxpointcz_t *v4,fix32_t xOffset,fix32_t yOffset,zfix32_t zOffset);
   1257 void	ASMAPI MGL_rgbzQuadFast(fxpointrgbz_t *v1,fxpointrgbz_t *v2,fxpointrgbz_t *v3,fxpointrgbz_t *v4,fix32_t xOffset,fix32_t yOffset,zfix32_t zOffset);
   1258 #endif
   1259 
   1260 /* Routine to set the currently active shade table. In HiColor and TrueColor
   1261  * video modes, you must set a valid shadeTable before you call any of the
   1262  * color index shaded rendering routines (MGL_cTri() etc). These routines
   1263  * will interpolate an index into the current shade table rather than
   1264  * each of the RGB color channels, and the appropriate full RGB color is
   1265  * extracted directly from the shade table. The shade table can be any size,
   1266  * but the application must ensure that the indices passed in are within
   1267  * the range of the current shade table.
   1268  */
   1269 
   1270 #ifdef	MGL_3D
   1271 void	MGLAPI MGL_setShadeTable(color_t *shadeTab);
   1272 #endif
   1273 
   1274 /* Polyline drawing */
   1275 
   1276 #ifndef	MGL_LITE
   1277 void 	MGLAPI MGL_marker(point_t p);
   1278 void	MGLAPI MGL_polyPoint(m_int count,point_t *vArray);
   1279 void 	MGLAPI MGL_polyMarker(m_int count,point_t *vArray);
   1280 void 	MGLAPI MGL_polyLine(m_int count,point_t *vArray);
   1281 #endif
   1282 
   1283 /* Rectangle drawing */
   1284 
   1285 #ifndef	MGL_LITE
   1286 void 	MGLAPI MGL_rectCoord(m_int left,m_int top,m_int right,m_int bottom);
   1287 void 	MGLAPI MGL_fillRectCoord(m_int left,m_int top,m_int right,m_int bottom);
   1288 #endif
   1289 
   1290 /* Scanline color scanning. Thee routines are primitive, and do not perform
   1291  * any clipping or viewport mapping, so can be used to build you own
   1292  * high performance floodfilling routines (see the example file ffill.c
   1293  * for pre-built high speed floodfill routines).
   1294  */
   1295 
   1296 #ifndef	MGL_LITE
   1297 m_int	ASMAPI MGL_scanRightForColor(m_int x,m_int y,color_t color);
   1298 m_int	ASMAPI MGL_scanLeftForColor(m_int x,m_int y,color_t color);
   1299 m_int 	ASMAPI MGL_scanRightWhileColor(m_int x,m_int y,color_t color);
   1300 m_int	ASMAPI MGL_scanLeftWhileColor(m_int x,m_int y,color_t color);
   1301 #endif
   1302 
   1303 /* Psuedo 3D border drawing */
   1304 
   1305 #ifndef	MGL_LITE
   1306 void	MGLAPI MGL_drawBorderCoord(m_int left,m_int top,m_int right,m_int bottom,m_int style,m_int thickness);
   1307 void 	MGLAPI MGL_drawHDivider(m_int y,m_int x1,m_int x2);
   1308 void 	MGLAPI MGL_drawVDivider(m_int x,m_int y1,m_int y2);
   1309 #endif
   1310 
   1311 /* Ellipse drawing */
   1312 
   1313 #ifndef	MGL_LITE
   1314 void	MGLAPI MGL_ellipseArc(rect_t extentRect,m_int startAngle,m_int endAngle);
   1315 void	MGLAPI MGL_ellipseArcCoord(m_int x,m_int y,m_int xradius,m_int yradius,m_int startAngle,m_int endAngle);
   1316 void	ASMAPI MGL_getArcCoords(arc_coords_t *coords);
   1317 void	MGLAPI MGL_ellipse(rect_t extentRect);
   1318 void	MGLAPI MGL_ellipseCoord(m_int x,m_int y,m_int xradius,m_int yradius);
   1319 void	MGLAPI MGL_fillEllipseArc(rect_t extentRect,m_int startAngle,m_int endAngle);
   1320 void	MGLAPI MGL_fillEllipseArcCoord(m_int x,m_int y,m_int xradius,m_int yradius,m_int startAngle,m_int endAngle);
   1321 void	MGLAPI MGL_fillEllipse(rect_t extentRect);
   1322 void	MGLAPI MGL_fillEllipseCoord(m_int x,m_int y,m_int xradius,m_int yradius);
   1323 void	MGLAPI MGL_ellipseEngine(rect_t extentRect,void (ASMAPI *setup)(m_int topY,m_int botY,m_int left,m_int right),void (ASMAPI *set4pixels)(bool inc_x,bool inc_y,bool region1),void (ASMAPI *finished)(void));
   1324 void 	MGLAPI MGL_ellipseArcEngine(rect_t extentRect,m_int startAngle,m_int endAngle,arc_coords_t *ac,void (ASMAPI *plotPoint)(m_int x,m_int y));
   1325 #endif
   1326 
   1327 /* Text attribute manipulation */
   1328 
   1329 #ifndef	MGL_LITE
   1330 void 	MGLAPI MGL_setTextJustify(m_int horiz,m_int vert);
   1331 void 	MGLAPI MGL_getTextJustify(m_int *horiz,m_int *vert);
   1332 void 	MGLAPI MGL_setTextDirection(m_int direction);
   1333 m_int   MGLAPI MGL_getTextDirection(void);
   1334 void	MGLAPI MGL_setTextSize(m_int numerx,m_int denomx,m_int numery,m_int denomy);
   1335 void	MGLAPI MGL_getTextSize(m_int *numerx,m_int *denomx,m_int *numery,m_int *denomy);
   1336 void	MGLAPI MGL_setSpaceExtra(m_int extra);
   1337 m_int	MGLAPI MGL_getSpaceExtra(void);
   1338 void	MGLAPI MGL_setTextSettings(text_settings_t *settings);
   1339 void	MGLAPI MGL_getTextSettings(text_settings_t *settings);
   1340 m_int 	MGLAPI MGL_textHeight(void);
   1341 m_int 	MGLAPI MGL_textWidth(const char *str);
   1342 void	MGLAPI MGL_textBounds(m_int x,m_int y,const char *str,rect_t *bounds);
   1343 m_int	MGLAPI MGL_charWidth(char ch);
   1344 void	MGLAPI MGL_getFontMetrics(metrics_t *metrics);
   1345 void	MGLAPI MGL_getCharMetrics(char ch,metrics_t *metrics);
   1346 m_int	MGLAPI MGL_maxCharWidth(void);
   1347 void	MGLAPI MGL_underScoreLocation(m_int *x,m_int *y,const char *str);
   1348 #endif
   1349 
   1350 /* Text drawing */
   1351 
   1352 #ifndef	MGL_LITE
   1353 void 	MGLAPI MGL_drawStr(const char *str);
   1354 void	MGLAPI MGL_drawStrXY(m_int x,m_int y,const char *str);
   1355 bool	MGLAPI MGL_useFont(font_t *font);
   1356 font_t 	* MGLAPI MGL_getFont(void);
   1357 bool	MGLAPI MGL_vecFontEngine(m_int x,m_int y,const char *str,void (ASMAPI *move)(m_int x,m_int y),void (ASMAPI *draw)(m_int x,m_int y));
   1358 #endif
   1359 
   1360 /* BitBlt support */
   1361 
   1362 void 	MGLAPI MGL_bitBltCoord(MGLDC *dst,MGLDC *src,m_int left,m_int top,m_int right,m_int bottom,m_int dstLeft,m_int dstTop,m_int op);
   1363 void 	MGLAPI MGL_stretchBltCoord(MGLDC *dst,MGLDC *src,m_int left,m_int top,m_int right,m_int bottom,m_int dstLeft,m_int dstTop,m_int dstRight,m_int dstBottom);
   1364 #ifndef	MGL_LITE
   1365 void 	MGLAPI MGL_getDivotCoord(MGLDC *dc,m_int left,m_int top,m_int right,m_int bottom,void *divot);
   1366 void 	MGLAPI MGL_putDivot(MGLDC *dc,void *divot);
   1367 long 	MGLAPI MGL_divotSizeCoord(MGLDC *dc,m_int left,m_int top,m_int right,m_int bottom);
   1368 void 	MGLAPI MGL_putMonoImage(MGLDC *dc,m_int x,m_int y,m_int byteWidth,m_int height,void *image);
   1369 void	MGLAPI MGL_putBitmap(MGLDC *dc,m_int x,m_int y,const bitmap_t *bitmap,m_int op);
   1370 void	MGLAPI MGL_putBitmapSection(MGLDC *dc,m_int left,m_int top,m_int right,m_int bottom,m_int dstLeft,m_int dstTop,const bitmap_t *bitmap,m_int op);
   1371 void	MGLAPI MGL_putBitmapTransparent(MGLDC *dc,m_int x,m_int y,const bitmap_t *bitmap,color_t transparent,bool sourceTrans);
   1372 void	MGLAPI MGL_putBitmapTransparentSection(MGLDC *dc,m_int left,m_int top,m_int right,m_int bottom,m_int dstLeft,m_int dstTop,const bitmap_t *bitmap,color_t transparent,bool sourceTrans);
   1373 void	MGLAPI MGL_putBitmapMask(MGLDC *dc,m_int x,m_int y,const bitmap_t *mask,color_t color);
   1374 void	MGLAPI MGL_stretchBitmap(MGLDC *dc,m_int left,m_int top,m_int right,m_int bottom,const bitmap_t *bitmap);
   1375 void	MGLAPI MGL_putIcon(MGLDC *dc,m_int x,m_int y,const icon_t *icon);
   1376 void 	MGLAPI MGL_transBltCoord(MGLDC *dst,MGLDC *src,m_int left,m_int top,m_int right,m_int bottom,m_int dstLeft,m_int dstTop,color_t transparent,bool sourceTrans);
   1377 #endif
   1378 
   1379 /* Linear offscreen DC BitBlt support */
   1380 
   1381 #ifndef	MGL_LITE
   1382 void 	MGLAPI MGL_bitBltLinCoord(MGLDC *dst,MGLDC *src,ulong srcOfs,m_int dstLeft,m_int dstTop,m_int dstRight,m_int dstBottom,m_int op);
   1383 void 	MGLAPI MGL_transBltLinCoord(MGLDC *dst,MGLDC *src,ulong srcOfs,m_int dstLeft,m_int dstTop,m_int dstRight,m_int dstBottom,color_t transparent,bool sourceTrans);
   1384 #endif
   1385 
   1386 /* Monochrome bitmap manipulation */
   1387 
   1388 #ifndef	MGL_LITE
   1389 void	MGLAPI MGL_drawGlyph(font_t *g,m_int x,m_int y,uchar glyph);
   1390 m_int	MGLAPI MGL_getGlyphWidth(font_t *font,uchar glyph);
   1391 m_int	MGLAPI MGL_getGlyphHeight(font_t *font);
   1392 void 	MGLAPI MGL_rotateGlyph(uchar *dst,uchar *src,m_int *byteWidth,m_int *height,m_int rotation);
   1393 void 	MGLAPI MGL_mirrorGlyph(uchar *dst,uchar *src,m_int byteWidth,m_int height);
   1394 #endif
   1395 
   1396 /* Region management */
   1397 
   1398 #ifndef	MGL_LITE
   1399 region_t * MGLAPI MGL_newRegion(void);
   1400 region_t * MGLAPI MGL_copyRegion(const region_t *s);
   1401 void	MGLAPI MGL_clearRegion(region_t *r);
   1402 void 	MGLAPI MGL_freeRegion(region_t *r);
   1403 void 	MGLAPI MGL_drawRegion(m_int x,m_int y,const region_t *r);
   1404 #endif
   1405 
   1406 /* Region generation primitives */
   1407 
   1408 #ifndef	MGL_LITE
   1409 region_t * MGLAPI MGL_rgnLineCoord(m_int x1,m_int y1,m_int x2,m_int y2,const region_t *pen);
   1410 region_t * MGLAPI MGL_rgnLineCoordFX(fix32_t x1,fix32_t y1,fix32_t x2,fix32_t y2,const region_t *pen);
   1411 /*region_t * MGLAPI MGL_rgnPolygon(m_int count,point_t *vArray);*/
   1412 /*region_t * MGLAPI MGL_rgnPolygonFast(m_int count,point_t *vArray);*/
   1413 region_t * MGLAPI MGL_rgnSolidRectCoord(m_int left,m_int top,m_int right,m_int bottom);
   1414 region_t * MGLAPI MGL_rgnEllipse(rect_t extentRect,const region_t *pen);
   1415 region_t * MGLAPI MGL_rgnEllipseArc(rect_t extentRect,m_int startAngle,m_int endAngle,const region_t *pen);
   1416 void	MGLAPI MGL_rgnGetArcCoords(arc_coords_t *coords);
   1417 region_t * MGLAPI MGL_rgnSolidEllipse(rect_t extentRect);
   1418 region_t * MGLAPI MGL_rgnSolidEllipseArc(rect_t extentRect,m_int startAngle,m_int endAngle);
   1419 #endif
   1420 
   1421 /* Region alegbra */
   1422 
   1423 #ifndef	MGL_LITE
   1424 region_t * MGLAPI MGL_sectRegion(const region_t *r1,const region_t *r2);
   1425 region_t * MGLAPI MGL_sectRegionRect(const region_t *r1,const rect_t *r2);
   1426 bool	MGLAPI MGL_unionRegion(region_t *r1,const region_t *r2);
   1427 bool	MGLAPI MGL_unionRegionRect(region_t *r1,const rect_t *r2);
   1428 bool 	MGLAPI MGL_unionRegionOfs(region_t *r1,const region_t *r2,m_int xOffset,m_int yOffset);
   1429 bool	MGLAPI MGL_diffRegion(region_t *r1,const region_t *r2);
   1430 bool	MGLAPI MGL_diffRegionRect(region_t *r1,const rect_t *r2);
   1431 void	MGLAPI MGL_optimizeRegion(region_t *r);
   1432 void 	MGLAPI MGL_offsetRegion(region_t *r,m_int dx,m_int dy);
   1433 bool	MGLAPI MGL_emptyRegion(const region_t *r);
   1434 bool	MGLAPI MGL_equalRegion(const region_t *r1,const region_t *r2);
   1435 bool	MGLAPI MGL_ptInRegionCoord(m_int x,m_int y,const region_t *r);
   1436 #endif
   1437 
   1438 /* Region traversal */
   1439 
   1440 #ifndef	MGL_LITE
   1441 typedef void (ASMAPI *rgncallback_t)(const rect_t *r);
   1442 
   1443 void 	MGLAPI MGL_traverseRegion(region_t *rgn,rgncallback_t doRect);
   1444 #endif
   1445 
   1446 /* RGB to 8 bit halftone dithering routines */
   1447 
   1448 #ifndef	MGL_LITE
   1449 void 	MGLAPI MGL_getHalfTonePalette(palette_t *pal);
   1450 uchar	MGLAPI MGL_halfTonePixel(m_int x,m_int y,uchar R,uchar G,uchar B);
   1451 #endif
   1452 
   1453 /* Resource loading/unloading */
   1454 
   1455 font_t * MGLAPI MGL_loadFont(const char *fontname);
   1456 bool	MGLAPI MGL_availableFont(const char *fontname);
   1457 void	MGLAPI MGL_unloadFont(font_t *font);
   1458 cursor_t * MGLAPI MGL_loadCursor(const char *cursorName);
   1459 bool	MGLAPI MGL_availableCursor(const char *cursorName);
   1460 void 	MGLAPI MGL_unloadCursor(cursor_t *cursor);
   1461 #ifndef	MGL_LITE
   1462 icon_t * MGLAPI MGL_loadIcon(const char *iconName,bool loadPalette);
   1463 bool	MGLAPI MGL_availableIcon(const char *iconName);
   1464 void	MGLAPI MGL_unloadIcon(icon_t *icon);
   1465 #endif
   1466 
   1467 /* Windows BMP bitmap loading/unloading/saving */
   1468 
   1469 #ifndef	MGL_LITE
   1470 bitmap_t * MGLAPI MGL_loadBitmap(const char *bitmapName,bool loadPalette);
   1471 bool	MGLAPI MGL_availableBitmap(const char *bitmapName);
   1472 void	MGLAPI MGL_unloadBitmap(bitmap_t *bitmap);
   1473 bool	MGLAPI MGL_getBitmapSize(const char *bitmapName,m_int *width,m_int *height,m_int *bitsPerPixel,pixel_format_t *pf);
   1474 bool	MGLAPI MGL_loadBitmapIntoDC(MGLDC *dc,const char *bitmapName,m_int dstLeft,m_int dstTop,bool loadPalette);
   1475 bool	MGLAPI MGL_saveBitmapFromDC(MGLDC *dc,const char *bitmapName,m_int left,m_int top,m_int right,m_int bottom);
   1476 bitmap_t * MGLAPI MGL_getBitmapFromDC(MGLDC *dc,m_int left,m_int top,m_int right,m_int bottom,bool savePalette);
   1477 bitmap_t * MGLAPI MGL_buildMonoMask(bitmap_t *bitmap,color_t transparent);
   1478 #endif
   1479 
   1480 /* PCX bitmap loading/unloading/saving (1/4/8 bpp only) */
   1481 
   1482 #ifndef	MGL_LITE
   1483 bitmap_t * MGLAPI MGL_loadPCX(const char *bitmapName,bool loadPalette);
   1484 bool	MGLAPI MGL_availablePCX(const char *bitmapName);
   1485 bool	MGLAPI MGL_getPCXSize(const char *bitmapName,m_int *width,m_int *height,m_int *bitsPerPixel);
   1486 bool	MGLAPI MGL_loadPCXIntoDC(MGLDC *dc,const char *bitmapName,m_int dstLeft,m_int dstTop,bool loadPalette);
   1487 bool	MGLAPI MGL_savePCXFromDC(MGLDC *dc,const char *bitmapName,m_int left,m_int top,m_int right,m_int bottom);
   1488 #endif
   1489 
   1490 /* Random number generation routines for shorts and longs with full range */
   1491 
   1492 void    ASMAPI MGL_srand(m_uint seed);
   1493 ushort	ASMAPI MGL_random(ushort max);
   1494 ulong	ASMAPI MGL_randoml(ulong max);
   1495 
   1496 /* Mouse support */
   1497 
   1498 bool	MGLAPI MS_available(void);
   1499 void	MGLAPI MS_show(void);
   1500 void	MGLAPI MS_hide(void);
   1501 void	MGLAPI MS_obscure(void);
   1502 void	MGLAPI MS_setCursor(cursor_t *curs);
   1503 void	MGLAPI MS_setCursorColor(color_t color);
   1504 void 	MGLAPI MS_moveTo(m_int x,m_int y);
   1505 void	MGLAPI MS_getPos(m_int *x,m_int *y);
   1506 void	MGLAPI MS_drawCursor(void);
   1507 
   1508 /* Rectangle and Point manipulation */
   1509 
   1510 rect_t 	MGLAPI MGL_defRect(m_int left,m_int top,m_int right,m_int bottom);
   1511 rect_t 	MGLAPI MGL_defRectPt(point_t leftTop,point_t rightBottom);
   1512 bool 	MGLAPI MGL_sectRect(rect_t s1,rect_t s2,rect_t *d);
   1513 bool 	MGLAPI MGL_sectRectCoord(m_int left1,m_int top1,m_int right1,m_int bottom1,m_int left2,m_int top2,m_int right2,m_int bottom2,rect_t *d);
   1514 void 	MGLAPI MGL_unionRect(rect_t s1,rect_t s2,rect_t *d);
   1515 void 	MGLAPI MGL_unionRectCoord(m_int left1,m_int top1,m_int right1,m_int bottom1,m_int left2,m_int top2,m_int right2,m_int bottom2,rect_t *d);
   1516 
   1517 /* Built-in patterns and mouse cursor */
   1518 
   1519 #ifndef	MGL_LITE
   1520 pattern_t	* MGLAPI _MGL_getEmptyPat(void);
   1521 pattern_t   * MGLAPI _MGL_getGrayPat(void);
   1522 pattern_t   * MGLAPI _MGL_getSolidPat(void);
   1523 #endif
   1524 cursor_t    * MGLAPI _MGL_getDefCursor(void);
   1525 
   1526 /* Fixed point multiplication/divide routines */
   1527 
   1528 #if defined(__WATCOMC__) && defined(__386__)
   1529 
   1530 /* For Watcom C++ we can use special inline assembler code that is much
   1531  * faster than calling the 386 assembler functions. Currently this is the
   1532  * the only compiler that will allow inline assembler to be expanded
   1533  * directly as inline functions.
   1534  */
   1535 
   1536 fix32_t	MGL_FixMul(fix32_t a,fix32_t b);
   1537 #pragma aux MGL_FixMul =			\
   1538 	"imul	edx"					\
   1539 	"add	eax,8000h"				\
   1540 	"adc	edx,0"					\
   1541 	"shrd	eax,edx,16"				\
   1542 	parm [eax] [edx]				\
   1543 	value [eax]						\
   1544 	modify exact [eax edx];
   1545 
   1546 fix32_t	MGL_FixDiv(fix32_t a,fix32_t b);
   1547 #pragma aux MGL_FixDiv =			\
   1548 	"xor	eax,eax"				\
   1549 	"shrd	eax,edx,16"				\
   1550 	"sar	edx,16"					\
   1551 	"idiv	ebx"              		\
   1552 	parm [edx] [ebx] 				\
   1553 	value [eax]             		\
   1554 	modify exact [eax edx];
   1555 
   1556 fix32_t	MGL_FixMulDiv(fix32_t a,fix32_t b,fix32_t c);
   1557 #pragma aux MGL_FixMulDiv =			\
   1558 	"imul	ebx"					\
   1559 	"idiv	ecx"              		\
   1560 	parm [eax] [ebx] [ecx] 			\
   1561 	value [eax]             		\
   1562 	modify exact [eax edx];
   1563 
   1564 m_int	MGL_backfacing(fix32_t dx1,fix32_t dy1,fix32_t dx2,fix32_t dy2);
   1565 #pragma aux MGL_backfacing =		\
   1566 	"imul	ebx"					\
   1567 	"mov	ebx,eax"				\
   1568 	"mov	ecx,edx"				\
   1569 	"mov	eax,esi"				\
   1570 	"imul	edi"					\
   1571 	"sub	eax,ebx"				\
   1572 	"mov	eax,1"					\
   1573 	"sbb	edx,ecx"				\
   1574 	"jns	@@Backfacing"			\
   1575 	"xor	eax,eax"				\
   1576 	"@@Backfacing:"					\
   1577 	parm [eax] [esi] [edi] [ebx]	\
   1578 	value [eax]             		\
   1579 	modify exact [eax ecx edx];
   1580 
   1581 void MGL_memcpy(void *dst,void *src,m_int n);
   1582 #pragma aux MGL_memcpy =            \
   1583 	"mov	eax,ecx"				\
   1584 	"shr    ecx,2"                  \
   1585 	"rep    movsd"                  \
   1586 	"mov	cl,al"					\
   1587 	"and	cl,3"					\
   1588 	"rep	movsb"					\
   1589 	parm [edi] [esi] [ecx]			\
   1590 	modify exact [eax ecx esi edi];
   1591 
   1592 #else
   1593 
   1594 fix32_t	ASMAPI MGL_FixMul(fix32_t a,fix32_t b);
   1595 fix32_t	ASMAPI MGL_FixDiv(fix32_t a,fix32_t b);
   1596 fix32_t	ASMAPI MGL_FixMulDiv(fix32_t a,fix32_t b,fix32_t c);
   1597 m_int	ASMAPI MGL_backfacing(fix32_t dx1,fix32_t dy1,fix32_t dx2,fix32_t dy2);
   1598 void 	ASMAPI MGL_memcpy(void *dst,void *src,m_int n);
   1599 
   1600 #endif
   1601 
   1602 /* The following are special memcpy routines that properly handler reading
   1603  * and writing to virtual linear buffer memory by forcing the proper
   1604  * alignment. Note that the copy is extended to use a DWORD copy of speed.
   1605  */
   1606 
   1607 void 	ASMAPI MGL_memcpyVIRTSRC(void *dst,void *src,m_int n);
   1608 void 	ASMAPI MGL_memcpyVIRTDST(void *dst,void *src,m_int n);
   1609 
   1610 /* Function to find an MGL system file's full pathname */
   1611 
   1612 bool	MGLAPI _MGL_findFile(char *validpath,const char *dir, const char *filename, const char *mode);
   1613 
   1614 /* Override the internal MGL file I/O functions */
   1615 
   1616 void	MGLAPI MGL_setFileIO(fileio_t *fio);
   1617 
   1618 /* The following dummy symbols are used to link in driver files to be used. A
   1619  * driver is not active until it is linked in with the MGL_registerDriver
   1620  * call. Because we dont export globals in DLLs, we provide functions to
   1621  * get the address of the drivers. However for a static link library we
   1622  * need to use globals so that if the driver data is unreferenced, it will
   1623  * not be linked in with the code.
   1624  */
   1625 
   1626 #ifndef	BUILD_MGL
   1627 #if	defined(MGL_DLL) && !defined(BUILD_MGLDLL)
   1628 void * MGLAPI VGA4_getDriverAddr(void);
   1629 void * MGLAPI VGAX_getDriverAddr(void);
   1630 void * MGLAPI SVGA4_getDriverAddr(void);
   1631 void * MGLAPI SVGA8_getDriverAddr(void);
   1632 void * MGLAPI SVGA16_getDriverAddr(void);
   1633 void * MGLAPI SVGA24_getDriverAddr(void);
   1634 void * MGLAPI SVGA32_getDriverAddr(void);
   1635 #if !defined(__16BIT__)
   1636 void * MGLAPI VGA8_getDriverAddr(void);
   1637 void * MGLAPI LINEAR8_getDriverAddr(void);
   1638 void * MGLAPI LINEAR16_getDriverAddr(void);
   1639 void * MGLAPI LINEAR24_getDriverAddr(void);
   1640 void * MGLAPI LINEAR32_getDriverAddr(void);
   1641 void * MGLAPI ACCEL8_getDriverAddr(void);
   1642 void * MGLAPI ACCEL16_getDriverAddr(void);
   1643 void * MGLAPI ACCEL24_getDriverAddr(void);
   1644 void * MGLAPI ACCEL32_getDriverAddr(void);
   1645 #if defined(MGLWIN) || defined(__WINDOWS__)
   1646 void * MGLAPI DDRAW8_getDriverAddr(void);
   1647 void * MGLAPI DDRAW16_getDriverAddr(void);
   1648 void * MGLAPI DDRAW24_getDriverAddr(void);
   1649 void * MGLAPI DDRAW32_getDriverAddr(void);
   1650 #endif
   1651 #endif
   1652 void * MGLAPI PACKED1_getDriverAddr(void);
   1653 void * MGLAPI PACKED4_getDriverAddr(void);
   1654 void * MGLAPI PACKED8_getDriverAddr(void);
   1655 void * MGLAPI PACKED16_getDriverAddr(void);
   1656 void * MGLAPI PACKED24_getDriverAddr(void);
   1657 void * MGLAPI PACKED32_getDriverAddr(void);
   1658 #define VGA4_driver			VGA4_getDriverAddr()
   1659 #define VGAX_driver			VGAX_getDriverAddr()
   1660 #define SVGA4_driver		SVGA4_getDriverAddr()
   1661 #define SVGA8_driver		SVGA8_getDriverAddr()
   1662 #define SVGA16_driver		SVGA16_getDriverAddr()
   1663 #define SVGA24_driver		SVGA24_getDriverAddr()
   1664 #define SVGA32_driver		SVGA32_getDriverAddr()
   1665 #if !defined(__16BIT__)
   1666 #define VGA8_driver			VGA8_getDriverAddr()
   1667 #define LINEAR8_driver		LINEAR8_getDriverAddr()
   1668 #define LINEAR16_driver		LINEAR16_getDriverAddr()
   1669 #define LINEAR24_driver     LINEAR24_getDriverAddr()
   1670 #define LINEAR32_driver     LINEAR32_getDriverAddr()
   1671 #define ACCEL8_driver       ACCEL8_getDriverAddr()
   1672 #define ACCEL16_driver      ACCEL16_getDriverAddr()
   1673 #define ACCEL24_driver      ACCEL24_getDriverAddr()
   1674 #define ACCEL32_driver      ACCEL32_getDriverAddr()
   1675 #if defined(MGLWIN) || defined(__WINDOWS__)
   1676 #define DDRAW8_driver       DDRAW8_getDriverAddr()
   1677 #define DDRAW16_driver      DDRAW16_getDriverAddr()
   1678 #define DDRAW24_driver      DDRAW24_getDriverAddr()
   1679 #define DDRAW32_driver      DDRAW32_getDriverAddr()
   1680 #endif
   1681 #endif
   1682 #define PACKED1_driver      PACKED1_getDriverAddr()
   1683 #define PACKED4_driver      PACKED4_getDriverAddr()
   1684 #define PACKED8_driver      PACKED8_getDriverAddr()
   1685 #define PACKED16_driver     PACKED16_getDriverAddr()
   1686 #define PACKED24_driver     PACKED24_getDriverAddr()
   1687 #define PACKED32_driver		PACKED32_getDriverAddr()
   1688 #else
   1689 extern m_int _VARAPI VGA4_driver[];
   1690 extern m_int _VARAPI VGAX_driver[];
   1691 extern m_int _VARAPI SVGA4_driver[];
   1692 extern m_int _VARAPI SVGA8_driver[];
   1693 extern m_int _VARAPI SVGA16_driver[];
   1694 extern m_int _VARAPI SVGA24_driver[];
   1695 extern m_int _VARAPI SVGA32_driver[];
   1696 #if !defined(__16BIT__)
   1697 extern m_int _VARAPI VGA8_driver[];
   1698 extern m_int _VARAPI LINEAR8_driver[];
   1699 extern m_int _VARAPI LINEAR16_driver[];
   1700 extern m_int _VARAPI LINEAR24_driver[];
   1701 extern m_int _VARAPI LINEAR32_driver[];
   1702 extern m_int _VARAPI ACCEL8_driver[];
   1703 extern m_int _VARAPI ACCEL16_driver[];
   1704 extern m_int _VARAPI ACCEL24_driver[];
   1705 extern m_int _VARAPI ACCEL32_driver[];
   1706 #if defined(MGLWIN) || defined(__WINDOWS__)
   1707 extern m_int _VARAPI DDRAW8_driver[];
   1708 extern m_int _VARAPI DDRAW16_driver[];
   1709 extern m_int _VARAPI DDRAW24_driver[];
   1710 extern m_int _VARAPI DDRAW32_driver[];
   1711 #endif
   1712 #endif
   1713 extern m_int _VARAPI PACKED1_driver[];
   1714 extern m_int _VARAPI PACKED4_driver[];
   1715 extern m_int _VARAPI PACKED8_driver[];
   1716 extern m_int _VARAPI PACKED16_driver[];
   1717 extern m_int _VARAPI PACKED24_driver[];
   1718 extern m_int _VARAPI PACKED32_driver[];
   1719 #endif
   1720 #endif
   1721 
   1722 /*---------------------------------------------------------------------------
   1723  * Memory allocation and utility functions.
   1724  *-------------------------------------------------------------------------*/
   1725 
   1726 #ifndef	__16BIT__
   1727 #define	_HUGE
   1728 #else
   1729 #define	_HUGE	_huge
   1730 #endif
   1731 
   1732 void MGL_availableMemory(ulong *physical,ulong *total);
   1733 void MGL_useLocalMalloc(void _HUGE * (*malloc)(long size),void (*free)(void _HUGE *p));
   1734 void * MGLAPI MGL_malloc(long size);
   1735 void * MGLAPI MGL_calloc(long size,long n);
   1736 void MGLAPI MGL_free(void _HUGE *p);
   1737 void MGLAPI MGL_memset(void _HUGE *s,m_int c,long n);
   1738 void MGLAPI MGL_memsetw(void _HUGE *s,m_int c,long n);
   1739 void MGLAPI MGL_memsetl(void _HUGE *s,long c,long n);
   1740 
   1741 /*---------------------------------------------------------------------------
   1742  * Set a fullscreen suspend application callback function. This is used in
   1743  * fullscreen video modes to allow switching back to the normal operating
   1744  * system graphical shell (such as Windows GDI, OS/2 PM etc).
   1745  *-------------------------------------------------------------------------*/
   1746 
   1747 typedef m_int (ASMAPI *MGL_suspend_cb_t)(MGLDC *dc,m_int flags);
   1748 void	MGLAPI MGL_setSuspendAppCallback(MGL_suspend_cb_t staveState);
   1749 
   1750 /*---------------------------------------------------------------------------
   1751  * Tell the MGL to use a pre-loaded ACCEL.DRV driver file. This allows
   1752  * you to link with the SciTech WinDirect/Pro and WinDirect/Ultra device
   1753  * support libraries and tell the MGL to use the device support drivers.
   1754  * If the user has a real ACCEL.DRV driver file in the standard location
   1755  * on their machine, this driver file will still be used.
   1756  *-------------------------------------------------------------------------*/
   1757 
   1758 void	MGLAPI MGL_setACCELDriver(void *driver);
   1759 
   1760 /*---------------------- Inline functions as Macros -----------------------*/
   1761 
   1762 #define	MGL_equalPoint(p1,p2)	((p1).x == (p2).x && (p1).y == (p2).y)
   1763 
   1764 #define	MGL_equalRect(r1,r2)	((r1).left == (r2).left &&			\
   1765 								 (r1).top == (r2).top &&			\
   1766 								 (r1).right == (r2).right &&		\
   1767 								 (r1).bottom == (r2).bottom)
   1768 
   1769 #define	MGL_emptyRect(r)		((r).bottom <= (r).top || 			\
   1770 								 (r).right <= (r).left)
   1771 
   1772 #define	MGL_disjointRect(r1,r2)	((r1).right <= (r2).left ||			\
   1773 								 (r1).left >= (r2).right ||			\
   1774 								 (r1).bottom <= (r2).top ||			\
   1775 								 (r1).top >= (r2).bottom)
   1776 
   1777 #define	MGL_sectRect(s1,s2,d)										\
   1778    ((d)->left = MAX((s1).left,(s2).left),                           \
   1779 	(d)->right = MIN((s1).right,(s2).right),                        \
   1780 	(d)->top = MAX((s1).top,(s2).top),                              \
   1781 	(d)->bottom = MIN((s1).bottom,(s2).bottom),                     \
   1782 	!MGL_emptyRect(*d))
   1783 
   1784 #define	MGL_sectRectFast(s1,s2,d)									\
   1785 	(d)->left = MAX((s1).left,(s2).left);                           \
   1786 	(d)->right = MIN((s1).right,(s2).right);                        \
   1787 	(d)->top = MAX((s1).top,(s2).top);                              \
   1788 	(d)->bottom = MIN((s1).bottom,(s2).bottom)
   1789 
   1790 #define	MGL_sectRectCoord(l1,t1,r1,b1,l2,t2,r2,b2,d)				\
   1791    ((d)->left = MAX(l1,l2),											\
   1792 	(d)->right = MIN(r1,r2),										\
   1793 	(d)->top = MAX(t1,t2),											\
   1794 	(d)->bottom = MIN(b1,b2),										\
   1795 	!MGL_emptyRect(*d))
   1796 
   1797 #define	MGL_sectRectFastCoord(l1,t1,r1,b1,l2,t2,r2,b2,d)			\
   1798 	(d)->left = MAX(l1,l2);											\
   1799 	(d)->right = MIN(r1,r2);										\
   1800 	(d)->top = MAX(t1,t2);											\
   1801 	(d)->bottom = MIN(b1,b2)
   1802 
   1803 #define	MGL_unionRect(s1,s2,d)										\
   1804 	(d)->left = MIN((s1).left,(s2).left);                           \
   1805 	(d)->right = MAX((s1).right,(s2).right);                        \
   1806 	(d)->top = MIN((s1).top,(s2).top);                              \
   1807 	(d)->bottom = MAX((s1).bottom,(s2).bottom)
   1808 
   1809 #define MGL_unionRectCoord(l1,t1,r1,b1,l2,t2,r2,b2,d)				\
   1810 	(d)->left = MIN(l1,l2);                                 		\
   1811 	(d)->right = MAX(r1,r2);                              			\
   1812 	(d)->top = MIN(t1,t2);                                    		\
   1813 	(d)->bottom = MAX(b1,b2)
   1814 
   1815 #define	MGL_offsetRect(r,dx,dy)										\
   1816 	{	(r).left += dx; (r).right += dx;							\
   1817 		(r).top += dy; (r).bottom += dy; }
   1818 
   1819 #define	MGL_insetRect(r,dx,dy)										\
   1820 	{	(r).left += dx; (r).right -= dx;							\
   1821 		(r).top += dy; (r).bottom -= dy;							\
   1822 		if (MGL_emptyRect(r))										\
   1823 			(r).left = (r).right = (r).top = (r).bottom = 0; }
   1824 
   1825 #define	MGL_ptInRect(p,r)		((p).x >= (r).left &&				\
   1826 								 (p).x < (r).right &&				\
   1827 								 (p).y >= (r).top &&				\
   1828 								 (p).y < (r).bottom)
   1829 
   1830 #define	MGL_ptInRectCoord(x,y,r)	((x) >= (r).left &&				\
   1831 									 (x) < (r).right &&				\
   1832 									 (y) >= (r).top &&				\
   1833 									 (y) < (r).bottom)
   1834 
   1835 #define	MGL_ptInRegion(p,r)		MGL_ptInRegionCoord((p).x,(p).y,r)
   1836 
   1837 #define	MGL_pixel(p)			MGL_pixelCoord((p).x,(p).y)
   1838 #define	MGL_getPixel(p)			MGL_getPixelCoord((p).x,(p).y)
   1839 #define	MGL_pixelFast(p)		MGL_pixelCoordFast((p).x,(p).y)
   1840 #define	MGL_getPixelFast(p)		MGL_getPixelCoordFast((p).x,(p).y)
   1841 #define	MGL_moveTo(p)			MGL_moveToCoord((p).x,(p).y)
   1842 #define MGL_moveRel(p)			MGL_moveRelCoord((p).x,(p).y)
   1843 #define	MGL_line(p1,p2)			MGL_lineCoord((p1).x,(p1).y,(p2).x,(p2).y)
   1844 #define	MGL_lineFast(p1,p2)		MGL_lineCoordFast((p1).x,(p1).y,(p2).x,(p2).y)
   1845 #define	MGL_lineFX(p1,p2)		MGL_lineCoordFX((p1).x,(p1).y,(p2).x,(p2).y)
   1846 #define	MGL_lineFastFX(p1,p2)	MGL_lineCoordFastFX((p1).x,(p1).y,(p2).x,(p2).y)
   1847 #define	MGL_cLineFast(p1,p2)	MGL_cLineCoordFast((p1).p.x,(p1).p.y,(p1).c,(p2).p.x,(p2).p.y,(p2).c)
   1848 #define	MGL_rgbLineFast(p1,p2)	MGL_rgbLineCoordFast((p1).p.x,(p1).p.y,(p1).c.r,(p1).c.g,(p1).c.b,(p2).p.x,(p2).p.y,(p2).c.r,(p2).c.g,(p2).c.b)
   1849 #define	MGL_zLineFast(p1,p2)	MGL_zLineCoordFast((p1).p.x,(p1).p.y,(p1).z,(p2).p.x,(p2).p.y,(p2).z)
   1850 #define	MGL_czLineFast(p1,p2)	MGL_czLineCoordFast((p1).p.x,(p1).p.y,(p1).z,(p1).c,(p2).p.x,(p2).p.y,(p2).z,(p2).c)
   1851 #define	MGL_rgbzLineFast(p1,p2)	MGL_rgbzLineCoordFast((p1).p.x,(p1).p.y,(p1).z,(p1).c.r,(p1).c.g,(p1).c.b,(p2).p.x,(p2).p.y,(p2).z,(p2).c.r,(p2).c.g,(p2).c.b)
   1852 
   1853 #define	MGL_zClearPt(lt,rb,z)	MGL_zClearCoord((lt).x,(lt).y,	\
   1854 									(rb).x,(rb).y,z)
   1855 #define	MGL_zClear(r,z)			MGL_zClearCoord((r).left,(r).top,	\
   1856 									(r).right,(r).bottom,z)
   1857 #define	MGL_lineTo(p)			MGL_lineToCoord((p).x,(p).y)
   1858 #define	MGL_lineRel(p)			MGL_lineRelCoord((p).x,(p).y);
   1859 #define	MGL_rectPt(lt,rb)		MGL_rectCoord((lt).x,(lt).y,(rb).x,(rb).y)
   1860 #define	MGL_rect(r)				MGL_rectCoord((r).left,(r).top,			\
   1861 									(r).right,(r).bottom)
   1862 #define	MGL_drawBorder(r,s,t)	MGL_drawBorderCoord((r).left,(r).top,	\
   1863 									(r).right,(r).bottom,(s),(t))
   1864 #define	MGL_fillRectPt(lt,rb)	MGL_fillRectCoord((lt).x,(lt).y,	\
   1865 									(rb).x,(rb).y)
   1866 #define	MGL_fillRect(r)			MGL_fillRectCoord((r).left,(r).top,	\
   1867 									(r).right,(r).bottom)
   1868 #define	MGL_bitBlt(d,s,r,dl,dt,op) 	MGL_bitBltCoord((d),(s),(r).left,		\
   1869 									(r).top,(r).right,(r).bottom,dl,dt,op)
   1870 #define	MGL_bitBltLin(d,s,so,r,op) MGL_bitBltLinCoord((d),(s),so,			\
   1871 									(r).left,(r).top,(r).right,(r).bottom,op)
   1872 #define	MGL_stretchBlt(d,s,sr,dr) 	MGL_stretchBltCoord((d),(s),(sr).left,		\
   1873 									(sr).top,(sr).right,(sr).bottom,	\
   1874 									(dr).left,(dr).top,(dr).right,(dr).bottom)
   1875 #define	MGL_transBlt(d,s,r,dl,dt,c,st)	MGL_transBltCoord((d),(s),(r).left,		\
   1876 									(r).top,(r).right,(r).bottom,dl,dt,c,st)
   1877 #define	MGL_transBltLin(d,s,so,r,c,st) MGL_transBltLinCoord((d),(s),so,	\
   1878 									(r).left,(r).top,(r).right,(r).bottom,c,st)
   1879 #define	MGL_getDivot(dc,r,divot) MGL_getDivotCoord(dc,(r).left,(r).top,	\
   1880 									(r).right,(r).bottom,divot)
   1881 #define	MGL_divotSize(dc,r)		MGL_divotSizeCoord(dc,(r).left,(r).top,\
   1882 									(r).right,(r).bottom)
   1883 #define	MGL_isSimpleRegion(r)	(((region_t*)(r))->spans == NULL)
   1884 #define	MGL_rgnLine(p1,p2,p)	MGL_rgnLineCoord((p1).x,(p1).y,(p2).x,(p2).y,p)
   1885 #define	MGL_rgnLineFX(p1,p2,p)	MGL_rgnLineCoordFX((p1).x,(p1).y,(p2).x,(p2).y,p)
   1886 #define	MGL_rgnSolidRectPt(lt,rb)	MGL_rgnSolidRectCoord((lt).x,(lt).y,	\
   1887 									(rb).x,(rb).y)
   1888 #define	MGL_rgnSolidRect(r)			MGL_rgnSolidRectCoord((r).left,(r).top,	\
   1889 									(r).right,(r).bottom)
   1890 
   1891 /* Fast color packing/unpacking routines implemented as macros */
   1892 
   1893 #define	MGL_packColorFast(pf,R,G,B)													\
   1894  ((ulong)(((uchar)(R) >> (pf)->redAdjust) & (pf)->redMask) << (pf)->redPos)			\
   1895  | ((ulong)(((uchar)(G) >> (pf)->greenAdjust) & (pf)->greenMask) << (pf)->greenPos)	\
   1896  | ((ulong)(((uchar)(B) >> (pf)->blueAdjust) & (pf)->blueMask) << (pf)->bluePos)
   1897 
   1898 #define	MGL_unpackColorFast(pf,c,R,G,B)												\
   1899 {																					\
   1900  (R) = (uchar)((((ulong)(c) >> (pf)->redPos) & (pf)->redMask) << (pf)->redAdjust);		\
   1901  (G) = (uchar)((((ulong)(c) >> (pf)->greenPos) & (pf)->greenMask) << (pf)->greenAdjust);\
   1902  (B) = (uchar)((((ulong)(c) >> (pf)->bluePos) & (pf)->blueMask) << (pf)->blueAdjust);	\
   1903 }
   1904 
   1905 /* Macros to access the RGB components in a packed 24 bit RGB tuple */
   1906 
   1907 #define	MGL_rgbRed(c)	(((uchar*)&(c))[2])
   1908 #define	MGL_rgbGreen(c)	(((uchar*)&(c))[1])
   1909 #define	MGL_rgbBlue(c)	(((uchar*)&(c))[0])
   1910 
   1911 /* Fast 24 bit color packing/unpacking routines implemented as macros */
   1912 
   1913 #define	MGL_packColorRGBFast(R,G,B)											\
   1914  (((ulong)((uchar)(R)) << 16) | ((ulong)((uchar)(G)) << 8) | (uchar)(B))
   1915 
   1916 #define	MGL_packColorRGBFast2(c,R,G,B)										\
   1917 {																			\
   1918  MGL_rgbRed(c) = (uchar)(R);												\
   1919  MGL_rgbGreen(c) = (uchar)(G);												\
   1920  MGL_rgbBlue(c) = (uchar)(B);												\
   1921 }
   1922 
   1923 #define	MGL_unpackColorRGBFast(c,R,G,B)										\
   1924 {																			\
   1925  (R) = MGL_rgbRed(c);														\
   1926  (G) = MGL_rgbGreen(c);														\
   1927  (B) = MGL_rgbBlue(c);														\
   1928 }
   1929 
   1930 #ifdef	__cplusplus
   1931 }						/* End of "C" linkage for C++	*/
   1932 
   1933 #include "mglrect.hpp"	/* Include C++ point/rectangle classes			*/
   1934 
   1935 #endif	/* __cplusplus */
   1936 
   1937 /* Include appropriate platform specific bindings */
   1938 
   1939 #if defined(MGLWIN) || defined(__WINDOWS__)
   1940 #include "mglwin.h"
   1941 #elif defined(MGLPM) || defined(__OS2__)
   1942 /*#include "mglpm.h"*/
   1943 #elif defined(MGLX) || defined(__UNIX__)
   1944 /*#include "mglx.h"*/
   1945 #else
   1946 #include "mgldos.h"
   1947 #endif
   1948 
   1949 #pragma pack()				/* Return to default packing				*/
   1950 
   1951 #endif	/* __MGRAPH_H */
   1952