Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5131 clevermous 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 
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 */