misc.cpp
上传用户:garry_shen
上传日期:2015-04-15
资源大小:45647k
文件大小:39k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. *  Copyright (C) 1998 Microsoft Corporation. All Rights Reserved.
  3. *
  4. *  File: misc.c
  5. *
  6. *  Miscellaneous functions not involving DD and D3D.  Part of D3DApp.
  7. *
  8. *  D3DApp is a collection of helper functions for Direct3D applications.
  9. *  D3DApp consists of the following files:
  10. *      d3dapp.h    Main D3DApp header to be included by application
  11. *      d3dappi.h   Internal header
  12. *      d3dapp.c    D3DApp functions seen by application.
  13. *      ddcalls.c   All calls to DirectDraw objects except textures
  14. *      d3dcalls.c  All calls to Direct3D objects except textures
  15. *      texture.c   Texture loading and managing texture list
  16. *      misc.c      Miscellaneous calls
  17. */
  18. #include "stdafx.h"
  19. #include "XMudClient.h"
  20. #include "d3dappi.h"
  21. #include <Imm.h>
  22. #include "MyDInput.h"
  23. #include "MenuCreateNew.h"
  24. /***************************************************************************/
  25. /*                          Setting Defaults                               */
  26. /***************************************************************************/
  27. /*
  28. * D3DAppISetDefaults
  29. * Set all the global variables to their default values.  Do not reset the
  30. * image files.
  31. */
  32. void
  33. D3DAppISetDefaults(void)
  34. {
  35.   int n;
  36.   char backup[D3DAPP_MAXTEXTURES][50];
  37.   
  38.   n = d3dappi.NumTextures;
  39.   memcpy(&backup[0][0], &d3dappi.ImageFile[0][0], 50 * D3DAPP_MAXTEXTURES);
  40.   ZEROMEM(d3dappi);
  41.   memcpy(&d3dappi.ImageFile[0][0], &backup[0][0], 50 * D3DAPP_MAXTEXTURES);
  42.   d3dappi.NumTextures = n;
  43.   d3dappi.bAppActive = TRUE;
  44.   ZEROMEM(d3dapprs);
  45.   d3dapprs.bZBufferOn = TRUE;
  46.   d3dapprs.bPerspCorrect = TRUE; //FALSE;
  47.   d3dapprs.ShadeMode = D3DSHADE_FLAT; //D3DSHADE_GOURAUD;
  48.   d3dapprs.TextureFilter = D3DFILTER_NEAREST;
  49.   d3dapprs.TextureBlend = D3DTBLEND_MODULATE;
  50.   d3dapprs.FillMode = D3DFILL_SOLID;
  51.   d3dapprs.bDithering = FALSE;
  52.   d3dapprs.bSpecular = TRUE;
  53.   d3dapprs.bAntialiasing = FALSE;
  54.   d3dapprs.bFogEnabled = FALSE;
  55.   d3dapprs.FogColor = RGB_MAKE(255, 255, 255);
  56.   d3dapprs.FogMode = D3DFOG_LINEAR;
  57.   d3dapprs.FogStart = D3DVAL(6.0);
  58.   d3dapprs.FogEnd = D3DVAL(11.0);
  59.   
  60.   lpClipper = NULL;
  61.   lpPalette = NULL;
  62.   bPrimaryPalettized = FALSE;
  63.   bPaletteActivate = FALSE;
  64.   bIgnoreWM_SIZE = FALSE;
  65.   ZEROMEM(ppe);
  66.   ZEROMEM(Originalppe);
  67.   LastError = DD_OK;
  68.   ZEROMEM(LastErrorString);
  69.   D3DDeviceDestroyCallback = NULL;
  70.   D3DDeviceDestroyCallbackContext = NULL;
  71.   D3DDeviceCreateCallback = NULL;
  72.   D3DDeviceCreateCallbackContext = NULL;
  73. }
  74. BOOL D3DAppICallDeviceDestroyCallback(void)
  75. {
  76.   if (D3DDeviceDestroyCallback) {
  77.     if (CallbackRefCount) {
  78.       --CallbackRefCount;
  79.       return (D3DDeviceDestroyCallback)(D3DDeviceDestroyCallbackContext);
  80.     }
  81.   }
  82.   return TRUE;
  83. }
  84. BOOL D3DAppICallDeviceCreateCallback(int w, int h)
  85. {
  86.   if (D3DDeviceCreateCallback) 
  87.   {
  88.     ++CallbackRefCount;
  89.     return (D3DDeviceCreateCallback)(w,h,&d3dappi.lpD3DViewport,D3DDeviceCreateCallbackContext);
  90.   }
  91.   return TRUE;
  92. }
  93. /***************************************************************************/
  94. /*            Choosing and verifying the driver and display mode           */
  95. /***************************************************************************/
  96. /*
  97. * D3DAppIPickDriver
  98. * Choose a driver from the list of available drivers which can render to one
  99. * of the given depths.  Hardware is prefered.  Mono-lighting drivers are
  100. * prefered over RGB.
  101. */
  102. BOOL
  103. D3DAppIPickDriver(int* driver, DWORD depths)
  104. {
  105.   int i, j;
  106.   j = 0;
  107.   for (i = 0; i < d3dappi.NumDrivers; i++)
  108.   {
  109.     if (d3dappi.Driver[i].Desc.dwDeviceRenderBitDepth & depths) break;
  110.   }
  111.   if (i >= d3dappi.NumDrivers) 
  112.   {
  113.     *driver = D3DAPP_BOGUS;
  114.     return TRUE;
  115.   }
  116.   j = i;
  117.   for (i = 0; i < d3dappi.NumDrivers; i++) 
  118.   {
  119.     if (d3dappi.Driver[i].Desc.dwDeviceRenderBitDepth & depths) 
  120.     {
  121.       if (d3dappi.Driver[i].bIsHardware && !d3dappi.Driver[j].bIsHardware)
  122.       {
  123.         j = i;
  124.       }
  125.       else if (d3dappi.Driver[i].bIsHardware == d3dappi.Driver[j].bIsHardware) 
  126.       {
  127.         if (d3dappi.Driver[i].Desc.dcmColorModel & D3DCOLOR_MONO &&
  128.           !(d3dappi.Driver[j].Desc.dcmColorModel & D3DCOLOR_MONO))
  129.         {
  130.           j = i;
  131.         }
  132.       }
  133.     }
  134.   }
  135.   if (j >= d3dappi.NumDrivers) *driver = D3DAPP_BOGUS;
  136.   else                         *driver = j;
  137.   return TRUE;
  138. }
  139. BOOL D3DAppIFilterDisplayModes(int driver)
  140. {
  141.   int i;
  142.   DWORD depths = d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth;
  143.   
  144.   for (i = 0; i < d3dappi.NumModes; i++) 
  145.   {
  146.     d3dappi.Mode[i].bThisDriverCanDo = FALSE;
  147.     if (!(D3DAppIBPPToDDBD(d3dappi.Mode[i].bpp) & depths)) continue;
  148.     d3dappi.Mode[i].bThisDriverCanDo = TRUE;
  149.     
  150.   }
  151.   d3dappi.ThisMode.bThisDriverCanDo = d3dappi.Mode[d3dappi.CurrMode].bThisDriverCanDo;
  152.   return TRUE;
  153. }
  154. BOOL D3DAppIPickDisplayMode(int *mode, DWORD depths)
  155. {
  156.   int i, j;
  157.   for (i = 0; i < d3dappi.NumModes; i++)
  158.   {
  159.     if (D3DAppIBPPToDDBD(d3dappi.Mode[i].bpp) & depths) break;
  160.   }
  161.   j = i;
  162.   for (; i < d3dappi.NumModes; i++) 
  163.   {
  164.     if (!(D3DAppIBPPToDDBD(d3dappi.Mode[i].bpp) & depths)) continue;
  165.     if (d3dappi.Mode[i].w == DEFULTWND_WIDTH && d3dappi.Mode[i].h == DEFULTWND_HEIGHT &&
  166.       d3dappi.Mode[i].bpp == 16) 
  167.     {
  168.       j = i;
  169.       break;
  170.     }
  171.   }
  172.   if (j >= d3dappi.NumModes) *mode = D3DAPP_BOGUS;
  173.   else                       *mode = j;
  174.   return TRUE;
  175. }
  176. /*
  177. * D3DAppIVerifyDriverAndMode
  178. * Verifies the selected driver and mode combination.  If the driver is
  179. * specified, the mode will be changed to accomodate the driver if it's not
  180. * compatible.  If the driver is not specified, one will be selected which is
  181. * compatible with the specified mode.  If neither are specified, a suitable
  182. * pair will be returned.
  183. */
  184. BOOL
  185. D3DAppIVerifyDriverAndMode(int* lpdriver, int* lpmode)
  186. {
  187.   DWORD depths;
  188.   int driver, mode, i;
  189.   driver = *lpdriver; mode = *lpmode;
  190.   
  191.   if (mode == D3DAPP_USEWINDOW && !d3dappi.bIsPrimary) 
  192.   {
  193.     D3DAppISetErrorString("Cannot render to a window when the DirectDraw device is not the primary.n");
  194.     goto exit_with_error;
  195.   }
  196.   
  197.   /*
  198.   * If I've been ask to choose a driver, choose one which is compatible
  199.   * with the specified mode.
  200.   */
  201.   if (driver == D3DAPP_YOUDECIDE) 
  202.   {
  203.     if (mode == D3DAPP_USEWINDOW) 
  204.     {
  205.     /*
  206.     * I must find a driver for this display depth
  207.       */
  208.       depths = D3DAppIBPPToDDBD(d3dappi.WindowsDisplay.bpp);
  209.       ATTEMPT(D3DAppIPickDriver(&driver, depths));
  210.       if (driver == D3DAPP_BOGUS) 
  211.       {
  212.         D3DAppISetErrorString("Cannot find a D3D device driver which is compatible with the current display depth.n");
  213.         goto exit_with_error;
  214.       }
  215.       /*
  216.       * I don't need to go through the mode selection since I've
  217.       * verified it here
  218.       */
  219.       goto ret_ok;
  220.     } 
  221.     else if (mode == D3DAPP_YOUDECIDE) 
  222.     {
  223.     /*
  224.     * I'm free to choose any driver which can use even one
  225.     * supported depth
  226.       */
  227.       if (d3dappi.bIsPrimary)
  228.         depths = D3DAppIBPPToDDBD(d3dappi.WindowsDisplay.bpp);
  229.       else
  230.         depths = 0;
  231.       for (i = 0; i < d3dappi.NumModes; i++)
  232.         depths |= D3DAppIBPPToDDBD(d3dappi.Mode[i].bpp);
  233.       ATTEMPT(D3DAppIPickDriver(&driver, depths));
  234.       if (driver == D3DAPP_BOGUS) 
  235.       {
  236.         D3DAppISetErrorString("Cannot find a D3D device driver which is compatible with the current display depth or any supported fullscreen mode.n");
  237.         goto exit_with_error;
  238.       }
  239.       /*
  240.       * The mode will be chosen in the next section
  241.       */
  242.     } 
  243.     else 
  244.     {
  245.     /*
  246.     * Must pick a driver which uses the given mode depth
  247.       */
  248.       ATTEMPT(D3DAppIPickDriver(&driver,
  249.         D3DAppIBPPToDDBD(d3dappi.Mode[mode].bpp)));
  250.       if (driver == D3DAPP_BOGUS) 
  251.       {
  252.         D3DAppISetErrorString("Cannot find a D3D device driver which is compatible with the specified fullscreen mode.n");
  253.         goto exit_with_error;
  254.       }
  255.       /*
  256.       * I don't need to go through the mode selection since I've
  257.       * verified it here
  258.       */
  259.       goto ret_ok;
  260.     }
  261.   }
  262.   
  263.   /*
  264.   * At this stage, I have a driver I want to match the mode to.
  265.   */
  266.   if (mode == D3DAPP_YOUDECIDE) 
  267.   {
  268.   /*
  269.   * If it's my choice, I prefer windowed over fullscreen
  270.     */
  271.     if (d3dappi.bIsPrimary) 
  272.     {
  273.       if (D3DAppIBPPToDDBD(d3dappi.WindowsDisplay.bpp) &
  274.         d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth) 
  275.       {
  276.         mode = D3DAPP_USEWINDOW;
  277.         goto ret_ok;
  278.       }
  279.     }
  280.     /*
  281.     * Either this is not a primary DD device or the driver cannot use
  282.     * the Windows display depth
  283.     */
  284.     ATTEMPT(D3DAppIPickDisplayMode(&mode,
  285.       d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth));
  286.     if (mode == D3DAPP_BOGUS) 
  287.     {
  288.       D3DAppISetErrorString("The selected D3D device driver is not compatible with the current display depth or any supported fullscreen modes.n");
  289.       goto exit_with_error;
  290.     }
  291.     goto ret_ok;
  292.   } 
  293.   else if (mode == D3DAPP_USEWINDOW) 
  294.   {
  295.   /*
  296.   * Check to see if this driver can use the Windows display depth
  297.     */
  298.     if (D3DAppIBPPToDDBD(d3dappi.WindowsDisplay.bpp) &
  299.       d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth) 
  300.     {
  301.       goto ret_ok;
  302.     }
  303.     else 
  304.     {
  305.     /*
  306.     * Since it cannot, call this function again to choose any
  307.     * display mode which is compatible
  308.       */
  309.       mode = D3DAPP_YOUDECIDE;
  310.       ATTEMPT(D3DAppIVerifyDriverAndMode(&driver, &mode));
  311.       if (driver == D3DAPP_BOGUS)
  312.         goto exit_with_error;
  313.       goto ret_ok;
  314.     }
  315.   } 
  316.   else 
  317.   {
  318.   /*
  319.   * Check to see if this driver can use the specified fullscreen mode
  320.     */
  321.     if (D3DAppIBPPToDDBD(d3dappi.Mode[mode].bpp) &
  322.       d3dappi.Driver[driver].Desc.dwDeviceRenderBitDepth) 
  323.     {
  324.       goto ret_ok;
  325.     }
  326.     else 
  327.     {
  328.     /*
  329.     * Since it cannot, call this function again to choose any
  330.     * display mode which is compatible
  331.       */
  332.       mode = D3DAPP_YOUDECIDE;
  333.       ATTEMPT(D3DAppIVerifyDriverAndMode(&driver, &mode));
  334.       if (driver == D3DAPP_BOGUS)
  335.         goto exit_with_error;
  336.       goto ret_ok;
  337.     }
  338.   }
  339.   
  340. ret_ok:
  341.   *lpdriver = driver; *lpmode = mode;
  342.   return TRUE;
  343. exit_with_error:
  344.   return FALSE;
  345. }
  346. /***************************************************************************/
  347. /*                        Dirty Rectangle Functions                        */
  348. /***************************************************************************/
  349. /*
  350. * D3DAppIValidateDirtyRects
  351. * Set the dirty rectangles for the front and back buffers to the entire
  352. * client size.
  353. */
  354. void
  355. D3DAppIValidateDirtyRects(void)
  356. {
  357.   NumDirtyClientRects = 1; NumDirtyBackRects = 1; NumDirtyZRects = 1;
  358.   SetRect((LPRECT)&DirtyClient[0], 0, 0, d3dappi.szClient.cx,
  359.     d3dappi.szClient.cy);
  360.   SetRect((LPRECT)&DirtyBack[0], 0, 0, d3dappi.szClient.cx,
  361.     d3dappi.szClient.cy);
  362.   SetRect((LPRECT)&DirtyZ[0], 0, 0, d3dappi.szClient.cx,
  363.     d3dappi.szClient.cy);
  364. }
  365. /*
  366. * D3DAppICopyRectList
  367. * Copy a list of rectangles to another
  368. */
  369. void
  370. D3DAppICopyRectList(int* dstnum, LPD3DRECT dst, int srcnum, LPD3DRECT src)
  371. {
  372.   int i;
  373.   for (i = 0; i < srcnum; i++)
  374.     dst[i] = src[i];
  375.   *dstnum = srcnum;
  376. }
  377. /*
  378. * MERGE macro
  379. * Set first rectangle to be the smallest rectangle containing both rects
  380. */
  381. #undef MERGE
  382. #define MERGE(rc1, rc2)                         
  383.   do {                                        
  384.   if (rc2.x1 < rc1.x1) rc1.x1 = rc2.x1;   
  385.   if (rc2.y1 < rc1.y1) rc1.y1 = rc2.y1;   
  386.   if (rc2.x2 > rc1.x2) rc1.x2 = rc2.x2;   
  387.   if (rc2.y2 > rc1.y2) rc1.y2 = rc2.y2;   
  388.   } while(0)
  389. /*
  390. * D3DAppIMergeRectLists
  391. * Merge two lists of rectangles to create another list of rectangles. The
  392. * merged list of rectangles covers all the area of the original two with NO
  393. * OVERLAPPING amongst it's rectangles.
  394. */
  395. void
  396. D3DAppIMergeRectLists(int* dstnum, LPD3DRECT dst, int src1num, LPD3DRECT src1,
  397.                       int src2num, LPD3DRECT src2)
  398. {
  399.   LPD3DRECT rc;
  400.   int* isvalid;
  401.   int num, i, j, intersect;
  402.   rc = (LPD3DRECT)malloc(sizeof(D3DRECT) * D3DAPP_MAXCLEARRECTS * 2);
  403.   memset(rc, 0, sizeof(D3DRECT) * D3DAPP_MAXCLEARRECTS * 2);
  404.   isvalid = (int*)malloc(sizeof(int) * D3DAPP_MAXCLEARRECTS * 2);
  405.   memset(isvalid, 0, sizeof(int) * D3DAPP_MAXCLEARRECTS * 2);
  406.   for (i = 0; i < src1num; i++) 
  407.   {
  408.     memcpy(&rc[i], &src1[i], sizeof(D3DRECT));
  409.     if ((rc[i].x1 == 0 && rc[i].x2 == 0) ||
  410.       (rc[i].y1 == 0 && rc[i].y2 == 0))
  411.       isvalid[i] = 0;
  412.     else if (rc[i].x1 <= rc[i].x2 && rc[i].y1 <= rc[i].y2)
  413.       isvalid[i] = 1;
  414.     else
  415.       isvalid[i] = 0;
  416.   }
  417.   for (i = 0; i < src2num; i++) 
  418.   {
  419.     memcpy(&rc[i + src1num], &src2[i], sizeof(D3DRECT));
  420.     if (rc[i + src1num].x1 <= rc[i + src1num].x2 &&
  421.       rc[i + src1num].y1 <= rc[i + src1num].y2)
  422.       isvalid[i + src1num] = 1;
  423.     else
  424.       isvalid[i + src1num] = 0;
  425.     
  426.   }
  427.   num = src1num + src2num;
  428.   for (i = 0; i < num - 1; i++) 
  429.   {
  430.     if (!isvalid[i]) continue;
  431.     j = i + 1;
  432.     do 
  433.     {
  434.       intersect = 0;
  435.       for (; j < num; j++) 
  436.       {
  437.         if (j != i && isvalid[j]) 
  438.         {
  439.           if (rc[i].x1 < rc[j].x1) 
  440.           {
  441.             if (rc[i].x2 < rc[j].x1)
  442.               continue;
  443.           }
  444.           else 
  445.           {
  446.             if (rc[j].x2 < rc[i].x1)
  447.               continue;
  448.           }
  449.           if (rc[i].y1 < rc[j].y1) 
  450.           {
  451.             if (rc[i].y2 < rc[j].y1)
  452.               continue;
  453.           }
  454.           else 
  455.           {
  456.             if (rc[j].y2 < rc[i].y1)
  457.               continue;
  458.           }
  459.           MERGE(rc[i], rc[j]);
  460.           isvalid[j] = 0;
  461.           j = 0; intersect = 1;
  462.           break;
  463.         }
  464.       }
  465.     } while(intersect);
  466.   }
  467.   
  468.   for (i = 0, j = 0; i < num; i++)
  469.   {
  470.     if (isvalid[i]) ++j;
  471.   }
  472.   if (j > D3DAPP_MAXCLEARRECTS) 
  473.   {
  474.     for (i = 0; i < num; i++)
  475.       if (isvalid[i]) break;
  476.       if (i < num) 
  477.       {
  478.         *dstnum = 1;
  479.         dst[0] = rc[i];
  480.         for (; i < num; i++) 
  481.         {
  482.           if (isvalid[i]) 
  483.           {
  484.             MERGE(dst[0], rc[i]);
  485.           }
  486.         }
  487.       } 
  488.       else 
  489.       {
  490.         *dstnum = 0;
  491.       }
  492.   } 
  493.   else 
  494.   {
  495.     for (i = 0, j = 0; i < num; i++) 
  496.     {
  497.       if (isvalid[i]) 
  498.       {
  499.         memcpy(&dst[j], &rc[i], sizeof(D3DRECT));
  500.         ++j;
  501.       }
  502.     }
  503.     *dstnum = j;
  504.   }
  505.   free(rc);
  506.   free(isvalid);
  507. }
  508. /***************************************************************************/
  509. /*                     Getting and Setting Window Attribs                  */
  510. /***************************************************************************/
  511. /*
  512. * D3DAppISetClientSize
  513. * Set the client size of the given window.  A WM_SIZE message is generated,
  514. * but ignored.
  515. */
  516. void
  517. D3DAppISetClientSize(HWND hwnd, int w, int h, BOOL bReturnFromFullscreen)
  518. {
  519.   RECT rc;
  520.   
  521.   bIgnoreWM_SIZE = TRUE;
  522.   if (bReturnFromFullscreen) 
  523.   {
  524.     SetRect(&rc, 0, 0, w, h);
  525.     AdjustWindowRectEx(&rc, GetWindowLong(hwnd, GWL_STYLE),
  526.       GetMenu(hwnd) != NULL,
  527.       GetWindowLong(hwnd, GWL_EXSTYLE));
  528.     SetWindowPos(hwnd, NULL, 0, 0, rc.right-rc.left,
  529.       rc.bottom-rc.top,
  530.       SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
  531.     SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0,
  532.       SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
  533.     
  534.   }
  535.   else 
  536.   {
  537.   /*
  538.   * This is the only way to set the client size correctly if the menu
  539.   * is stacked, so do it unless we are returning from a fullscreen
  540.   * mode.
  541.     */
  542.     SendMessage(hwnd, WM_SIZE, SIZE_RESTORED, (w + h) << 16);
  543.     GetWindowRect(hwnd, &rc);
  544.     SetWindowPos(hwnd, NULL, 0, 0, rc.right-rc.left,
  545.       rc.bottom-rc.top,
  546.       SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
  547.     SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0,
  548.       SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
  549.   }
  550.   bIgnoreWM_SIZE = FALSE;
  551.   d3dappi.pClientOnPrimary.x = d3dappi.pClientOnPrimary.y = 0;
  552.   ClientToScreen(hwnd, &d3dappi.pClientOnPrimary);
  553.   d3dappi.szClient.cx = w; d3dappi.szClient.cy = h;
  554. }
  555. void D3DAppIGetClientWin(HWND hwnd)
  556. {
  557.   RECT rc;
  558.   if (!d3dappi.bFullscreen) 
  559.   {
  560.     d3dappi.pClientOnPrimary.x = d3dappi.pClientOnPrimary.y = 0;
  561.     ClientToScreen(hwnd, &d3dappi.pClientOnPrimary);
  562.     GetClientRect(hwnd, &rc);
  563.     d3dappi.szClient.cx = rc.right;
  564.     d3dappi.szClient.cy = rc.bottom;
  565.   }
  566.   else 
  567.   {  
  568.   /*
  569.   * In the fullscreen case, we must be careful because if the window
  570.   * frame has been drawn, the client size has shrunk and this can
  571.   * cause problems, so it's best to report the entire screen.
  572.   */
  573.     d3dappi.pClientOnPrimary.x = d3dappi.pClientOnPrimary.y = 0;
  574.     d3dappi.szClient.cx = d3dappi.ThisMode.w;
  575.     d3dappi.szClient.cy = d3dappi.ThisMode.h;
  576.   }
  577. }
  578. /***************************************************************************/
  579. /*                              Error reporting                            */
  580. /***************************************************************************/
  581. /*
  582. * D3DAppISetErrorString
  583. * Set the global variable which records the last error string.
  584. */
  585. void
  586. D3DAppISetErrorString( LPSTR fmt, ... )
  587. {
  588.   char buff[256];
  589.   va_list args;
  590.   
  591.   buff[0] = 0;
  592.   va_start(args, fmt);
  593.   wvsprintf(&buff[0], fmt, args);
  594.   va_end(args);
  595.   
  596.   lstrcat(buff, "rn");
  597.   lstrcpy(LastErrorString, buff);
  598. }
  599. /* dpf
  600. * Debug printf.  Very useful for fullscreen exclusive mode or when surfaces
  601. * are in video memory.
  602. */
  603. void __cdecl
  604. dpf( LPSTR fmt, ... )
  605. {
  606.   char buff[256];
  607.   va_list args;
  608.   
  609.   lstrcpy(buff, "D3DApp: ");
  610.   va_start(args, fmt);
  611.   wvsprintf(&buff[lstrlen(buff)], fmt, args);
  612.   va_end(args);
  613.   
  614.   lstrcat(buff, "rn");
  615.   OutputDebugString(buff);
  616. }
  617. void DelayTime(DWORD delay)
  618. {
  619.   DWORD LastTickCount=timeGetTime();
  620.   while(timeGetTime()-LastTickCount<delay)
  621.   {
  622.     ProcessMessage();
  623.   }
  624. }
  625. extern long BackNo;
  626. extern D3DAppInfo* d3dapp;
  627. extern HFONT g_MessagehFont3;
  628. extern HFONT g_MessagehFont4;
  629. static                 HDC  hDC;
  630. static LPDIRECTDRAWSURFACE  BackupImage[2]={ NULL,NULL };
  631. static                char  CandNumber[19]="1.2.3.4.5.6.7.8.9.";
  632. void DrawLINE(long sx,long sy,long fx,long fy,COLORREF c)
  633. {
  634.   long dx,dy,i;
  635.   HPEN hpenNew,hpenOld;
  636.   
  637.   dx=fx>sx?fx-sx:sx-fx;
  638.   dy=fy>sy?fy-sy:sy-fy;
  639.   hpenNew=CreatePen(PS_SOLID,1,c);
  640.   hpenOld=(HPEN)SelectObject(hDC,hpenNew);
  641.   if(dx>dy) 
  642.   { 
  643.     for(i=sy;i<=fy;i++)
  644.     {
  645.       MoveToEx(hDC,sx,i,NULL);
  646.       LineTo(hDC,fx+1,i);
  647.     }
  648.   }
  649.   else
  650.   { 
  651.     for(i=sx;i<=fx;i++)
  652.     {
  653.       MoveToEx(hDC,i,sy,NULL);
  654.       LineTo(hDC,i,fy+1);
  655.     }
  656.   }
  657.   SelectObject(hDC,hpenOld);
  658.   DeleteObject(hpenNew);
  659. }
  660. // ************************************************************************************************
  661. // 礶ミ砰娩