DirectDraw.pas
上传用户:yj_qiu
上传日期:2022-08-08
资源大小:23636k
文件大小:258k
源码类别:

游戏引擎

开发平台:

Delphi

  1.  *)
  2.   DDENUMOVERLAYZ_BACKTOFRONT      = $00000000;
  3.   {$EXTERNALSYM DDENUMOVERLAYZ_BACKTOFRONT}
  4. (*
  5.  * Enumerate overlays front to back
  6.  *)
  7.   DDENUMOVERLAYZ_FRONTTOBACK      = $00000001;
  8.   {$EXTERNALSYM DDENUMOVERLAYZ_FRONTTOBACK}
  9. (****************************************************************************
  10.  *
  11.  * DIRECTDRAW UPDATEOVERLAYZORDER FLAGS
  12.  *
  13.  ****************************************************************************)
  14. (*
  15.  * Send overlay to front
  16.  *)
  17.   DDOVERZ_SENDTOFRONT             = $00000000;
  18.   {$EXTERNALSYM DDOVERZ_SENDTOFRONT}
  19. (*
  20.  * Send overlay to back
  21.  *)
  22.   DDOVERZ_SENDTOBACK              = $00000001;
  23.   {$EXTERNALSYM DDOVERZ_SENDTOBACK}
  24. (*
  25.  * Move Overlay forward
  26.  *)
  27.   DDOVERZ_MOVEFORWARD             = $00000002;
  28.   {$EXTERNALSYM DDOVERZ_MOVEFORWARD}
  29. (*
  30.  * Move Overlay backward
  31.  *)
  32.   DDOVERZ_MOVEBACKWARD            = $00000003;
  33.   {$EXTERNALSYM DDOVERZ_MOVEBACKWARD}
  34. (*
  35.  * Move Overlay in front of relative surface
  36.  *)
  37.   DDOVERZ_INSERTINFRONTOF         = $00000004;
  38.   {$EXTERNALSYM DDOVERZ_INSERTINFRONTOF}
  39. (*
  40.  * Move Overlay in back of relative surface
  41.  *)
  42.   DDOVERZ_INSERTINBACKOF          = $00000005;
  43.   {$EXTERNALSYM DDOVERZ_INSERTINBACKOF}
  44. (****************************************************************************
  45.  *
  46.  * DIRECTDRAW SETGAMMARAMP FLAGS
  47.  *
  48.  ****************************************************************************)
  49. (*
  50.  * Request calibrator to adjust the gamma ramp according to the physical
  51.  * properties of the display so that the result should appear identical
  52.  * on all systems.
  53.  *)
  54.   DDSGR_CALIBRATE                        = $00000001;
  55.   {$EXTERNALSYM DDSGR_CALIBRATE}
  56. (****************************************************************************
  57.  *
  58.  * DIRECTDRAW STARTMODETEST FLAGS
  59.  *
  60.  ****************************************************************************)
  61. (*
  62.  * Indicates that the mode being tested has passed
  63.  *)
  64.  DDSMT_ISTESTREQUIRED                   = $00000001;
  65.  {$EXTERNALSYM DDSMT_ISTESTREQUIRED}
  66. (****************************************************************************
  67.  *
  68.  * DIRECTDRAW EVALUATEMODE FLAGS
  69.  *
  70.  ****************************************************************************)
  71. (*
  72.  * Indicates that the mode being tested has passed
  73.  *)
  74.  DDEM_MODEPASSED                        = $00000001;
  75.  {$EXTERNALSYM DDEM_MODEPASSED}
  76. (*
  77.  * Indicates that the mode being tested has failed
  78.  *)
  79.  DDEM_MODEFAILED                        = $00000002;
  80.  {$EXTERNALSYM DDEM_MODEFAILED}
  81. (*===========================================================================
  82.  *
  83.  *
  84.  * DIRECTDRAW RETURN CODES
  85.  *
  86.  * The return values from DirectDraw Commands and Surface that return an HRESULT
  87.  * are codes from DirectDraw concerning the results of the action
  88.  * requested by DirectDraw.
  89.  *
  90.  *==========================================================================*)
  91. (*
  92.  * Status is OK
  93.  *
  94.  * Issued by: DirectDraw Commands and all callbacks
  95.  *)
  96.   DD_OK                                   = 0;
  97.   {$EXTERNALSYM DD_OK}
  98.   DD_FALSE                                = S_FALSE;
  99.   {$EXTERNALSYM DD_FALSE}
  100. (****************************************************************************
  101.  *
  102.  * DIRECTDRAW ENUMCALLBACK RETURN VALUES
  103.  *
  104.  * EnumCallback returns are used to control the flow of the DIRECTDRAW and
  105.  * DIRECTDRAWSURFACE object enumerations.   They can only be returned by
  106.  * enumeration callback routines.
  107.  *
  108.  ****************************************************************************)
  109. (*
  110.  * stop the enumeration
  111.  *)
  112.   DDENUMRET_CANCEL                        = 0;
  113.   {$EXTERNALSYM DDENUMRET_CANCEL}
  114. (*
  115.  * continue the enumeration
  116.  *)
  117.   DDENUMRET_OK                            = 1;
  118.   {$EXTERNALSYM DDENUMRET_OK}
  119. (****************************************************************************
  120.  *
  121.  * DIRECTDRAW ERRORS
  122.  *
  123.  * Errors are represented by negative values and cannot be combined.
  124.  *
  125.  ****************************************************************************)
  126. const
  127.   _FACDD = $876;
  128.   {$EXTERNALSYM _FACDD}
  129.   _MAKE_DDHRESULT = HResult(1 shl 31) or HResult(_FACDD shl 16);
  130. //#define MAKE_DDHRESULT( code )  MAKE_HRESULT( 1, _FACDD, code )
  131. function MAKE_DDHRESULT(Code: DWORD): HResult;
  132. {$EXTERNALSYM MAKE_DDHRESULT}
  133. const
  134. (*
  135.  * This object is already initialized
  136.  *)
  137.   DDERR_ALREADYINITIALIZED                = HResult(_MAKE_DDHRESULT + 5);
  138.   {$EXTERNALSYM DDERR_ALREADYINITIALIZED}
  139. (*
  140.  * This surface can not be attached to the requested surface.
  141.  *)
  142.   DDERR_CANNOTATTACHSURFACE               = HResult(_MAKE_DDHRESULT + 10);
  143.   {$EXTERNALSYM DDERR_CANNOTATTACHSURFACE}
  144. (*
  145.  * This surface can not be detached from the requested surface.
  146.  *)
  147.   DDERR_CANNOTDETACHSURFACE               = HResult(_MAKE_DDHRESULT + 20);
  148.   {$EXTERNALSYM DDERR_CANNOTDETACHSURFACE}
  149. (*
  150.  * Support is currently not available.
  151.  *)
  152.   DDERR_CURRENTLYNOTAVAIL                 = HResult(_MAKE_DDHRESULT + 40);
  153.   {$EXTERNALSYM DDERR_CURRENTLYNOTAVAIL}
  154. (*
  155.  * An exception was encountered while performing the requested operation
  156.  *)
  157.   DDERR_EXCEPTION                         = HResult(_MAKE_DDHRESULT + 55);
  158.   {$EXTERNALSYM DDERR_EXCEPTION}
  159. (*
  160.  * Generic failure.
  161.  *)
  162.   DDERR_GENERIC                           = E_FAIL;
  163.   {$EXTERNALSYM DDERR_GENERIC}
  164. (*
  165.  * Height of rectangle provided is not a multiple of reqd alignment
  166.  *)
  167.   DDERR_HEIGHTALIGN                       = HResult(_MAKE_DDHRESULT + 90);
  168.   {$EXTERNALSYM DDERR_HEIGHTALIGN}
  169. (*
  170.  * Unable to match primary surface creation request with existing
  171.  * primary surface.
  172.  *)
  173.   DDERR_INCOMPATIBLEPRIMARY               = HResult(_MAKE_DDHRESULT + 95);
  174.   {$EXTERNALSYM DDERR_INCOMPATIBLEPRIMARY}
  175. (*
  176.  * One or more of the caps bits passed to the callback are incorrect.
  177.  *)
  178.   DDERR_INVALIDCAPS                       = HResult(_MAKE_DDHRESULT + 100);
  179.   {$EXTERNALSYM DDERR_INVALIDCAPS}
  180. (*
  181.  * DirectDraw does not support provided Cliplist.
  182.  *)
  183.   DDERR_INVALIDCLIPLIST                   = HResult(_MAKE_DDHRESULT + 110);
  184.   {$EXTERNALSYM DDERR_INVALIDCLIPLIST}
  185. (*
  186.  * DirectDraw does not support the requested mode
  187.  *)
  188.   DDERR_INVALIDMODE                       = HResult(_MAKE_DDHRESULT + 120);
  189.   {$EXTERNALSYM DDERR_INVALIDMODE}
  190. (*
  191.  * DirectDraw received a pointer that was an invalid DIRECTDRAW object.
  192.  *)
  193.   DDERR_INVALIDOBJECT                     = HResult(_MAKE_DDHRESULT + 130);
  194.   {$EXTERNALSYM DDERR_INVALIDOBJECT}
  195. (*
  196.  * One or more of the parameters passed to the callback function are
  197.  * incorrect.
  198.  *)
  199.   DDERR_INVALIDPARAMS                     = E_INVALIDARG;
  200.   {$EXTERNALSYM DDERR_INVALIDPARAMS}
  201. (*
  202.  * pixel format was invalid as specified
  203.  *)
  204.   DDERR_INVALIDPIXELFORMAT                = HResult(_MAKE_DDHRESULT + 145);
  205.   {$EXTERNALSYM DDERR_INVALIDPIXELFORMAT}
  206. (*
  207.  * Rectangle provided was invalid.
  208.  *)
  209.   DDERR_INVALIDRECT                       = HResult(_MAKE_DDHRESULT + 150);
  210.   {$EXTERNALSYM DDERR_INVALIDRECT}
  211. (*
  212.  * Operation could not be carried out because one or more surfaces are locked
  213.  *)
  214.   DDERR_LOCKEDSURFACES                    = HResult(_MAKE_DDHRESULT + 160);
  215.   {$EXTERNALSYM DDERR_LOCKEDSURFACES}
  216. (*
  217.  * There is no 3D present.
  218.  *)
  219.   DDERR_NO3D                              = HResult(_MAKE_DDHRESULT + 170);
  220.   {$EXTERNALSYM DDERR_NO3D}
  221. (*
  222.  * Operation could not be carried out because there is no alpha accleration
  223.  * hardware present or available.
  224.  *)
  225.   DDERR_NOALPHAHW                         = HResult(_MAKE_DDHRESULT + 180);
  226.   {$EXTERNALSYM DDERR_NOALPHAHW}
  227. (*
  228.  * Operation could not be carried out because there is no stereo
  229.  * hardware present or available.
  230.  *)
  231.   DDERR_NOSTEREOHARDWARE                  = HResult(_MAKE_DDHRESULT + 181);
  232.   {$EXTERNALSYM DDERR_NOSTEREOHARDWARE}
  233. (*
  234.  * Operation could not be carried out because there is no hardware
  235.  * present which supports stereo surfaces
  236.  *)
  237.   DDERR_NOSURFACELEFT                     = HResult(_MAKE_DDHRESULT + 182);
  238.   {$EXTERNALSYM DDERR_NOSURFACELEFT}
  239. (*
  240.  * no clip list available
  241.  *)
  242.   DDERR_NOCLIPLIST                        = HResult(_MAKE_DDHRESULT + 205);
  243.   {$EXTERNALSYM DDERR_NOCLIPLIST}
  244. (*
  245.  * Operation could not be carried out because there is no color conversion
  246.  * hardware present or available.
  247.  *)
  248.   DDERR_NOCOLORCONVHW                     = HResult(_MAKE_DDHRESULT + 210);
  249.   {$EXTERNALSYM DDERR_NOCOLORCONVHW}
  250. (*
  251.  * Create function called without DirectDraw object method SetCooperativeLevel
  252.  * being called.
  253.  *)
  254.   DDERR_NOCOOPERATIVELEVELSET             = HResult(_MAKE_DDHRESULT + 212);
  255.   {$EXTERNALSYM DDERR_NOCOOPERATIVELEVELSET}
  256. (*
  257.  * Surface doesn't currently have a color key
  258.  *)
  259.   DDERR_NOCOLORKEY                        = HResult(_MAKE_DDHRESULT + 215);
  260.   {$EXTERNALSYM DDERR_NOCOLORKEY}
  261. (*
  262.  * Operation could not be carried out because there is no hardware support
  263.  * of the dest color key.
  264.  *)
  265.   DDERR_NOCOLORKEYHW                      = HResult(_MAKE_DDHRESULT + 220);
  266.   {$EXTERNALSYM DDERR_NOCOLORKEYHW}
  267. (*
  268.  * No DirectDraw support possible with current display driver
  269.  *)
  270.   DDERR_NODIRECTDRAWSUPPORT               = HResult(_MAKE_DDHRESULT + 222);
  271.   {$EXTERNALSYM DDERR_NODIRECTDRAWSUPPORT}
  272. (*
  273.  * Operation requires the application to have exclusive mode but the
  274.  * application does not have exclusive mode.
  275.  *)
  276.   DDERR_NOEXCLUSIVEMODE                   = HResult(_MAKE_DDHRESULT + 225);
  277.   {$EXTERNALSYM DDERR_NOEXCLUSIVEMODE}
  278. (*
  279.  * Flipping visible surfaces is not supported.
  280.  *)
  281.   DDERR_NOFLIPHW                          = HResult(_MAKE_DDHRESULT + 230);
  282.   {$EXTERNALSYM DDERR_NOFLIPHW}
  283. (*
  284.  * There is no GDI present.
  285.  *)
  286.   DDERR_NOGDI                             = HResult(_MAKE_DDHRESULT + 240);
  287.   {$EXTERNALSYM DDERR_NOGDI}
  288. (*
  289.  * Operation could not be carried out because there is no hardware present
  290.  * or available.
  291.  *)
  292.   DDERR_NOMIRRORHW                        = HResult(_MAKE_DDHRESULT + 250);
  293.   {$EXTERNALSYM DDERR_NOMIRRORHW}
  294. (*
  295.  * Requested item was not found
  296.  *)
  297.   DDERR_NOTFOUND                          = HResult(_MAKE_DDHRESULT + 255);
  298.   {$EXTERNALSYM DDERR_NOTFOUND}
  299. (*
  300.  * Operation could not be carried out because there is no overlay hardware
  301.  * present or available.
  302.  *)
  303.   DDERR_NOOVERLAYHW                       = HResult(_MAKE_DDHRESULT + 260);
  304.   {$EXTERNALSYM DDERR_NOOVERLAYHW}
  305. (*
  306.  * Operation could not be carried out because the source and destination
  307.  * rectangles are on the same surface and overlap each other.
  308.  *)
  309.   DDERR_OVERLAPPINGRECTS                  = HResult(_MAKE_DDHRESULT + 270);
  310.   {$EXTERNALSYM DDERR_OVERLAPPINGRECTS}
  311. (*
  312.  * Operation could not be carried out because there is no appropriate raster
  313.  * op hardware present or available.
  314.  *)
  315.   DDERR_NORASTEROPHW                      = HResult(_MAKE_DDHRESULT + 280);
  316.   {$EXTERNALSYM DDERR_NORASTEROPHW}
  317. (*
  318.  * Operation could not be carried out because there is no rotation hardware
  319.  * present or available.
  320.  *)
  321.   DDERR_NOROTATIONHW                      = HResult(_MAKE_DDHRESULT + 290);
  322.   {$EXTERNALSYM DDERR_NOROTATIONHW}
  323. (*
  324.  * Operation could not be carried out because there is no hardware support
  325.  * for stretching
  326.  *)
  327.   DDERR_NOSTRETCHHW                       = HResult(_MAKE_DDHRESULT + 310);
  328.   {$EXTERNALSYM DDERR_NOSTRETCHHW}
  329. (*
  330.  * DirectDrawSurface is not in 4 bit color palette and the requested operation
  331.  * requires 4 bit color palette.
  332.  *)
  333.   DDERR_NOT4BITCOLOR                      = HResult(_MAKE_DDHRESULT + 316);
  334.   {$EXTERNALSYM DDERR_NOT4BITCOLOR}
  335. (*
  336.  * DirectDrawSurface is not in 4 bit color index palette and the requested
  337.  * operation requires 4 bit color index palette.
  338.  *)
  339.   DDERR_NOT4BITCOLORINDEX                 = HResult(_MAKE_DDHRESULT + 317);
  340.   {$EXTERNALSYM DDERR_NOT4BITCOLORINDEX}
  341. (*
  342.  * DirectDraw Surface is not in 8 bit color mode and the requested operation
  343.  * requires 8 bit color.
  344.  *)
  345.   DDERR_NOT8BITCOLOR                      = HResult(_MAKE_DDHRESULT + 320);
  346.   {$EXTERNALSYM DDERR_NOT8BITCOLOR}
  347. (*
  348.  * Operation could not be carried out because there is no texture mapping
  349.  * hardware present or available.
  350.  *)
  351.   DDERR_NOTEXTUREHW                       = HResult(_MAKE_DDHRESULT + 330);
  352.   {$EXTERNALSYM DDERR_NOTEXTUREHW}
  353. (*
  354.  * Operation could not be carried out because there is no hardware support
  355.  * for vertical blank synchronized operations.
  356.  *)
  357.   DDERR_NOVSYNCHW                         = HResult(_MAKE_DDHRESULT + 335);
  358.   {$EXTERNALSYM DDERR_NOVSYNCHW}
  359. (*
  360.  * Operation could not be carried out because there is no hardware support
  361.  * for zbuffer blting.
  362.  *)
  363.   DDERR_NOZBUFFERHW                       = HResult(_MAKE_DDHRESULT + 340);
  364.   {$EXTERNALSYM DDERR_NOZBUFFERHW}
  365. (*
  366.  * Overlay surfaces could not be z layered based on their BltOrder because
  367.  * the hardware does not support z layering of overlays.
  368.  *)
  369.   DDERR_NOZOVERLAYHW                      = HResult(_MAKE_DDHRESULT + 350);
  370.   {$EXTERNALSYM DDERR_NOZOVERLAYHW}
  371. (*
  372.  * The hardware needed for the requested operation has already been
  373.  * allocated.
  374.  *)
  375.   DDERR_OUTOFCAPS                         = HResult(_MAKE_DDHRESULT + 360);
  376.   {$EXTERNALSYM DDERR_OUTOFCAPS}
  377. (*
  378.  * DirectDraw does not have enough memory to perform the operation.
  379.  *)
  380.   DDERR_OUTOFMEMORY                       = E_OUTOFMEMORY;
  381.   {$EXTERNALSYM DDERR_OUTOFMEMORY}
  382. (*
  383.  * DirectDraw does not have enough memory to perform the operation.
  384.  *)
  385.   DDERR_OUTOFVIDEOMEMORY                  = HResult(_MAKE_DDHRESULT + 380);
  386.   {$EXTERNALSYM DDERR_OUTOFVIDEOMEMORY}
  387. (*
  388.  * hardware does not support clipped overlays
  389.  *)
  390.   DDERR_OVERLAYCANTCLIP                   = HResult(_MAKE_DDHRESULT + 382);
  391.   {$EXTERNALSYM DDERR_OVERLAYCANTCLIP}
  392. (*
  393.  * Can only have ony color key active at one time for overlays
  394.  *)
  395.   DDERR_OVERLAYCOLORKEYONLYONEACTIVE      = HResult(_MAKE_DDHRESULT + 384);
  396.   {$EXTERNALSYM DDERR_OVERLAYCOLORKEYONLYONEACTIVE}
  397. (*
  398.  * Access to this palette is being refused because the palette is already
  399.  * locked by another thread.
  400.  *)
  401.   DDERR_PALETTEBUSY                       = HResult(_MAKE_DDHRESULT + 387);
  402.   {$EXTERNALSYM DDERR_PALETTEBUSY}
  403. (*
  404.  * No src color key specified for this operation.
  405.  *)
  406.   DDERR_COLORKEYNOTSET                    = HResult(_MAKE_DDHRESULT + 400);
  407.   {$EXTERNALSYM DDERR_COLORKEYNOTSET}
  408. (*
  409.  * This surface is already attached to the surface it is being attached to.
  410.  *)
  411.   DDERR_SURFACEALREADYATTACHED            = HResult(_MAKE_DDHRESULT + 410);
  412.   {$EXTERNALSYM DDERR_SURFACEALREADYATTACHED}
  413. (*
  414.  * This surface is already a dependency of the surface it is being made a
  415.  * dependency of.
  416.  *)
  417.   DDERR_SURFACEALREADYDEPENDENT           = HResult(_MAKE_DDHRESULT + 420);
  418.   {$EXTERNALSYM DDERR_SURFACEALREADYDEPENDENT}
  419. (*
  420.  * Access to this surface is being refused because the surface is already
  421.  * locked by another thread.
  422.  *)
  423.   DDERR_SURFACEBUSY                       = HResult(_MAKE_DDHRESULT + 430);
  424.   {$EXTERNALSYM DDERR_SURFACEBUSY}
  425. (*
  426.  * Access to this surface is being refused because no driver exists
  427.  * which can supply a pointer to the surface.
  428.  * This is most likely to happen when attempting to lock the primary
  429.  * surface when no DCI provider is present.
  430.  * Will also happen on attempts to lock an optimized surface.
  431.  *)
  432.   DDERR_CANTLOCKSURFACE                   = HResult(_MAKE_DDHRESULT + 435);
  433.   {$EXTERNALSYM DDERR_CANTLOCKSURFACE}
  434. (*
  435.  * Access to Surface refused because Surface is obscured.
  436.  *)
  437.   DDERR_SURFACEISOBSCURED                 = HResult(_MAKE_DDHRESULT + 440);
  438.   {$EXTERNALSYM DDERR_SURFACEISOBSCURED}
  439. (*
  440.  * Access to this surface is being refused because the surface is gone.
  441.  * The DIRECTDRAWSURFACE object representing this surface should
  442.  * have Restore called on it.
  443.  *)
  444.   DDERR_SURFACELOST                       = HResult(_MAKE_DDHRESULT + 450);
  445.   {$EXTERNALSYM DDERR_SURFACELOST}
  446. (*
  447.  * The requested surface is not attached.
  448.  *)
  449.   DDERR_SURFACENOTATTACHED                = HResult(_MAKE_DDHRESULT + 460);
  450.   {$EXTERNALSYM DDERR_SURFACENOTATTACHED}
  451. (*
  452.  * Height requested by DirectDraw is too large.
  453.  *)
  454.   DDERR_TOOBIGHEIGHT                      = HResult(_MAKE_DDHRESULT + 470);
  455.   {$EXTERNALSYM DDERR_TOOBIGHEIGHT}
  456. (*
  457.  * Size requested by DirectDraw is too large --  The individual height and
  458.  * width are OK.
  459.  *)
  460.   DDERR_TOOBIGSIZE                        = HResult(_MAKE_DDHRESULT + 480);
  461.   {$EXTERNALSYM DDERR_TOOBIGSIZE}
  462. (*
  463.  * Width requested by DirectDraw is too large.
  464.  *)
  465.   DDERR_TOOBIGWIDTH                       = HResult(_MAKE_DDHRESULT + 490);
  466.   {$EXTERNALSYM DDERR_TOOBIGWIDTH}
  467. (*
  468.  * Action not supported.
  469.  *)
  470.   DDERR_UNSUPPORTED                       = E_NOTIMPL;
  471.   {$EXTERNALSYM DDERR_UNSUPPORTED}
  472. (*
  473.  * FOURCC format requested is unsupported by DirectDraw
  474.  *)
  475.   DDERR_UNSUPPORTEDFORMAT                 = HResult(_MAKE_DDHRESULT + 510);
  476.   {$EXTERNALSYM DDERR_UNSUPPORTEDFORMAT}
  477. (*
  478.  * Bitmask in the pixel format requested is unsupported by DirectDraw
  479.  *)
  480.   DDERR_UNSUPPORTEDMASK                   = HResult(_MAKE_DDHRESULT + 520);
  481.   {$EXTERNALSYM DDERR_UNSUPPORTEDMASK}
  482. (*
  483.  * The specified stream contains invalid data
  484.  *)
  485.   DDERR_INVALIDSTREAM                     = HResult(_MAKE_DDHRESULT + 521);
  486.   {$EXTERNALSYM DDERR_INVALIDSTREAM}
  487. (*
  488.  * vertical blank is in progress
  489.  *)
  490.   DDERR_VERTICALBLANKINPROGRESS           = HResult(_MAKE_DDHRESULT + 537);
  491.   {$EXTERNALSYM DDERR_VERTICALBLANKINPROGRESS}
  492. (*
  493.  * Informs DirectDraw that the previous Blt which is transfering information
  494.  * to or from this Surface is incomplete.
  495.  *)
  496.   DDERR_WASSTILLDRAWING                   = HResult(_MAKE_DDHRESULT + 540);
  497.   {$EXTERNALSYM DDERR_WASSTILLDRAWING}
  498. (*
  499.  * The specified surface type requires specification of the COMPLEX flag
  500.  *)
  501.   DDERR_DDSCAPSCOMPLEXREQUIRED            = HResult(_MAKE_DDHRESULT + 542);
  502.   {$EXTERNALSYM DDERR_DDSCAPSCOMPLEXREQUIRED}
  503. (*
  504.  * Rectangle provided was not horizontally aligned on reqd. boundary
  505.  *)
  506.   DDERR_XALIGN                            = HResult(_MAKE_DDHRESULT + 560);
  507.   {$EXTERNALSYM DDERR_XALIGN}
  508. (*
  509.  * The GUID passed to DirectDrawCreate is not a valid DirectDraw driver
  510.  * identifier.
  511.  *)
  512.   DDERR_INVALIDDIRECTDRAWGUID             = HResult(_MAKE_DDHRESULT + 561);
  513.   {$EXTERNALSYM DDERR_INVALIDDIRECTDRAWGUID}
  514. (*
  515.  * A DirectDraw object representing this driver has already been created
  516.  * for this process.
  517.  *)
  518.   DDERR_DIRECTDRAWALREADYCREATED          = HResult(_MAKE_DDHRESULT + 562);
  519.   {$EXTERNALSYM DDERR_DIRECTDRAWALREADYCREATED}
  520. (*
  521.  * A hardware only DirectDraw object creation was attempted but the driver
  522.  * did not support any hardware.
  523.  *)
  524.   DDERR_NODIRECTDRAWHW                    = HResult(_MAKE_DDHRESULT + 563);
  525.   {$EXTERNALSYM DDERR_NODIRECTDRAWHW}
  526. (*
  527.  * this process already has created a primary surface
  528.  *)
  529.   DDERR_PRIMARYSURFACEALREADYEXISTS       = HResult(_MAKE_DDHRESULT + 564);
  530.   {$EXTERNALSYM DDERR_PRIMARYSURFACEALREADYEXISTS}
  531. (*
  532.  * software emulation not available.
  533.  *)
  534.   DDERR_NOEMULATION                       = HResult(_MAKE_DDHRESULT + 565);
  535.   {$EXTERNALSYM DDERR_NOEMULATION}
  536. (*
  537.  * region passed to Clipper::GetClipList is too small.
  538.  *)
  539.   DDERR_REGIONTOOSMALL                    = HResult(_MAKE_DDHRESULT + 566);
  540.   {$EXTERNALSYM DDERR_REGIONTOOSMALL}
  541. (*
  542.  * an attempt was made to set a clip list for a clipper objec that
  543.  * is already monitoring an hwnd.
  544.  *)
  545.   DDERR_CLIPPERISUSINGHWND                = HResult(_MAKE_DDHRESULT + 567);
  546.   {$EXTERNALSYM DDERR_CLIPPERISUSINGHWND}
  547. (*
  548.  * No clipper object attached to surface object
  549.  *)
  550.   DDERR_NOCLIPPERATTACHED                 = HResult(_MAKE_DDHRESULT + 568);
  551.   {$EXTERNALSYM DDERR_NOCLIPPERATTACHED}
  552. (*
  553.  * Clipper notification requires an HWND or
  554.  * no HWND has previously been set as the CooperativeLevel HWND.
  555.  *)
  556.   DDERR_NOHWND                            = HResult(_MAKE_DDHRESULT + 569);
  557.   {$EXTERNALSYM DDERR_NOHWND}
  558. (*
  559.  * HWND used by DirectDraw CooperativeLevel has been subclassed,
  560.  * this prevents DirectDraw from restoring state.
  561.  *)
  562.   DDERR_HWNDSUBCLASSED                    = HResult(_MAKE_DDHRESULT + 570);
  563.   {$EXTERNALSYM DDERR_HWNDSUBCLASSED}
  564. (*
  565.  * The CooperativeLevel HWND has already been set.
  566.  * It can not be reset while the process has surfaces or palettes created.
  567.  *)
  568.   DDERR_HWNDALREADYSET                    = HResult(_MAKE_DDHRESULT + 571);
  569.   {$EXTERNALSYM DDERR_HWNDALREADYSET}
  570. (*
  571.  * No palette object attached to this surface.
  572.  *)
  573.   DDERR_NOPALETTEATTACHED                 = HResult(_MAKE_DDHRESULT + 572);
  574.   {$EXTERNALSYM DDERR_NOPALETTEATTACHED}
  575. (*
  576.  * No hardware support for 16 or 256 color palettes.
  577.  *)
  578.   DDERR_NOPALETTEHW                       = HResult(_MAKE_DDHRESULT + 573);
  579.   {$EXTERNALSYM DDERR_NOPALETTEHW}
  580. (*
  581.  * If a clipper object is attached to the source surface passed into a
  582.  * BltFast call.
  583.  *)
  584.   DDERR_BLTFASTCANTCLIP                   = HResult(_MAKE_DDHRESULT + 574);
  585.   {$EXTERNALSYM DDERR_BLTFASTCANTCLIP}
  586. (*
  587.  * No blter.
  588.  *)
  589.   DDERR_NOBLTHW                           = HResult(_MAKE_DDHRESULT + 575);
  590.   {$EXTERNALSYM DDERR_NOBLTHW}
  591. (*
  592.  * No DirectDraw ROP hardware.
  593.  *)
  594.   DDERR_NODDROPSHW                        = HResult(_MAKE_DDHRESULT + 576);
  595.   {$EXTERNALSYM DDERR_NODDROPSHW}
  596. (*
  597.  * returned when GetOverlayPosition is called on a hidden overlay
  598.  *)
  599.   DDERR_OVERLAYNOTVISIBLE                 = HResult(_MAKE_DDHRESULT + 577);
  600.   {$EXTERNALSYM DDERR_OVERLAYNOTVISIBLE}
  601. (*
  602.  * returned when GetOverlayPosition is called on a overlay that UpdateOverlay
  603.  * has never been called on to establish a destionation.
  604.  *)
  605.   DDERR_NOOVERLAYDEST                     = HResult(_MAKE_DDHRESULT + 578);
  606.   {$EXTERNALSYM DDERR_NOOVERLAYDEST}
  607. (*
  608.  * returned when the position of the overlay on the destionation is no longer
  609.  * legal for that destionation.
  610.  *)
  611.   DDERR_INVALIDPOSITION                   = HResult(_MAKE_DDHRESULT + 579);
  612.   {$EXTERNALSYM DDERR_INVALIDPOSITION}
  613. (*
  614.  * returned when an overlay member is called for a non-overlay surface
  615.  *)
  616.   DDERR_NOTAOVERLAYSURFACE                = HResult(_MAKE_DDHRESULT + 580);
  617.   {$EXTERNALSYM DDERR_NOTAOVERLAYSURFACE}
  618. (*
  619.  * An attempt was made to set the cooperative level when it was already
  620.  * set to exclusive.
  621.  *)
  622.   DDERR_EXCLUSIVEMODEALREADYSET           = HResult(_MAKE_DDHRESULT + 581);
  623.   {$EXTERNALSYM DDERR_EXCLUSIVEMODEALREADYSET}
  624. (*
  625.  * An attempt has been made to flip a surface that is not flippable.
  626.  *)
  627.   DDERR_NOTFLIPPABLE                      = HResult(_MAKE_DDHRESULT + 582);
  628.   {$EXTERNALSYM DDERR_NOTFLIPPABLE}
  629. (*
  630.  * Can't duplicate primary & 3D surfaces, or surfaces that are implicitly
  631.  * created.
  632.  *)
  633.   DDERR_CANTDUPLICATE                     = HResult(_MAKE_DDHRESULT + 583);
  634.   {$EXTERNALSYM DDERR_CANTDUPLICATE}
  635. (*
  636.  * Surface was not locked.  An attempt to unlock a surface that was not
  637.  * locked at all, or by this process, has been attempted.
  638.  *)
  639.   DDERR_NOTLOCKED                         = HResult(_MAKE_DDHRESULT + 584);
  640.   {$EXTERNALSYM DDERR_NOTLOCKED}
  641. (*
  642.  * Windows can not create any more DCs, or a DC was requested for a paltte-indexed
  643.  * surface when the surface had no palette AND the display mode was not palette-indexed
  644.  * (in this case DirectDraw cannot select a proper palette into the DC)
  645.  *)
  646.   DDERR_CANTCREATEDC                      = HResult(_MAKE_DDHRESULT + 585);
  647.   {$EXTERNALSYM DDERR_CANTCREATEDC}
  648. (*
  649.  * No DC was ever created for this surface.
  650.  *)
  651.   DDERR_NODC                              = HResult(_MAKE_DDHRESULT + 586);
  652.   {$EXTERNALSYM DDERR_NODC}
  653. (*
  654.  * This surface can not be restored because it was created in a different
  655.  * mode.
  656.  *)
  657.   DDERR_WRONGMODE                         = HResult(_MAKE_DDHRESULT + 587);
  658.   {$EXTERNALSYM DDERR_WRONGMODE}
  659. (*
  660.  * This surface can not be restored because it is an implicitly created
  661.  * surface.
  662.  *)
  663.   DDERR_IMPLICITLYCREATED                 = HResult(_MAKE_DDHRESULT + 588);
  664.   {$EXTERNALSYM DDERR_IMPLICITLYCREATED}
  665. (*
  666.  * The surface being used is not a palette-based surface
  667.  *)
  668.   DDERR_NOTPALETTIZED                     = HResult(_MAKE_DDHRESULT + 589);
  669.   {$EXTERNALSYM DDERR_NOTPALETTIZED}
  670. (*
  671.  * The display is currently in an unsupported mode
  672.  *)
  673.   DDERR_UNSUPPORTEDMODE                   = HResult(_MAKE_DDHRESULT + 590);
  674.   {$EXTERNALSYM DDERR_UNSUPPORTEDMODE}
  675. (*
  676.  * Operation could not be carried out because there is no mip-map
  677.  * texture mapping hardware present or available.
  678.  *)
  679.   DDERR_NOMIPMAPHW                        = HResult(_MAKE_DDHRESULT + 591);
  680.   {$EXTERNALSYM DDERR_NOMIPMAPHW}
  681. (*
  682.  * The requested action could not be performed because the surface was of
  683.  * the wrong type.
  684.  *)
  685.   DDERR_INVALIDSURFACETYPE                = HResult(_MAKE_DDHRESULT + 592);
  686.   {$EXTERNALSYM DDERR_INVALIDSURFACETYPE}
  687. (*
  688.  * Device does not support optimized surfaces, therefore no video memory optimized surfaces
  689.  *)
  690.   DDERR_NOOPTIMIZEHW                      = HResult(_MAKE_DDHRESULT + 600);
  691.   {$EXTERNALSYM DDERR_NOOPTIMIZEHW}
  692. (*
  693.  * Surface is an optimized surface, but has not yet been allocated any memory
  694.  *)
  695.   DDERR_NOTLOADED                         = HResult(_MAKE_DDHRESULT + 601);
  696.   {$EXTERNALSYM DDERR_NOTLOADED}
  697. (*
  698.  * Attempt was made to create or set a device window without first setting
  699.  * the focus window
  700.  *)
  701.   DDERR_NOFOCUSWINDOW                     = HResult(_MAKE_DDHRESULT + 602);
  702.   {$EXTERNALSYM DDERR_NOFOCUSWINDOW}
  703. (*
  704.  * Attempt was made to set a palette on a mipmap sublevel
  705.  *)
  706.   DDERR_NOTONMIPMAPSUBLEVEL               = HResult(_MAKE_DDHRESULT + 603);
  707.   {$EXTERNALSYM DDERR_NOTONMIPMAPSUBLEVEL}
  708. (*
  709.  * A DC has already been returned for this surface. Only one DC can be
  710.  * retrieved per surface.
  711.  *)
  712.   DDERR_DCALREADYCREATED                  = HResult(_MAKE_DDHRESULT + 620);
  713.   {$EXTERNALSYM DDERR_DCALREADYCREATED}
  714. (*
  715.  * An attempt was made to allocate non-local video memory from a device
  716.  * that does not support non-local video memory.
  717.  *)
  718.   DDERR_NONONLOCALVIDMEM                  = HResult(_MAKE_DDHRESULT + 630);
  719.   {$EXTERNALSYM DDERR_NONONLOCALVIDMEM}
  720. (*
  721.  * The attempt to page lock a surface failed.
  722.  *)
  723.   DDERR_CANTPAGELOCK                      = HResult(_MAKE_DDHRESULT + 640);
  724.   {$EXTERNALSYM DDERR_CANTPAGELOCK}
  725. (*
  726.  * The attempt to page unlock a surface failed.
  727.  *)
  728.   DDERR_CANTPAGEUNLOCK                    = HResult(_MAKE_DDHRESULT + 660);
  729.   {$EXTERNALSYM DDERR_CANTPAGEUNLOCK}
  730. (*
  731.  * An attempt was made to page unlock a surface with no outstanding page locks.
  732.  *)
  733.   DDERR_NOTPAGELOCKED                     = HResult(_MAKE_DDHRESULT + 680);
  734.   {$EXTERNALSYM DDERR_NOTPAGELOCKED}
  735. (*
  736.  * There is more data available than the specified buffer size could hold
  737.  *)
  738.   DDERR_MOREDATA                          = HResult(_MAKE_DDHRESULT + 690);
  739.   {$EXTERNALSYM DDERR_MOREDATA}
  740. (*
  741.  * The data has expired and is therefore no longer valid.
  742.  *)
  743.   DDERR_EXPIRED                           = HResult(_MAKE_DDHRESULT + 691);
  744.   {$EXTERNALSYM DDERR_EXPIRED}
  745. (*
  746.  * The mode test has finished executing.
  747.  *)
  748.  DDERR_TESTFINISHED                       = HResult(_MAKE_DDHRESULT + 692);
  749.  {$EXTERNALSYM DDERR_TESTFINISHED}
  750. (*
  751.  * The mode test has switched to a new mode.
  752.  *)
  753.  DDERR_NEWMODE                            = HResult(_MAKE_DDHRESULT + 693);
  754.  {$EXTERNALSYM DDERR_NEWMODE}
  755. (*
  756.  * D3D has not yet been initialized.
  757.  *)
  758.  DDERR_D3DNOTINITIALIZED                  = HResult(_MAKE_DDHRESULT + 694);
  759.  {$EXTERNALSYM DDERR_D3DNOTINITIALIZED}
  760. (*
  761.  * The video port is not active
  762.  *)
  763.   DDERR_VIDEONOTACTIVE                    = HResult(_MAKE_DDHRESULT + 695);
  764.   {$EXTERNALSYM DDERR_VIDEONOTACTIVE}
  765. (*
  766.  * The monitor does not have EDID data.
  767.  *)
  768.  DDERR_NOMONITORINFORMATION               = HResult(_MAKE_DDHRESULT + 696);
  769.  {$EXTERNALSYM DDERR_NOMONITORINFORMATION}
  770. (*
  771.  * The driver does not enumerate display mode refresh rates.
  772.  *)
  773.  DDERR_NODRIVERSUPPORT                    = HResult(_MAKE_DDHRESULT + 697);
  774.  {$EXTERNALSYM DDERR_NODRIVERSUPPORT}
  775. (*
  776.  * Surfaces created by one direct draw device cannot be used directly by
  777.  * another direct draw device.
  778.  *)
  779.   DDERR_DEVICEDOESNTOWNSURFACE            = HResult(_MAKE_DDHRESULT + 699);
  780.   {$EXTERNALSYM DDERR_DEVICEDOESNTOWNSURFACE}
  781. (*
  782.  * An attempt was made to invoke an interface member of a DirectDraw object
  783.  * created by CoCreateInstance() before it was initialized.
  784.  *)
  785.   DDERR_NOTINITIALIZED                    = CO_E_NOTINITIALIZED;
  786.   {$EXTERNALSYM DDERR_NOTINITIALIZED}
  787. (* Alpha bit depth constants *)
  788. (*
  789.  * API's
  790.  *)
  791. const
  792.   DirectDrawDll = 'ddraw.dll';
  793. type
  794.   HMonitor = THandle;
  795.   {$EXTERNALSYM HMonitor}
  796.   TDDEnumCallbackA = function (lpGUID: PGUID; lpDriverDescription: PAnsiChar;
  797.       lpDriverName: PAnsiChar; lpContext: Pointer): BOOL; stdcall;
  798.   {$EXTERNALSYM TDDEnumCallbackA}
  799.   TDDEnumCallbackW = function (lpGUID: PGUID; lpDriverDescription: PWideChar;
  800.       lpDriverName: PWideChar; lpContext: Pointer): BOOL; stdcall;
  801.   {$EXTERNALSYM TDDEnumCallbackW}
  802.   TDDEnumCallback = function (lpGUID: PGUID; lpDriverDescription: PChar;
  803.       lpDriverName: PChar; lpContext: Pointer): BOOL; stdcall;
  804.   {$EXTERNALSYM TDDEnumCallback}
  805.   TDDEnumCallbackExA = function (lpGUID: PGUID; lpDriverDescription: PAnsiChar;
  806.       lpDriverName: PAnsiChar; lpContext: Pointer; Monitor: HMonitor): BOOL;
  807.       stdcall;
  808.   {$EXTERNALSYM TDDEnumCallbackExA}
  809.   TDDEnumCallbackExW = function (lpGUID: PGUID; lpDriverDescription: PWideChar;
  810.       lpDriverName: PWideChar; lpContext: Pointer; Monitor: HMonitor): BOOL;
  811.       stdcall;
  812.   {$EXTERNALSYM TDDEnumCallbackExW}
  813.   TDDEnumCallbackEx = function (lpGUID: PGUID; lpDriverDescription: PChar;
  814.       lpDriverName: PChar; lpContext: Pointer; Monitor: HMonitor): BOOL;
  815.       stdcall;
  816.   {$EXTERNALSYM TDDEnumCallbackEx}
  817. function DirectDrawLoaded: Boolean;
  818. function UnLoadDirectDraw: Boolean;
  819. function LoadDirectDraw: Boolean;
  820. {$IFDEF DIRECTDRAW_DYNAMIC_LINK}
  821. var
  822.   DirectDrawEnumerateA : function (lpCallback: TDDEnumCallbackA;
  823.        lpContext: Pointer): HResult; stdcall;
  824.   {$EXTERNALSYM DirectDrawEnumerateA}
  825.   DirectDrawEnumerateW : function (lpCallback: TDDEnumCallbackW;
  826.        lpContext: Pointer): HResult; stdcall;
  827.   {$EXTERNALSYM DirectDrawEnumerateW}
  828.   DirectDrawEnumerate  : function (lpCallback: TDDEnumCallback;
  829.        lpContext: Pointer): HResult; stdcall;
  830.   {$EXTERNALSYM DirectDrawEnumerate}
  831.   DirectDrawEnumerateExA : function (lpCallback: TDDEnumCallbackExA;
  832.        lpContext: Pointer; dwFlags: DWORD): HResult; stdcall;
  833.   {$EXTERNALSYM DirectDrawEnumerateExA}
  834.   DirectDrawEnumerateExW : function (lpCallback: TDDEnumCallbackExW;
  835.        lpContext: Pointer; dwFlags: DWORD): HResult; stdcall;
  836.   {$EXTERNALSYM DirectDrawEnumerateExW}
  837.   DirectDrawEnumerateEx  : function (lpCallback: TDDEnumCallbackEx;
  838.        lpContext: Pointer; dwFlags: DWORD): HResult; stdcall;
  839.   {$EXTERNALSYM DirectDrawEnumerateEx}
  840.   DirectDrawCreate : function (lpGUID: PGUID;
  841.        out lplpDD: IDirectDraw;
  842.        pUnkOuter: IUnknown): HResult; stdcall;
  843.   {$EXTERNALSYM DirectDrawCreate}
  844.   DirectDrawCreateEx : function  (lpGUID: PGUID;
  845.        out lplpDD: IDirectDraw7; const iid: TGUID;
  846.        pUnkOuter: IUnknown): HResult; stdcall;
  847.   {$EXTERNALSYM DirectDrawCreateEx}
  848.   DirectDrawCreateClipper : function (dwFlags: DWORD;
  849.        out lplpDDClipper: IDirectDrawClipper;
  850.        pUnkOuter: IUnknown): HResult; stdcall;
  851.   {$EXTERNALSYM DirectDrawCreateClipper}
  852. {$ELSE}
  853. function DirectDrawEnumerateA(lpCallback: TDDEnumCallbackA; lpContext: Pointer): HResult; stdcall; external DirectDrawDll;
  854. {$EXTERNALSYM DirectDrawEnumerateA}
  855. function DirectDrawEnumerateW(lpCallback: TDDEnumCallbackW; lpContext: Pointer): HResult; stdcall; external DirectDrawDll;
  856. {$EXTERNALSYM DirectDrawEnumerateW}
  857. function DirectDrawEnumerate(lpCallback: TDDEnumCallback; lpContext: Pointer): HResult; stdcall;
  858.   external DirectDrawDll name {$IFDEF UNICODE}'DirectDrawEnumerateW'{$ELSE}'DirectDrawEnumerateA'{$ENDIF};
  859. {$EXTERNALSYM DirectDrawEnumerate}
  860. function DirectDrawEnumerateExA(lpCallback: TDDEnumCallbackExA; lpContext: Pointer; dwFlags: DWORD): HResult; stdcall; external DirectDrawDll;
  861. {$EXTERNALSYM DirectDrawEnumerateExA}
  862. function DirectDrawEnumerateExW(lpCallback: TDDEnumCallbackExW; lpContext: Pointer; dwFlags: DWORD): HResult; stdcall; external DirectDrawDll;
  863. {$EXTERNALSYM DirectDrawEnumerateExW}
  864. function DirectDrawEnumerateEx(lpCallback: TDDEnumCallbackEx; lpContext: Pointer; dwFlags: DWORD): HResult; stdcall;
  865.   external DirectDrawDll name {$IFDEF UNICODE}'DirectDrawEnumerateExW'{$ELSE}'DirectDrawEnumerateExA'{$ENDIF};
  866. {$EXTERNALSYM DirectDrawEnumerateEx}
  867. function DirectDrawCreate(lpGUID: PGUID; out lplpDD: IDirectDraw;
  868.     pUnkOuter: IUnknown): HResult; stdcall; external DirectDrawDll;
  869. {$EXTERNALSYM DirectDrawCreate}
  870. function DirectDrawCreateEx(lpGUID: PGUID; out lplpDD: IDirectDraw7;
  871.     const iid: TGUID; pUnkOuter: IUnknown): HResult; stdcall; external DirectDrawDll;
  872. {$EXTERNALSYM DirectDrawCreateEx}
  873. function DirectDrawCreateClipper(dwFlags: DWORD; out lplpDDClipper: IDirectDrawClipper;
  874.     pUnkOuter: IUnknown): HResult; stdcall; external DirectDrawDll;
  875. {$EXTERNALSYM DirectDrawCreateClipper}
  876. {$ENDIF}
  877. const
  878. (*
  879.  * Flags for DirectDrawEnumerateEx
  880.  * DirectDrawEnumerateEx supercedes DirectDrawEnumerate. You must use GetProcAddress to
  881.  * obtain a function pointer (of type LPDIRECTDRAWENUMERATEEX) to DirectDrawEnumerateEx.
  882.  * By default, only the primary display device is enumerated.
  883.  * DirectDrawEnumerate is equivalent to DirectDrawEnumerate(,,DDENUM_NONDISPLAYDEVICES)
  884.  *)
  885. (*
  886.  * This flag causes enumeration of any GDI display devices which are part of
  887.  * the Windows Desktop
  888.  *)
  889.   DDENUM_ATTACHEDSECONDARYDEVICES     = $00000001;
  890.   {$EXTERNALSYM DDENUM_ATTACHEDSECONDARYDEVICES}
  891. (*
  892.  * This flag causes enumeration of any GDI display devices which are not
  893.  * part of the Windows Desktop
  894.  *)
  895.   DDENUM_DETACHEDSECONDARYDEVICES     = $00000002;
  896.   {$EXTERNALSYM DDENUM_DETACHEDSECONDARYDEVICES}
  897. (*
  898.  * This flag causes enumeration of non-display devices
  899.  *)
  900.   DDENUM_NONDISPLAYDEVICES            = $00000004;
  901.   {$EXTERNALSYM DDENUM_NONDISPLAYDEVICES}
  902.   REGSTR_KEY_DDHW_DESCRIPTION = 'Description';
  903.   {$EXTERNALSYM REGSTR_KEY_DDHW_DESCRIPTION}
  904.   REGSTR_KEY_DDHW_DRIVERNAME  = 'DriverName';
  905.   {$EXTERNALSYM REGSTR_KEY_DDHW_DRIVERNAME}
  906.   REGSTR_PATH_DDHW            = 'HardwareDirectDrawDrivers';
  907.   {$EXTERNALSYM REGSTR_PATH_DDHW}
  908.   DDCREATE_HARDWAREONLY       = $00000001;
  909.   {$EXTERNALSYM DDCREATE_HARDWAREONLY}
  910.   DDCREATE_EMULATIONONLY      = $00000002;
  911.   {$EXTERNALSYM DDCREATE_EMULATIONONLY}
  912. (*
  913.  * Flags for the IDirectDraw4::GetDeviceIdentifier method
  914.  *)
  915. (*
  916.  * This flag causes GetDeviceIdentifier to return information about the host (typically 2D) adapter in a system equipped
  917.  * with a stacked secondary 3D adapter. Such an adapter appears to the application as if it were part of the
  918.  * host adapter, but is typically physcially located on a separate card. The stacked secondary's information is
  919.  * returned when GetDeviceIdentifier's dwFlags field is zero, since this most accurately reflects the qualities
  920.  * of the DirectDraw object involved.
  921.  *)
  922.   DDGDI_GETHOSTIDENTIFIER         = $00000001;
  923.   {$EXTERNALSYM DDGDI_GETHOSTIDENTIFIER}
  924. (*
  925.  * Macros for interpretting DDEVICEIDENTIFIER2.dwWHQLLevel
  926.  *)
  927. function GET_WHQL_YEAR(dwWHQLLevel: DWORD): DWORD;
  928. {$EXTERNALSYM GET_WHQL_YEAR}
  929. function GET_WHQL_MONTH(dwWHQLLevel: DWORD): DWORD;
  930. {$EXTERNALSYM GET_WHQL_MONTH}
  931. function GET_WHQL_DAY(dwWHQLLevel: DWORD): DWORD;
  932. {$EXTERNALSYM GET_WHQL_DAY}
  933. (*==========================================================================;
  934.  *
  935.  *  Copyright (C) 1996-1997 Microsoft Corporation.  All Rights Reserved.
  936.  *
  937.  *  File: dvp.h
  938.  *  Content: DirectDrawVideoPort include file
  939.  *
  940.  ***************************************************************************)
  941. const
  942. (*
  943.  * GUIDS used by DirectDrawVideoPort objects
  944.  *)
  945. (*
  946.   IID_IDDVideoPortContainer,
  947.   IID_IDirectDrawVideoPort,
  948.   IID_IDirectDrawVideoPortNotify
  949.     - are defined later in Delphi header
  950. *)
  951.   DDVPTYPE_E_HREFH_VREFH: TGUID = (D1:$54F39980;D2:$DA60;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
  952.   {$EXTERNALSYM DDVPTYPE_E_HREFH_VREFH}
  953.   DDVPTYPE_E_HREFH_VREFL: TGUID = (D1:$92783220;D2:$DA60;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
  954.   {$EXTERNALSYM DDVPTYPE_E_HREFH_VREFL}
  955.   DDVPTYPE_E_HREFL_VREFH: TGUID = (D1:$A07A02E0;D2:$DA60;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
  956.   {$EXTERNALSYM DDVPTYPE_E_HREFL_VREFH}
  957.   DDVPTYPE_E_HREFL_VREFL: TGUID = (D1:$E09C77E0;D2:$DA60;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
  958.   {$EXTERNALSYM DDVPTYPE_E_HREFL_VREFL}
  959.   DDVPTYPE_CCIR656:       TGUID = (D1:$FCA326A0;D2:$DA60;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
  960.   {$EXTERNALSYM DDVPTYPE_CCIR656}
  961.   DDVPTYPE_BROOKTREE:     TGUID = (D1:$1352A560;D2:$DA61;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
  962.   {$EXTERNALSYM DDVPTYPE_BROOKTREE}
  963.   DDVPTYPE_PHILIPS:       TGUID = (D1:$332CF160;D2:$DA61;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
  964.   {$EXTERNALSYM DDVPTYPE_PHILIPS}
  965. (*
  966.  * These definitions are required to allow polymorphic structure members (i.e. those
  967.  * that are referred to both as DWORDs and as pointers) to resolve into a type
  968.  * of correct size to hold the largest of those two types (i.e. pointer) on 64 bit
  969.  * systems. For 32 bit environments, ULONG_PTR resolves to a DWORD.
  970.  *)
  971. type
  972.   ULONG_PTR = DWORD;
  973.   {$EXTERNALSYM ULONG_PTR}
  974. (*============================================================================
  975.  *
  976.  * DirectDraw Structures
  977.  *
  978.  * Various structures used to invoke DirectDraw.
  979.  *
  980.  *==========================================================================*)
  981. type
  982. (*
  983.  * DDVIDEOPORTCONNECT
  984.  *)
  985.   PDDVideoPortConnect = ^TDDVideoPortConnect;
  986.   _DDVIDEOPORTCONNECT = packed record
  987.     dwSize: DWORD;              // size of the TDDVideoPortConnect structure
  988.     dwPortWidth: DWORD;         // Width of the video port
  989.     guidTypeID: TGUID;          // Description of video port connection
  990.     dwFlags: DWORD;             // Connection flags
  991.     dwReserved1: ULONG_PTR;     // Reserved, set to zero.
  992.   end;
  993.   {$EXTERNALSYM _DDVIDEOPORTCONNECT}
  994.   DDVIDEOPORTCONNECT = _DDVIDEOPORTCONNECT;
  995.   {$EXTERNALSYM DDVIDEOPORTCONNECT}
  996.   TDDVideoPortConnect = _DDVIDEOPORTCONNECT;
  997. (*
  998.  * DDVIDEOPORTCAPS
  999.  *)
  1000.   PDDVideoPortCaps = ^TDDVideoPortCaps;
  1001.   _DDVIDEOPORTCAPS = packed record
  1002.     dwSize: DWORD;                          // size of the TDDVideoPortCaps structure
  1003.     dwFlags: DWORD;                         // indicates which fields contain data
  1004.     dwMaxWidth: DWORD;                      // max width of the video port field
  1005.     dwMaxVBIWidth: DWORD;                   // max width of the VBI data
  1006.     dwMaxHeight: DWORD;                     // max height of the video port field
  1007.     dwVideoPortID: DWORD;                   // Video port ID (0 - (dwMaxVideoPorts -1))
  1008.     dwCaps: DWORD;                          // Video port capabilities
  1009.     dwFX: DWORD;                            // More video port capabilities
  1010.     dwNumAutoFlipSurfaces: DWORD;           // Number of autoflippable surfaces
  1011.     dwAlignVideoPortBoundary: DWORD;        // Byte restriction of placement within the surface
  1012.     dwAlignVideoPortPrescaleWidth: DWORD;   // Byte restriction of width after prescaling
  1013.     dwAlignVideoPortCropBoundary: DWORD;    // Byte restriction of left cropping
  1014.     dwAlignVideoPortCropWidth: DWORD;       // Byte restriction of cropping width
  1015.     dwPreshrinkXStep: DWORD;                // Width can be shrunk in steps of 1/x
  1016.     dwPreshrinkYStep: DWORD;                // Height can be shrunk in steps of 1/x
  1017.     dwNumVBIAutoFlipSurfaces: DWORD;        // Number of VBI autoflippable surfaces allowed
  1018.     dwNumPreferredAutoflip: DWORD;          // Optimal number of autoflippable surfaces for hardware
  1019.     wNumFilterTapsX: Word;                  // Number of taps the prescaler uses in the X direction (0 - no prescale, 1 - replication, etc.)
  1020.     wNumFilterTapsY: Word;                  // Number of taps the prescaler uses in the Y direction (0 - no prescale, 1 - replication, etc.)
  1021.   end;
  1022.   {$EXTERNALSYM _DDVIDEOPORTCAPS}
  1023.   DDVIDEOPORTCAPS = _DDVIDEOPORTCAPS;
  1024.   {$EXTERNALSYM DDVIDEOPORTCAPS}
  1025.   TDDVideoPortCaps = _DDVIDEOPORTCAPS;
  1026. const
  1027. (*
  1028.  * The dwMaxWidth and dwMaxVBIWidth members are valid
  1029.  *)
  1030.   DDVPD_WIDTH = $00000001;
  1031.   {$EXTERNALSYM DDVPD_WIDTH}
  1032. (*
  1033.  * The dwMaxHeight member is valid
  1034.  *)
  1035.   DDVPD_HEIGHT = $00000002;
  1036.   {$EXTERNALSYM DDVPD_HEIGHT}
  1037. (*
  1038.  * The dwVideoPortID member is valid
  1039.  *)
  1040.   DDVPD_ID = $00000004;
  1041.   {$EXTERNALSYM DDVPD_ID}
  1042. (*
  1043.  * The dwCaps member is valid
  1044.  *)
  1045.   DDVPD_CAPS = $00000008;
  1046.   {$EXTERNALSYM DDVPD_CAPS}
  1047. (*
  1048.  * The dwFX member is valid
  1049.  *)
  1050.   DDVPD_FX = $00000010;
  1051.   {$EXTERNALSYM DDVPD_FX}
  1052. (*
  1053.  * The dwNumAutoFlipSurfaces member is valid
  1054.  *)
  1055.   DDVPD_AUTOFLIP = $00000020;
  1056.   {$EXTERNALSYM DDVPD_AUTOFLIP}
  1057. (*
  1058.  * All of the alignment members are valid
  1059.  *)
  1060.   DDVPD_ALIGN = $00000040;
  1061.   {$EXTERNALSYM DDVPD_ALIGN}
  1062. (*
  1063.  * The dwNumPreferredAutoflip member is valid
  1064.  *)
  1065.   DDVPD_PREFERREDAUTOFLIP = $00000080;
  1066.   {$EXTERNALSYM DDVPD_PREFERREDAUTOFLIP}
  1067. (*
  1068.  * The wNumFilterTapsX and wNumFilterTapsY fields are valid
  1069.  *)
  1070.   DDVPD_FILTERQUALITY     = $00000100;
  1071.   {$EXTERNALSYM DDVPD_FILTERQUALITY}
  1072. type
  1073. (*
  1074.  * DDVIDEOPORTDESC
  1075.  *)
  1076.   PDDVideoPortDesc = ^TDDVideoPortDesc;
  1077.   _DDVIDEOPORTDESC = packed record
  1078.     dwSize: DWORD;                       // size of the TDDVideoPortDesc structure
  1079.     dwFieldWidth: DWORD;                 // width of the video port field
  1080.     dwVBIWidth: DWORD;                   // width of the VBI data
  1081.     dwFieldHeight: DWORD;                // height of the video port field
  1082.     dwMicrosecondsPerField: DWORD;       // Microseconds per video field
  1083.     dwMaxPixelsPerSecond: DWORD;         // Maximum pixel rate per second
  1084.     dwVideoPortID: DWORD;                // Video port ID (0 - (dwMaxVideoPorts -1))
  1085.     dwReserved1: DWORD;                  // Reserved for future use - set to zero (struct padding)
  1086.     VideoPortType: TDDVideoPortConnect;  // Description of video port connection
  1087.     dwReserved2: DWORD;                  // Reserved for future use - set to zero
  1088.     dwReserved3: DWORD;                  // Reserved for future use - set to zero
  1089.   end;
  1090.   {$EXTERNALSYM _DDVIDEOPORTDESC}
  1091.   DDVIDEOPORTDESC = _DDVIDEOPORTDESC;
  1092.   {$EXTERNALSYM DDVIDEOPORTDESC}
  1093.   TDDVideoPortDesc = _DDVIDEOPORTDESC;
  1094. (*
  1095.  * DDVIDEOPORTINFO
  1096.  *)
  1097.   PDDVideoPortInfo = ^TDDVideoPortInfo;
  1098.   _DDVIDEOPORTINFO = packed record
  1099.     dwSize: DWORD;                            // Size of the structure
  1100.     dwOriginX: DWORD;                         // Placement of the video data within the surface.
  1101.     dwOriginY: DWORD;                         // Placement of the video data within the surface.
  1102.     dwVPFlags: DWORD;                         // Video port options
  1103.     rCrop: TRect;                             // Cropping rectangle (optional).
  1104.     dwPrescaleWidth: DWORD;                   // Determines pre-scaling/zooming in the X direction (optional).
  1105.     dwPrescaleHeight: DWORD;                  // Determines pre-scaling/zooming in the Y direction (optional).
  1106.     lpddpfInputFormat: PDDPixelFormat;        // Video format written to the video port
  1107.     lpddpfVBIInputFormat: PDDPixelFormat;     // Input format of the VBI data
  1108.     lpddpfVBIOutputFormat: PDDPixelFormat;    // Output format of the data
  1109.     dwVBIHeight: DWORD;                       // Specifies the number of lines of data within the vertical blanking interval.
  1110.     dwReserved1: DWORD;                       // Reserved for future use - set to zero
  1111.     dwReserved2: DWORD;                       // Reserved for future use - set to zero
  1112.   end;
  1113.   {$EXTERNALSYM _DDVIDEOPORTINFO}
  1114.   DDVIDEOPORTINFO = _DDVIDEOPORTINFO;
  1115.   {$EXTERNALSYM DDVIDEOPORTINFO}
  1116.   TDDVideoPortInfo = _DDVIDEOPORTINFO;
  1117. (*
  1118.  * DDVIDEOPORTBANDWIDTH
  1119.  *)
  1120.   PDDVideoPortBandWidth = ^TDDVideoPortBandWidth;
  1121.   _DDVIDEOPORTBANDWIDTH = packed record
  1122.     dwSize: DWORD;                 // Size of the structure
  1123.     dwCaps: DWORD;
  1124.     dwOverlay: DWORD;              // Zoom factor at which overlay is supported
  1125.     dwColorkey: DWORD;             // Zoom factor at which overlay w/ colorkey is supported
  1126.     dwYInterpolate: DWORD;         // Zoom factor at which overlay w/ Y interpolation is supported
  1127.     dwYInterpAndColorkey: DWORD;   // Zoom factor at which ovelray w/ Y interpolation and colorkeying is supported
  1128.     dwReserved1: DWORD;            // Reserved for future use - set to zero
  1129.     dwReserved2: DWORD;            // Reserved for future use - set to zero
  1130.   end;
  1131.   {$EXTERNALSYM _DDVIDEOPORTBANDWIDTH}
  1132.   DDVIDEOPORTBANDWIDTH = _DDVIDEOPORTBANDWIDTH;
  1133.   {$EXTERNALSYM DDVIDEOPORTBANDWIDTH}
  1134.   TDDVideoPortBandWidth = _DDVIDEOPORTBANDWIDTH;
  1135. (*
  1136.  * DDVIDEOPORTSTATUS
  1137.  *)
  1138.   PDDVideoPortStatus = ^TDDVideoPortStatus;
  1139.   _DDVIDEOPORTSTATUS = record
  1140.     dwSize: DWORD;                       // Size of the structure
  1141.     bInUse: BOOL;                        // TRUE if video port is currently being used
  1142.     dwFlags: DWORD;                      // Currently not used
  1143.     dwReserved1: DWORD;                  // Reserved for future use
  1144.     VideoPortType: TDDVideoPortConnect;  // Information about the connection
  1145.     dwReserved2: DWORD;                  // Reserved for future use
  1146.     dwReserved3: DWORD;                  // Reserved for future use
  1147.   end;
  1148.   {$EXTERNALSYM _DDVIDEOPORTSTATUS}
  1149.   DDVIDEOPORTSTATUS = _DDVIDEOPORTSTATUS;
  1150.   {$EXTERNALSYM DDVIDEOPORTSTATUS}
  1151.   TDDVideoPortStatus = _DDVIDEOPORTSTATUS;
  1152. (*
  1153.  * DDVIDEOPORTNOTIFY
  1154.  *)
  1155.   PDDVideoPortNotify = ^TDDVideoPortNotify;
  1156.   _DDVIDEOPORTNOTIFY = packed record
  1157.     ApproximateTimeStamp: Int64;        // Timestamp in the event notification
  1158.     lField: Longint;                    // 0 if even, 1 if odd, -1 if unknown
  1159.     dwSurfaceIndex: Longword;           // Index in the surface chain of the surface that received the sample
  1160.     lDone: Longint;                     // Call InterlockedIncrement on this when done with sample
  1161.   end;
  1162.   {$EXTERNALSYM _DDVIDEOPORTNOTIFY}
  1163.   DDVIDEOPORTNOTIFY = _DDVIDEOPORTNOTIFY;
  1164.   {$EXTERNALSYM DDVIDEOPORTNOTIFY}
  1165.   TDDVideoPortNotify = _DDVIDEOPORTNOTIFY;
  1166. (*============================================================================
  1167.  *
  1168.  * Video Port Flags
  1169.  *
  1170.  * All flags are bit flags.
  1171.  *
  1172.  *==========================================================================*)
  1173. const
  1174. (****************************************************************************
  1175.  *
  1176.  * VIDEOPORT DDVIDEOPORTCONNECT / TDDVideoPortConnect FLAGS
  1177.  *
  1178.  ****************************************************************************)
  1179. (*
  1180.  * When this is set by the driver and passed to the client, this
  1181.  * indicates that the video port is capable of double clocking the data.
  1182.  * When this is set by the client, this indicates that the video port
  1183.  * should enable double clocking.  This flag is only valid with external
  1184.  * syncs.
  1185.  *)
  1186.   DDVPCONNECT_DOUBLECLOCK = $00000001;
  1187.   {$EXTERNALSYM DDVPCONNECT_DOUBLECLOCK}
  1188. (*
  1189.  * When this is set by the driver and passed to the client, this
  1190.  * indicates that the video port is capable of using an external VACT
  1191.  * signal. When this is set by the client, this indicates that the
  1192.  * video port should use the external VACT signal.
  1193.  *)
  1194.   DDVPCONNECT_VACT = $00000002;
  1195.   {$EXTERNALSYM DDVPCONNECT_VACT}
  1196. (*
  1197.  * When this is set by the driver and passed to the client, this
  1198.  * indicates that the video port is capable of treating even fields
  1199.  * like odd fields and visa versa.  When this is set by the client,
  1200.  * this indicates that the video port should treat even fields like odd
  1201.  * fields.
  1202.  *)
  1203.   DDVPCONNECT_INVERTPOLARITY = $00000004;
  1204.   {$EXTERNALSYM DDVPCONNECT_INVERTPOLARITY}
  1205. (*
  1206.  * Indicates that any data written to the video port during the VREF
  1207.  * period will not be written into the frame buffer. This flag is read only.
  1208.  *)
  1209.   DDVPCONNECT_DISCARDSVREFDATA = $00000008;
  1210.   {$EXTERNALSYM DDVPCONNECT_DISCARDSVREFDATA}
  1211. (*
  1212.  * When this is set be the driver and passed to the client, this
  1213.  * indicates that the device will write half lines into the frame buffer
  1214.  * if half lines are provided by the decoder.  If this is set by the client,
  1215.  * this indicates that the decoder will be supplying half lines.
  1216.  *)
  1217.   DDVPCONNECT_HALFLINE = $00000010;
  1218.   {$EXTERNALSYM DDVPCONNECT_HALFLINE}
  1219. (*
  1220.  * Indicates that the signal is interlaced. This flag is only
  1221.  * set by the client.
  1222.  *)
  1223.   DDVPCONNECT_INTERLACED = $00000020;
  1224.   {$EXTERNALSYM DDVPCONNECT_INTERLACED}
  1225. (*
  1226.  * Indicates that video port is shareable and that this video port
  1227.  * will use the even fields.  This flag is only set by the client.
  1228.  *)
  1229.   DDVPCONNECT_SHAREEVEN = $00000040;
  1230.   {$EXTERNALSYM DDVPCONNECT_SHAREEVEN}
  1231. (*
  1232.  * Indicates that video port is shareable and that this video port
  1233.  * will use the odd fields.  This flag is only set by the client.
  1234.  *)
  1235.   DDVPCONNECT_SHAREODD = $00000080;
  1236.   {$EXTERNALSYM DDVPCONNECT_SHAREODD}
  1237. (****************************************************************************
  1238.  *
  1239.  * VIDEOPORT DDVIDEOPORTDESC / TDDVideoPortDesc CAPS
  1240.  *
  1241.  ****************************************************************************)
  1242. (*
  1243.  * Flip can be performed automatically to avoid tearing.
  1244.  *)
  1245.   DDVPCAPS_AUTOFLIP = $00000001;
  1246.   {$EXTERNALSYM DDVPCAPS_AUTOFLIP}
  1247. (*
  1248.  * Supports interlaced video
  1249.  *)
  1250.   DDVPCAPS_INTERLACED = $00000002;
  1251.   {$EXTERNALSYM DDVPCAPS_INTERLACED}
  1252. (*
  1253.  * Supports non-interlaced video
  1254.  *)
  1255.   DDVPCAPS_NONINTERLACED = $00000004;
  1256.   {$EXTERNALSYM DDVPCAPS_NONINTERLACED}
  1257. (*
  1258.  * Indicates that the device can return whether the current field
  1259.  * of an interlaced signal is even or odd.
  1260.  *)
  1261.   DDVPCAPS_READBACKFIELD = $00000008;
  1262.   {$EXTERNALSYM DDVPCAPS_READBACKFIELD}
  1263. (*
  1264.  * Indicates that the device can return the current line of video
  1265.  * being written into the frame buffer.
  1266.  *)
  1267.   DDVPCAPS_READBACKLINE = $00000010;
  1268.   {$EXTERNALSYM DDVPCAPS_READBACKLINE}
  1269. (*
  1270.  * Allows two gen-locked video streams to share a single video port,
  1271.  * where one stream uses the even fields and the other uses the odd
  1272.  * fields. Separate parameters (including address, scaling,
  1273.  * cropping, etc.) are maintained for both fields.)
  1274.  *)
  1275.   DDVPCAPS_SHAREABLE = $00000020;
  1276.   {$EXTERNALSYM DDVPCAPS_SHAREABLE}
  1277. (*
  1278.  * Even fields of video can be automatically discarded.
  1279.  *)
  1280.   DDVPCAPS_SKIPEVENFIELDS = $00000040;
  1281.   {$EXTERNALSYM DDVPCAPS_SKIPEVENFIELDS}
  1282. (*
  1283.  * Odd fields of video can be automatically discarded.
  1284.  *)
  1285.   DDVPCAPS_SKIPODDFIELDS = $00000080;
  1286.   {$EXTERNALSYM DDVPCAPS_SKIPODDFIELDS}
  1287. (*
  1288.  * Indicates that the device is capable of driving the graphics
  1289.  * VSYNC with the video port VSYNC.
  1290.  *)
  1291.   DDVPCAPS_SYNCMASTER = $00000100;
  1292.   {$EXTERNALSYM DDVPCAPS_SYNCMASTER}
  1293. (*
  1294.  * Indicates that data within the vertical blanking interval can
  1295.  * be written to a different surface.
  1296.  *)
  1297.   DDVPCAPS_VBISURFACE = $00000200;
  1298.   {$EXTERNALSYM DDVPCAPS_VBISURFACE}
  1299. (*
  1300.  * Indicates that the video port can perform color operations
  1301.  * on the incoming data before it is written to the frame buffer.
  1302.  *)
  1303.   DDVPCAPS_COLORCONTROL = $00000400;
  1304.   {$EXTERNALSYM DDVPCAPS_COLORCONTROL}
  1305. (*
  1306.  * Indicates that the video port can accept VBI data in a different
  1307.  * width or format than the regular video data.
  1308.  *)
  1309.   DDVPCAPS_OVERSAMPLEDVBI = $00000800;
  1310.   {$EXTERNALSYM DDVPCAPS_OVERSAMPLEDVBI}
  1311. (*
  1312.  * Indicates that the video port can write data directly to system memory
  1313.  *)
  1314.   DDVPCAPS_SYSTEMMEMORY = $00001000;
  1315.   {$EXTERNALSYM DDVPCAPS_SYSTEMMEMORY}
  1316. (*
  1317.  * Indicates that the VBI and video portions of the video stream can
  1318.  * be controlled by an independent processes.
  1319.  *)
  1320.   DDVPCAPS_VBIANDVIDEOINDEPENDENT = $00002000;
  1321.   {$EXTERNALSYM DDVPCAPS_VBIANDVIDEOINDEPENDENT}
  1322. (*
  1323.  * Indicates that the video port contains high quality hardware
  1324.  * de-interlacing hardware that should be used instead of the
  1325.  * bob/weave algorithms.
  1326.  *)
  1327.   DDVPCAPS_HARDWAREDEINTERLACE = $00004000;
  1328.   {$EXTERNALSYM DDVPCAPS_HARDWAREDEINTERLACE}
  1329. (****************************************************************************
  1330.  *
  1331.  * VIDEOPORT DDVIDEOPORTDESC / TDDVideoPortDesc FX
  1332.  *
  1333.  ****************************************************************************)
  1334. (*
  1335.  * Limited cropping is available to crop out the vertical interval data.
  1336.  *)
  1337.   DDVPFX_CROPTOPDATA = $00000001;
  1338.   {$EXTERNALSYM DDVPFX_CROPTOPDATA}
  1339. (*
  1340.  * Incoming data can be cropped in the X direction before it is written
  1341.  * to the surface.
  1342.  *)
  1343.   DDVPFX_CROPX = $00000002;
  1344.   {$EXTERNALSYM DDVPFX_CROPX}
  1345. (*
  1346.  * Incoming data can be cropped in the Y direction before it is written
  1347.  * to the surface.
  1348.  *)
  1349.   DDVPFX_CROPY = $00000004;
  1350.   {$EXTERNALSYM DDVPFX_CROPY}
  1351. (*
  1352.  * Supports interleaving interlaced fields in memory.
  1353.  *)
  1354.   DDVPFX_INTERLEAVE = $00000008;
  1355.   {$EXTERNALSYM DDVPFX_INTERLEAVE}
  1356. (*
  1357.  * Supports mirroring left to right as the video data is written
  1358.  * into the frame buffer.
  1359.  *)
  1360.   DDVPFX_MIRRORLEFTRIGHT = $00000010;
  1361.   {$EXTERNALSYM DDVPFX_MIRRORLEFTRIGHT}
  1362. (*
  1363.  * Supports mirroring top to bottom as the video data is written
  1364.  * into the frame buffer.
  1365.  *)
  1366.   DDVPFX_MIRRORUPDOWN = $00000020;
  1367.   {$EXTERNALSYM DDVPFX_MIRRORUPDOWN}
  1368. (*
  1369.  * Data can be arbitrarily shrunk in the X direction before it
  1370.  * is written to the surface.
  1371.  *)
  1372.   DDVPFX_PRESHRINKX = $00000040;
  1373.   {$EXTERNALSYM DDVPFX_PRESHRINKX}
  1374. (*
  1375.  * Data can be arbitrarily shrunk in the Y direction before it
  1376.  * is written to the surface.
  1377.  *)
  1378.   DDVPFX_PRESHRINKY = $00000080;
  1379.   {$EXTERNALSYM DDVPFX_PRESHRINKY}
  1380. (*
  1381.  * Data can be binary shrunk (1/2, 1/4, 1/8, etc.) in the X
  1382.  * direction before it is written to the surface.
  1383.  *)
  1384.   DDVPFX_PRESHRINKXB = $00000100;
  1385.   {$EXTERNALSYM DDVPFX_PRESHRINKXB}
  1386. (*
  1387.  * Data can be binary shrunk (1/2, 1/4, 1/8, etc.) in the Y
  1388.  * direction before it is written to the surface.
  1389.  *)
  1390.   DDVPFX_PRESHRINKYB = $00000200;
  1391.   {$EXTERNALSYM DDVPFX_PRESHRINKYB}
  1392. (*
  1393.  * Data can be shrunk in increments of 1/x in the X direction
  1394.  * (where X is specified in the TDDVideoPortCaps.dwPreshrinkXStep)
  1395.  * before it is written to the surface.
  1396.  *)
  1397.   DDVPFX_PRESHRINKXS = $00000400;
  1398.   {$EXTERNALSYM DDVPFX_PRESHRINKXS}
  1399. (*
  1400.  * Data can be shrunk in increments of 1/x in the Y direction
  1401.  * (where X is specified in the TDDVideoPortCaps.dwPreshrinkYStep)
  1402.  * before it is written to the surface.
  1403.  *)
  1404.   DDVPFX_PRESHRINKYS = $00000800;
  1405.   {$EXTERNALSYM DDVPFX_PRESHRINKYS}
  1406. (*
  1407.  * Data can be arbitrarily stretched in the X direction before
  1408.  * it is written to the surface.
  1409.  *)
  1410.   DDVPFX_PRESTRETCHX = $00001000;
  1411.   {$EXTERNALSYM DDVPFX_PRESTRETCHX}
  1412. (*
  1413.  * Data can be arbitrarily stretched in the Y direction before
  1414.  * it is written to the surface.
  1415.  *)
  1416.   DDVPFX_PRESTRETCHY = $00002000;
  1417.   {$EXTERNALSYM DDVPFX_PRESTRETCHY}
  1418. (*
  1419.  * Data can be integer stretched in the X direction before it is
  1420.  * written to the surface.
  1421.  *)
  1422.   DDVPFX_PRESTRETCHXN = $00004000;
  1423.   {$EXTERNALSYM DDVPFX_PRESTRETCHXN}
  1424. (*
  1425.  * Data can be integer stretched in the Y direction before it is
  1426.  * written to the surface.
  1427.  *)
  1428.   DDVPFX_PRESTRETCHYN = $00008000;
  1429.   {$EXTERNALSYM DDVPFX_PRESTRETCHYN}
  1430. (*
  1431.  * Indicates that data within the vertical blanking interval can
  1432.  * be converted independently of the remaining video data.
  1433.  *)
  1434.   DDVPFX_VBICONVERT = $00010000;
  1435.   {$EXTERNALSYM DDVPFX_VBICONVERT}
  1436. (*
  1437.  * Indicates that scaling can be disabled for data within the
  1438.  * vertical blanking interval.
  1439.  *)
  1440.   DDVPFX_VBINOSCALE = $00020000;
  1441.   {$EXTERNALSYM DDVPFX_VBINOSCALE}
  1442. (*
  1443.  * Indicates that the video data can ignore the left and right
  1444.  * cropping coordinates when cropping oversampled VBI data.
  1445.  *)
  1446.   DDVPFX_IGNOREVBIXCROP = $00040000;
  1447.   {$EXTERNALSYM DDVPFX_IGNOREVBIXCROP}
  1448. (*
  1449.  * Indicates that interleaving can be disabled for data within the
  1450.  * vertical blanking interval.
  1451.  *)
  1452.   DDVPFX_VBINOINTERLEAVE     = $00080000;
  1453.   {$EXTERNALSYM DDVPFX_VBINOINTERLEAVE}
  1454. (****************************************************************************
  1455.  *
  1456.  * VIDEOPORT DDVIDEOPORTINFO / TDDVideoPortInfo FLAGS
  1457.  *
  1458.  ****************************************************************************)
  1459. (*
  1460.  * Perform automatic flipping.   Auto-flipping is performed between
  1461.  * the overlay surface that was attached to the video port using
  1462.  * IDirectDrawVideoPort::AttachSurface and the overlay surfaces that
  1463.  * are attached to the surface via the IDirectDrawSurface::AttachSurface
  1464.  * method.  The flip order is the order in which the overlay surfaces
  1465.  * were. attached.
  1466.  *)
  1467.   DDVP_AUTOFLIP = $00000001;
  1468.   {$EXTERNALSYM DDVP_AUTOFLIP}
  1469. (*
  1470.  * Perform conversion using the ddpfOutputFormat information.
  1471.  *)
  1472.   DDVP_CONVERT = $00000002;
  1473.   {$EXTERNALSYM DDVP_CONVERT}
  1474. (*
  1475.  * Perform cropping using the specified rectangle.
  1476.  *)
  1477.   DDVP_CROP = $00000004;
  1478.   {$EXTERNALSYM DDVP_CROP}
  1479. (*
  1480.  * Indicates that interlaced fields should be interleaved in memory.
  1481.  *)
  1482.   DDVP_INTERLEAVE = $00000008;
  1483.   {$EXTERNALSYM DDVP_INTERLEAVE}
  1484. (*
  1485.  * Indicates that the data should be mirrored left to right as it's
  1486.  * written into the frame buffer.
  1487.  *)
  1488.   DDVP_MIRRORLEFTRIGHT = $00000010;
  1489.   {$EXTERNALSYM DDVP_MIRRORLEFTRIGHT}
  1490. (*
  1491.  * Indicates that the data should be mirrored top to bottom as it's
  1492.  * written into the frame buffer.
  1493.  *)
  1494.   DDVP_MIRRORUPDOWN = $00000020;
  1495.   {$EXTERNALSYM DDVP_MIRRORUPDOWN}
  1496. (*
  1497.  * Perform pre-scaling/zooming based on the pre-scale parameters.
  1498.  *)
  1499.   DDVP_PRESCALE = $00000040;
  1500.   {$EXTERNALSYM DDVP_PRESCALE}
  1501. (*
  1502.  * Ignore input of even fields.
  1503.  *)
  1504.   DDVP_SKIPEVENFIELDS = $00000080;
  1505.   {$EXTERNALSYM DDVP_SKIPEVENFIELDS}
  1506. (*
  1507.  * Ignore input of odd fields.
  1508.  *)
  1509.   DDVP_SKIPODDFIELDS = $00000100;
  1510.   {$EXTERNALSYM DDVP_SKIPODDFIELDS}
  1511. (*
  1512.  * Drive the graphics VSYNCs using the video port VYSNCs.
  1513.  *)
  1514.   DDVP_SYNCMASTER = $00000200;
  1515.   {$EXTERNALSYM DDVP_SYNCMASTER}
  1516. (*
  1517.  * The ddpfVBIOutputFormatFormat member contains data that should be used
  1518.  * to convert the data within the vertical blanking interval.
  1519.  *)
  1520.   DDVP_VBICONVERT = $00000400;
  1521.   {$EXTERNALSYM DDVP_VBICONVERT}
  1522. (*
  1523.  * Indicates that data within the vertical blanking interval
  1524.  * should not be scaled.
  1525.  *)
  1526.   DDVP_VBINOSCALE = $00000800;
  1527.   {$EXTERNALSYM DDVP_VBINOSCALE}
  1528. (*
  1529.  * Indicates that these bob/weave decisions should not be
  1530.  * overriden by other interfaces.
  1531.  *)
  1532.   DDVP_OVERRIDEBOBWEAVE = $00001000;
  1533.   {$EXTERNALSYM DDVP_OVERRIDEBOBWEAVE}
  1534. (*
  1535.  * Indicates that the video data should ignore the left and right
  1536.  * cropping coordinates when cropping the VBI data.
  1537.  *)
  1538.   DDVP_IGNOREVBIXCROP = $00002000;
  1539.   {$EXTERNALSYM DDVP_IGNOREVBIXCROP}
  1540. (*
  1541.  * Indicates that interleaving can be disabled for data within the
  1542.  * vertical blanking interval.
  1543.  *)
  1544.   DDVP_VBINOINTERLEAVE = $00004000;
  1545.   {$EXTERNALSYM DDVP_VBINOINTERLEAVE}
  1546. (*
  1547.  * Indicates that the video port should use the hardware
  1548.  * de-interlacing hardware.
  1549.  *)
  1550.   DDVP_HARDWAREDEINTERLACE = $00008000;
  1551.   {$EXTERNALSYM DDVP_HARDWAREDEINTERLACE}
  1552. (****************************************************************************
  1553.  *
  1554.  * DIRIRECTDRAWVIDEOPORT GETINPUTFORMAT/GETOUTPUTFORMAT FLAGS
  1555.  *
  1556.  ****************************************************************************)
  1557. (*
  1558.  * Return formats for the video data
  1559.  *)
  1560.   DDVPFORMAT_VIDEO = $00000001;
  1561.   {$EXTERNALSYM DDVPFORMAT_VIDEO}
  1562. (*
  1563.  * Return formats for the VBI data
  1564.  *)
  1565.   DDVPFORMAT_VBI = $00000002;
  1566.   {$EXTERNALSYM DDVPFORMAT_VBI}
  1567. (****************************************************************************
  1568.  *
  1569.  * DIRIRECTDRAWVIDEOPORT SETTARGETSURFACE FLAGS
  1570.  *
  1571.  ****************************************************************************)
  1572. (*
  1573.  * Surface should receive video data (and VBI data if a surface
  1574.  * is not explicitly attached for that purpose)
  1575.  *)
  1576.   DDVPTARGET_VIDEO = $00000001;
  1577.   {$EXTERNALSYM DDVPTARGET_VIDEO}
  1578. (*
  1579.  * Surface should receive VBI data
  1580.  *)
  1581.   DDVPTARGET_VBI = $00000002;
  1582.   {$EXTERNALSYM DDVPTARGET_VBI}
  1583. (****************************************************************************
  1584.  *
  1585.  * DIRIRECTDRAWVIDEOPORT WAITFORSYNC FLAGS
  1586.  *
  1587.  ****************************************************************************)
  1588. (*
  1589.  * Waits until the beginning of the next VSYNC
  1590.  *)
  1591.   DDVPWAIT_BEGIN = $00000001;
  1592.   {$EXTERNALSYM DDVPWAIT_BEGIN}
  1593. (*
  1594.  * Waits until the end of the next/current VSYNC
  1595.  *)
  1596.   DDVPWAIT_END = $00000002;
  1597.   {$EXTERNALSYM DDVPWAIT_END}
  1598. (*
  1599.  * Waits until the beginning of the specified line
  1600.  *)
  1601.   DDVPWAIT_LINE = $00000003;
  1602.   {$EXTERNALSYM DDVPWAIT_LINE}
  1603. (****************************************************************************
  1604.  *
  1605.  * DIRECTDRAWVIDEOPORT FLIP FLAGS
  1606.  *
  1607.  ****************************************************************************)
  1608. (*
  1609.  * Flips the normal video surface
  1610.  *)
  1611.   DDVPFLIP_VIDEO = $00000001;
  1612.   {$EXTERNALSYM DDVPFLIP_VIDEO}
  1613. (*
  1614.  * Flips the VBI surface
  1615.  *)
  1616.   DDVPFLIP_VBI = $00000002;
  1617.   {$EXTERNALSYM DDVPFLIP_VBI}
  1618. (****************************************************************************
  1619.  *
  1620.  * DIRIRECTDRAWVIDEOPORT GETVIDEOSIGNALSTATUS VALUES
  1621.  *
  1622.  ****************************************************************************)
  1623. (*
  1624.  * No video signal is present at the video port
  1625.  *)
  1626.   DDVPSQ_NOSIGNAL = $00000001;
  1627.   {$EXTERNALSYM DDVPSQ_NOSIGNAL}
  1628. (*
  1629.  * A valid video signal is present at the video port
  1630.  *)
  1631.   DDVPSQ_SIGNALOK = $00000002;
  1632.   {$EXTERNALSYM DDVPSQ_SIGNALOK}
  1633. (****************************************************************************
  1634.  *
  1635.  * VIDEOPORTBANDWIDTH Flags
  1636.  *
  1637.  ****************************************************************************)
  1638. (*
  1639.  * The specified height/width refer to the size of the video port data
  1640.  * written into memory, after prescaling has occured.
  1641.  *)
  1642.   DDVPB_VIDEOPORT = $00000001;
  1643.   {$EXTERNALSYM DDVPB_VIDEOPORT}
  1644. (*
  1645.  * The specified height/width refer to the source size of the overlay.
  1646.  *)
  1647.   DDVPB_OVERLAY = $00000002;
  1648.   {$EXTERNALSYM DDVPB_OVERLAY}
  1649. (*
  1650.  * This is a query for the device to return which caps this device requires.
  1651.  *)
  1652.   DDVPB_TYPE = $00000004;
  1653.   {$EXTERNALSYM DDVPB_TYPE}
  1654. (****************************************************************************
  1655.  *
  1656.  * VIDEOPORTBANDWIDTH Caps
  1657.  *
  1658.  ****************************************************************************)
  1659. (*
  1660.  * The bandwidth for this device is dependant on the overlay source size.
  1661.  *)
  1662.   DDVPBCAPS_SOURCE = $00000001;
  1663.   {$EXTERNALSYM DDVPBCAPS_SOURCE}
  1664. (*
  1665.  * The bandwidth for this device is dependant on the overlay destination
  1666.  * size.
  1667.  *)
  1668.   DDVPBCAPS_DESTINATION = $00000002;
  1669.   {$EXTERNALSYM DDVPBCAPS_DESTINATION}
  1670. (****************************************************************************
  1671.  *
  1672.  * DDVIDEOPORTCONTAINER CreateVideoPort flags
  1673.  *
  1674.  ****************************************************************************)
  1675. (*
  1676.  * The process only wants to control the VBI portion of the video stream.
  1677.  *)
  1678.   DDVPCREATE_VBIONLY = $00000001;
  1679.   {$EXTERNALSYM DDVPCREATE_VBIONLY}
  1680. (*
  1681.  * The process only wants to control the non-VBI (video) portion of
  1682.  * the video stream.
  1683.  *)
  1684.   DDVPCREATE_VIDEOONLY = $00000002;
  1685.   {$EXTERNALSYM DDVPCREATE_VIDEOONLY}
  1686. (****************************************************************************
  1687.  *
  1688.  * DDVIDEOPORTSTATUS flags
  1689.  *
  1690.  ****************************************************************************)
  1691. (*
  1692.  * The video port interface is only controlling the VBI portion of the
  1693.  * video stream
  1694.  *)
  1695.   DDVPSTATUS_VBIONLY = $00000001;
  1696.   {$EXTERNALSYM DDVPSTATUS_VBIONLY}
  1697. (*
  1698.  * The video port interface is only controlling the video portion of the
  1699.  * video stream
  1700.  *)
  1701.   DDVPSTATUS_VIDEOONLY = $00000002;
  1702.   {$EXTERNALSYM DDVPSTATUS_VIDEOONLY}
  1703. type
  1704. (*
  1705.  * API's
  1706.  *)
  1707.   TDDEnumVideoCallback = function (lpTDDVideoPortCaps: PDDVideoPortCaps;
  1708.       lpContext: Pointer): HResult; stdcall;
  1709.   {$EXTERNALSYM TDDEnumVideoCallback}
  1710. (*
  1711.  * INTERACES FOLLOW:
  1712.  * IDirectDrawVideoPort
  1713.  * IVideoPort
  1714.  *)
  1715.   IDirectDrawVideoPort = interface;
  1716.   {$HPPEMIT 'typedef System::DelphiInterface<IDirectDrawVideoPort> _di_IDirectDrawVideoPort;'}
  1717.   {$EXTERNALSYM IDirectDrawVideoPort}
  1718. (*
  1719.  * IDirectDrawVideoPortContainer
  1720.  *)
  1721.   {$HPPEMIT 'typedef System::DelphiInterface<IDDVideoPortContainer> _di_IDDVideoPortContainer;'}
  1722.   {$EXTERNALSYM IDDVideoPortContainer}
  1723.   IDDVideoPortContainer = interface(IUnknown)
  1724.     ['{6C142760-A733-11CE-A521-0020AF0BE560}']
  1725.     (*** IDDVideoPortContainer methods ***)
  1726.     function CreateVideoPort(dwFlags: DWORD; var lpTDDVideoPortDesc:
  1727.         TDDVideoPortDesc; var lplpDDVideoPort: IDirectDrawVideoPort;
  1728.         pUnkOuter: IUnknown): HResult; stdcall;
  1729.     function EnumVideoPorts(dwFlags: DWORD;
  1730.         lpTDDVideoPortCaps: PDDVideoPortCaps; lpContext: Pointer;
  1731.         lpEnumVideoCallback: TDDEnumVideoCallback): HResult; stdcall;
  1732.     function GetVideoPortConnectInfo(dwPortId: DWORD; var lpNumEntries: DWORD;
  1733.         lpConnectInfo: PDDVideoPortConnect): HResult; stdcall;
  1734.     function QueryVideoPortStatus(dwPortId: DWORD;
  1735.         var lpVPStatus: TDDVideoPortStatus): HResult; stdcall;
  1736.   end;
  1737. (*
  1738.  * IDirectDrawVideoPort
  1739.  *)
  1740.   IDirectDrawVideoPort = interface(IUnknown)
  1741.     ['{B36D93E0-2B43-11CF-A2DE-00AA00B93356}']
  1742.     (*** IDirectDrawVideoPort methods ***)
  1743.     function Flip(lpDDSurface: IDirectDrawSurface; dwFlags: DWORD): HResult; stdcall;
  1744.     function GetBandwidthInfo(var lpddpfFormat: TDDPixelFormat;
  1745.         dwWidth: DWORD; dwHeight: DWORD; dwFlags: DWORD;
  1746.         var lpBandwidth: TDDVideoPortBandWidth): HResult; stdcall;
  1747.     function GetColorControls(var lpColorControl: TDDColorControl): HResult; stdcall;
  1748.     function GetInputFormats(var lpNumFormats: DWORD; var lpFormats:
  1749.         TDDPixelFormat; dwFlags: DWORD): HResult; stdcall;
  1750.     function GetOutputFormats(var lpInputFormat: TDDPixelFormat;
  1751.         var lpNumFormats: DWORD; lpFormats: PDDPixelFormat; dwFlags: DWORD):
  1752.         HResult; stdcall;
  1753.     function GetFieldPolarity(var lpbVideoField: BOOL): HResult; stdcall;
  1754.     function GetVideoLine(var lpdwLine: DWORD): HResult; stdcall;
  1755.     function GetVideoSignalStatus(varlpdwStatus: DWORD): HResult; stdcall;
  1756.     function SetColorControls(var lpColorControl: TDDColorControl): HResult; stdcall;
  1757.     function SetTargetSurface(lpDDSurface: IDirectDrawSurface; dwFlags: DWORD):
  1758.         HResult; stdcall;
  1759.     function StartVideo(var lpVideoInfo: TDDVideoPortInfo): HResult; stdcall;
  1760.     function StopVideo: HResult; stdcall;
  1761.     function UpdateVideo(var lpVideoInfo: TDDVideoPortInfo): HResult; stdcall;
  1762.     function WaitForSync(dwFlags: DWORD; dwLine: DWORD; dwTimeout: DWORD):
  1763.         HResult; stdcall;
  1764.   end;
  1765.   IID_IDDVideoPortContainer = IDDVideoPortContainer;
  1766.   {$EXTERNALSYM IID_IDDVideoPortContainer}
  1767.   IID_IDirectDrawVideoPort = IDirectDrawVideoPort;
  1768.   {$EXTERNALSYM IID_IDirectDrawVideoPort}
  1769. (*
  1770.  * IDirectDrawVideoPort
  1771.  *)
  1772.   {$HPPEMIT 'typedef System::DelphiInterface<IDirectDrawVideoPortNotify> _di_IDirectDrawVideoPortNotify;'}
  1773.   {$EXTERNALSYM IDirectDrawVideoPortNotify}
  1774.   IDirectDrawVideoPortNotify = interface(IUnknown)
  1775.     ['{6C142760-A733-11CE-A521-0020AF0BE560}']
  1776.     (*** IVideoPort methods ***)
  1777.     function AcquireNotification(hEvent: THandle; const params: TDDVideoPortNotify): HResult; stdcall;
  1778.     function ReleaseNotification(hEvent: THandle): HResult; stdcall;
  1779.   end;
  1780. var
  1781.   DDrawDLL : HMODULE = 0;
  1782. function DDErrorString(Value: HResult): String;
  1783. implementation
  1784. //#define MAKE_DDHRESULT( code )  MAKE_HRESULT( 1, _FACDD, code )
  1785. function MAKE_DDHRESULT(Code: DWORD): HResult;
  1786. begin
  1787.   Result:= MakeResult(1, _FACDD, code);
  1788. end;
  1789. //#define GET_WHQL_YEAR( dwWHQLLevel ) 
  1790. //    ( (dwWHQLLevel) / 0x10000 )
  1791. function GET_WHQL_YEAR(dwWHQLLevel: DWORD): DWORD;
  1792. begin
  1793.   Result := (dwWHQLLevel) div $10000;
  1794. end;
  1795. //#define GET_WHQL_MONTH( dwWHQLLevel ) 
  1796. //    ( ( (dwWHQLLevel) / 0x100 ) & 0x00ff )
  1797. function GET_WHQL_MONTH(dwWHQLLevel: DWORD): DWORD;
  1798. begin
  1799.   Result := ((dwWHQLLevel) div $100) and $00ff;
  1800. end;
  1801. //#define GET_WHQL_DAY( dwWHQLLevel ) 
  1802. //    ( (dwWHQLLevel) & 0xff )
  1803. function GET_WHQL_DAY(dwWHQLLevel: DWORD): DWORD;
  1804. begin
  1805.   Result := (dwWHQLLevel) and $ff;
  1806. end;
  1807. function MAKEFOURCC(ch0, ch1, ch2, ch3: Char): DWORD;
  1808. begin
  1809.   Result := DWORD(Byte(ch0) shl 0) or
  1810.             DWORD(Byte(ch1) shl 8) or
  1811.             DWORD(Byte(ch2) shl 16) or
  1812.             DWORD(Byte(ch3) shl 24);
  1813. end;
  1814. function DDErrorString(Value: HResult): String;
  1815. begin
  1816.   case Value of
  1817.     DD_OK: Result := 'The request completed successfully.';
  1818.     DDERR_ALREADYINITIALIZED: Result := 'This object is already initialized.';
  1819.     DDERR_BLTFASTCANTCLIP: Result := ' if a clipper object is attached to the source surface passed into a BltFast call.';
  1820.     DDERR_CANNOTATTACHSURFACE: Result := 'This surface can not be attached to the requested surface.';
  1821.     DDERR_CANNOTDETACHSURFACE: Result := 'This surface can not be detached from the requested surface.';
  1822.     DDERR_CANTCREATEDC: Result := 'Windows can not create any more DCs.';
  1823.     DDERR_CANTDUPLICATE: Result := 'Cannot duplicate primary & 3D surfaces, or surfaces that are implicitly created.';
  1824.     DDERR_CLIPPERISUSINGHWND: Result := 'An attempt was made to set a cliplist for a clipper object that is already monitoring an hwnd.';
  1825.     DDERR_COLORKEYNOTSET: Result := 'No src color key specified for this operation.';
  1826.     DDERR_CURRENTLYNOTAVAIL: Result := 'Support is currently not available.';
  1827.     DDERR_DIRECTDRAWALREADYCREATED: Result := 'A DirectDraw object representing this driver has already been created for this process.';
  1828.     DDERR_EXCEPTION: Result := 'An exception was encountered while performing the requested operation.';
  1829.     DDERR_EXCLUSIVEMODEALREADYSET: Result := 'An attempt was made to set the cooperative level when it was already set to exclusive.';
  1830.     DDERR_GENERIC: Result := 'Generic failure.';
  1831.     DDERR_HEIGHTALIGN: Result := 'Height of rectangle provided is not a multiple of reqd alignment.';
  1832.     DDERR_HWNDALREADYSET: Result := 'The CooperativeLevel HWND has already been set. It can not be reset while the process has surfaces or palettes created.';
  1833.     DDERR_HWNDSUBCLASSED: Result := 'HWND used by DirectDraw CooperativeLevel has been subclassed, this prevents DirectDraw from restoring state.';
  1834.     DDERR_IMPLICITLYCREATED: Result := 'This surface can not be restored because it is an implicitly created surface.';
  1835.     DDERR_INCOMPATIBLEPRIMARY: Result := 'Unable to match primary surface creation request with existing primary surface.';
  1836.     DDERR_INVALIDCAPS: Result := 'One or more of the caps bits passed to the callback are incorrect.';
  1837.     DDERR_INVALIDCLIPLIST: Result := 'DirectDraw does not support the provided cliplist.';
  1838.     DDERR_INVALIDDIRECTDRAWGUID: Result := 'The GUID passed to DirectDrawCreate is not a valid DirectDraw driver identifier.';
  1839.     DDERR_INVALIDMODE: Result := 'DirectDraw does not support the requested mode.';
  1840.     DDERR_INVALIDOBJECT: Result := 'DirectDraw received a pointer that was an invalid DIRECTDRAW object.';
  1841.     DDERR_INVALIDPARAMS: Result := 'One or more of the parameters passed to the function are incorrect.';
  1842.     DDERR_INVALIDPIXELFORMAT: Result := 'The pixel format was invalid as specified.';
  1843.     DDERR_INVALIDPOSITION: Result := 'Returned when the position of the overlay on the destination is no longer legal for that destination.';
  1844.     DDERR_INVALIDRECT: Result := 'Rectangle provided was invalid.';
  1845.     DDERR_LOCKEDSURFACES: Result := 'Operation could not be carried out because one or more surfaces are locked.';
  1846.     DDERR_NO3D: Result := 'There is no 3D present.';
  1847.     DDERR_NOALPHAHW: Result := 'Operation could not be carried out because there is no alpha accleration hardware present or available.';
  1848.     DDERR_NOBLTHW: Result := 'No blitter hardware present.';
  1849.     DDERR_NOCLIPLIST: Result := 'No cliplist available.';
  1850.     DDERR_NOCLIPPERATTACHED: Result := 'No clipper object attached to surface object.';
  1851.     DDERR_NOCOLORCONVHW: Result := 'Operation could not be carried out because there is no color conversion hardware present or available.';
  1852.     DDERR_NOCOLORKEY: Result := 'Surface does not currently have a color key';
  1853.     DDERR_NOCOLORKEYHW: Result := 'Operation could not be carried out because there is no hardware support of the destination color key.';
  1854.     DDERR_NOCOOPERATIVELEVELSET: Result := 'Create function called without DirectDraw object method SetCooperativeLevel being called.';
  1855.     DDERR_NODC: Result := 'No DC was ever created for this surface.';
  1856.     DDERR_NODDROPSHW: Result := 'No DirectDraw ROP hardware.';
  1857.     DDERR_NODIRECTDRAWHW: Result := 'A hardware-only DirectDraw object creation was attempted but the driver did not support any hardware.';
  1858.     DDERR_NOEMULATION: Result := 'Software emulation not available.';
  1859.     DDERR_NOEXCLUSIVEMODE: Result := 'Operation requires the application to have exclusive mode but the application does not have exclusive mode.';
  1860.     DDERR_NOFLIPHW: Result := 'Flipping visible surfaces is not supported.';
  1861.     DDERR_NOGDI: Result := 'There is no GDI present.';
  1862.     DDERR_NOHWND: Result := 'Clipper notification requires an HWND or no HWND has previously been set as the CooperativeLevel HWND.';
  1863.     DDERR_NOMIRRORHW: Result := 'Operation could not be carried out because there is no hardware present or available.';
  1864.     DDERR_NOOVERLAYDEST: Result := 'Returned when GetOverlayPosition is called on an overlay that UpdateOverlay has never been called on to establish a destination.';
  1865.     DDERR_NOOVERLAYHW: Result := 'Operation could not be carried out because there is no overlay hardware present or available.';
  1866.     DDERR_NOPALETTEATTACHED: Result := 'No palette object attached to this surface.';
  1867.     DDERR_NOPALETTEHW: Result := 'No hardware support for 16 or 256 color palettes.';
  1868.     DDERR_NORASTEROPHW: Result := 'Operation could not be carried out because there is no appropriate raster op hardware present or available.';
  1869.     DDERR_NOROTATIONHW: Result := 'Operation could not be carried out because there is no rotation hardware present or available.';
  1870.     DDERR_NOSTRETCHHW: Result := 'Operation could not be carried out because there is no hardware support for stretching.';
  1871.     DDERR_NOT4BITCOLOR: Result := 'DirectDrawSurface is not in 4 bit color palette and the requested operation requires 4 bit color palette.';
  1872.     DDERR_NOT4BITCOLORINDEX: Result := 'DirectDrawSurface is not in 4 bit color index palette and the requested operation requires 4 bit color index palette.';
  1873.     DDERR_NOT8BITCOLOR: Result := 'DirectDrawSurface is not in 8 bit color mode and the requested operation requires 8 bit color.';
  1874.     DDERR_NOTAOVERLAYSURFACE: Result := 'Returned when an overlay member is called for a non-overlay surface.';
  1875.     DDERR_NOTEXTUREHW: Result := 'Operation could not be carried out because there is no texture mapping hardware present or available.';
  1876.     DDERR_NOTFLIPPABLE: Result := 'An attempt has been made to flip a surface that is not flippable.';
  1877.     DDERR_NOTFOUND: Result := 'Requested item was not found.';
  1878.     DDERR_NOTLOCKED: Result := 'Surface was not locked.  An attempt to unlock a surface that was not locked at all, or by this process, has been attempted.';
  1879.     DDERR_NOTPALETTIZED: Result := 'The surface being used is not a palette-based surface.';
  1880.     DDERR_NOVSYNCHW: Result := 'Operation could not be carried out because there is no hardware support for vertical blank synchronized operations.';
  1881.     DDERR_NOZBUFFERHW: Result := 'Operation could not be carried out because there is no hardware support for zbuffer blitting.';
  1882.     DDERR_NOZOVERLAYHW: Result := 'Overlay surfaces could not be z layered based on their BltOrder because the hardware does not support z layering of overlays.';
  1883.     DDERR_OUTOFCAPS: Result := 'The hardware needed for the requested operation has already been allocated.';
  1884.     DDERR_OUTOFMEMORY: Result := 'DirectDraw does not have enough memory to perform the operation.';
  1885.     DDERR_OUTOFVIDEOMEMORY: Result := 'DirectDraw does not have enough memory to perform the operation.';
  1886.     DDERR_OVERLAYCANTCLIP: Result := 'The hardware does not support clipped overlays.';
  1887.     DDERR_OVERLAYCOLORKEYONLYONEACTIVE: Result := 'Can only have ony color key active at one time for overlays.';
  1888.     DDERR_OVERLAYNOTVISIBLE: Result := 'Returned when GetOverlayPosition is called on a hidden overlay.';
  1889.     DDERR_PALETTEBUSY: Result := 'Access to this palette is being refused because the palette is already locked by another thread.';
  1890.     DDERR_PRIMARYSURFACEALREADYEXISTS: Result := 'This process already has created a primary surface.';
  1891.     DDERR_REGIONTOOSMALL: Result := 'Region passed to Clipper::GetClipList is too small.';
  1892.     DDERR_SURFACEALREADYATTACHED: Result := 'This surface is already attached to the surface it is being attached to.';
  1893.     DDERR_SURFACEALREADYDEPENDENT: Result := 'This surface is already a dependency of the surface it is being made a dependency of.';
  1894.     DDERR_SURFACEBUSY: Result := 'Access to this surface is being refused because the surface is already locked by another thread.';
  1895.     DDERR_SURFACEISOBSCURED: Result := 'Access to surface refused because the surface is obscured.';
  1896.     DDERR_SURFACELOST: Result := 'Access to this surface is being refused because the surface memory is gone. The DirectDrawSurface object representing this surface should have Restore called on it.';
  1897.     DDERR_SURFACENOTATTACHED: Result := 'The requested surface is not attached.';
  1898.     DDERR_TOOBIGHEIGHT: Result := 'Height requested by DirectDraw is too large.';
  1899.     DDERR_TOOBIGSIZE: Result := 'Size requested by DirectDraw is too large, but the individual height and width are OK.';
  1900.     DDERR_TOOBIGWIDTH: Result := 'Width requested by DirectDraw is too large.';
  1901.     DDERR_UNSUPPORTED: Result := 'Action not supported.';
  1902.     DDERR_UNSUPPORTEDFORMAT: Result := 'FOURCC format requested is unsupported by DirectDraw.';
  1903.     DDERR_UNSUPPORTEDMASK: Result := 'Bitmask in the pixel format requested is unsupported by DirectDraw.';
  1904.     DDERR_VERTICALBLANKINPROGRESS: Result := 'Vertical blank is in progress.';
  1905.     DDERR_WASSTILLDRAWING: Result := 'Informs DirectDraw that the previous Blt which is transfering information to or from this Surface is incomplete.';
  1906.     DDERR_WRONGMODE: Result := 'This surface can not be restored because it was created in a different mode.';
  1907.     DDERR_XALIGN: Result := 'Rectangle provided was not horizontally aligned on required boundary.';
  1908.     // new:
  1909.     DDERR_OVERLAPPINGRECTS: Result := 'Operation could not be carried out because the source and destination rectangles are on the same surface and overlap each other.';
  1910.     DDERR_INVALIDSTREAM: Result := 'The specified stream contains invalid data';
  1911.     DDERR_UNSUPPORTEDMODE: Result := 'The display is currently in an unsupported mode';
  1912.     DDERR_NOMIPMAPHW: Result := 'Operation could not be carried out because there is no mip-map texture mapping hardware present or available.';
  1913.     DDERR_INVALIDSURFACETYPE: Result := 'The requested action could not be performed because the surface was of the wrong type.';
  1914.     DDERR_NOOPTIMIZEHW: Result := 'Device does not support optimized surfaces, therefore no video memory optimized surfaces';
  1915.     DDERR_NOTLOADED: Result := 'Surface is an optimized surface, but has not yet been allocated any memory';
  1916.     DDERR_NOFOCUSWINDOW: Result := 'Attempt was made to create or set a device window without first setting the focus window';
  1917.     DDERR_DCALREADYCREATED: Result := 'A DC has already been returned for this surface. Only one DC can be retrieved per surface.';
  1918.     DDERR_NONONLOCALVIDMEM: Result := 'An attempt was made to allocate non-local video memory from a device that does not support non-local video memory.';
  1919.     DDERR_CANTPAGELOCK: Result := 'The attempt to page lock a surface failed.';
  1920.     DDERR_CANTPAGEUNLOCK: Result := 'The attempt to page unlock a surface failed.';
  1921.     DDERR_NOTPAGELOCKED: Result := 'An attempt was made to page unlock a surface with no outstanding page locks.';
  1922.     DDERR_MOREDATA: Result := 'There is more data available than the specified buffer size could hold';
  1923.     DDERR_EXPIRED: Result := 'The data has expired and is therefore no longer valid.';
  1924.     DDERR_VIDEONOTACTIVE: Result := 'The video port is not active';
  1925.     DDERR_DEVICEDOESNTOWNSURFACE: Result := 'Surfaces created by one direct draw device cannot be used directly by another direct draw device.';
  1926.     DDERR_NOTINITIALIZED: Result := 'An attempt was made to invoke an interface member of a DirectDraw object created by CoCreateInstance() before it was initialized.';
  1927.     else Result := 'Unrecognized Error';
  1928.   end;
  1929. end;
  1930. {$IFDEF DIRECTDRAW_DYNAMIC_LINK}
  1931. var
  1932.   DirectDrawLib: THandle = 0;
  1933. function DirectDrawLoaded: Boolean;
  1934. begin
  1935.   Result:= DirectDrawLib <> 0;
  1936. end;
  1937. function UnLoadDirectDraw: Boolean;
  1938. begin
  1939.   Result:= True;
  1940.   if DirectDrawLoaded then
  1941.   begin
  1942.     Result:= FreeLibrary(DirectDrawLib);
  1943.     DirectDrawEnumerateA := nil;
  1944.     DirectDrawEnumerateW := nil;
  1945.     DirectDrawEnumerate := nil;
  1946.     DirectDrawEnumerateExA := nil;
  1947.     DirectDrawEnumerateExW := nil;
  1948.     DirectDrawEnumerateEx := nil;
  1949.     DirectDrawCreate := nil;
  1950.     DirectDrawCreateEx := nil;
  1951.     DirectDrawCreateClipper := nil;
  1952.     {$IFDEF WINNT}
  1953.     NtDirectDrawCreate := nil;
  1954.     {$ENDIF}
  1955.     DirectDrawLib:= 0;
  1956.   end;
  1957. end;
  1958. function LoadDirectDraw: Boolean;
  1959. begin
  1960.   Result:= DirectDrawLoaded;
  1961.   if (not Result) then
  1962.   begin
  1963.     DirectDrawLib:= LoadLibrary(DirectDrawDll);
  1964.     if DirectDrawLoaded then
  1965.     begin
  1966.       DirectDrawEnumerateA := GetProcAddress(DirectDrawLib, 'DirectDrawEnumerateA');
  1967.       DirectDrawEnumerateW := GetProcAddress(DirectDrawLib, 'DirectDrawEnumerateW');
  1968.       {$IFDEF UNICODE}
  1969.       DirectDrawEnumerate := GetProcAddress(DirectDrawLib, 'DirectDrawEnumerateW');
  1970.       {$ELSE}
  1971.       DirectDrawEnumerate := GetProcAddress(DirectDrawLib, 'DirectDrawEnumerateA');
  1972.       {$ENDIF}
  1973.       DirectDrawEnumerateExA := GetProcAddress(DirectDrawLib, 'DirectDrawEnumerateExA');
  1974.       DirectDrawEnumerateExW := GetProcAddress(DirectDrawLib, 'DirectDrawEnumerateExW');
  1975.       {$IFDEF UNICODE}
  1976.       DirectDrawEnumerateEx := GetProcAddress(DirectDrawLib, 'DirectDrawEnumerateExW');
  1977.       {$ELSE}
  1978.       DirectDrawEnumerateEx := GetProcAddress(DirectDrawLib, 'DirectDrawEnumerateExA');
  1979.       {$ENDIF}
  1980.       DirectDrawCreate := GetProcAddress(DDrawDLL,'DirectDrawCreate');
  1981.       DirectDrawCreateEx := GetProcAddress(DDrawDLL,'DirectDrawCreateEx');
  1982.       DirectDrawCreateClipper := GetProcAddress(DDrawDLL,'DirectDrawCreateClipper');
  1983.       {$IFDEF WINNT}
  1984.       NtDirectDrawCreate := GetProcAddress(DDrawDLL,'NtDirectDrawCreate');
  1985.       {$ENDIF}
  1986.       Result:= Assigned(DirectDrawCreate); // At least basic procedure is found!
  1987.       if not Result then UnLoadDirectDraw;
  1988.     end;
  1989.   end;
  1990. end;
  1991. {$ELSE}
  1992. function DirectDrawLoaded: Boolean;
  1993. begin // Stub function for static linking
  1994.   Result:= True;
  1995. end;
  1996. function UnLoadDirectDraw: Boolean;
  1997. begin // Stub function for static linking
  1998.   Result:= True; // should emulate "normal" behaviour
  1999. end;
  2000. function LoadDirectDraw: Boolean;
  2001. begin // Stub function for static linking
  2002.   Result:= True;
  2003. end;
  2004. {$ENDIF}
  2005. {$IFDEF DIRECTDRAW_DYNAMIC_LINK}
  2006. initialization
  2007. {$IFNDEF DIRECTDRAW_DYNAMIC_LINK_EXPLICIT}
  2008.   LoadDirectDraw;
  2009. {$ENDIF}
  2010. finalization
  2011.   UnLoadDirectDraw;
  2012. {$ENDIF}
  2013. end.