Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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.