home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / directx / pplane / debug.cpp < prev    next >
C/C++ Source or Header  |  1997-07-14  |  34KB  |  1,131 lines

  1. /*
  2. **-----------------------------------------------------------------------------
  3. ** Name:    Debug.cpp
  4. ** Purpose: Example debug code for D3D sample
  5. ** Notes:
  6. **
  7. ** Copyright (C) 199 - 1997 Microsoft Corporation. All Rights Reserved.
  8. **-----------------------------------------------------------------------------
  9. */
  10.  
  11. /*
  12. **-----------------------------------------------------------------------------
  13. ** Includes
  14. **-----------------------------------------------------------------------------
  15. */
  16.  
  17. #include "Debug.h"
  18. #include "WinMain.h"
  19. #include "WinProc.h"
  20.  
  21.  
  22. /*
  23. **-----------------------------------------------------------------------------
  24. ** Global variables
  25. **-----------------------------------------------------------------------------
  26. */
  27.  
  28. #ifdef DEBUG
  29.     DWORD   g_dwDebugLevel = DEBUG_ALWAYS;
  30.     BOOL    g_fDebug = TRUE;
  31. #else
  32.     BOOL    g_fDebug = FALSE;
  33. #endif
  34.  
  35.  
  36.  
  37. /*
  38. **-----------------------------------------------------------------------------
  39. ** Local prototypes
  40. **-----------------------------------------------------------------------------
  41. */
  42.  
  43. BOOL GetDDErrorString (HRESULT hResult, LPTSTR lpszError, DWORD cchError);
  44.  
  45.  
  46.  
  47. /*
  48. **-----------------------------------------------------------------------------
  49. ** Functions
  50. **-----------------------------------------------------------------------------
  51. */
  52.  
  53.  
  54. /*
  55. **-----------------------------------------------------------------------------
  56. **  Name:       dprintf
  57. **  Purpose:    Printf to debug output
  58. **-----------------------------------------------------------------------------
  59. */
  60.  
  61. #ifdef DEBUG
  62. void __cdecl dprintf (DWORD dwDebugLevel, LPCTSTR szFormat, ...)
  63. {
  64.     TCHAR   szBuffer[MAX_STRING];
  65.     va_list va;
  66.  
  67.     // Check if current debug level
  68.     if (dwDebugLevel <= g_dwDebugLevel)
  69.         return;
  70.     
  71.     lstrcpy (szBuffer, START_STR);
  72.     va_start( va, szFormat );
  73.     wvsprintf (szBuffer+lstrlen (szBuffer), szFormat, va);
  74.     va_end( va );
  75.     lstrcat (szBuffer, END_STR);
  76.     OutputDebugString (szBuffer);
  77. }
  78. #endif // DEBUG
  79.  
  80.  
  81.  
  82. /*
  83. **-----------------------------------------------------------------------------
  84. ** Name:    ReportDDError
  85. ** Purpose: 
  86. **-----------------------------------------------------------------------------
  87. */
  88.  
  89. void _cdecl ReportDDError (HRESULT hResult, LPCTSTR szFormat, ...)
  90. {
  91.     TCHAR   szMsg[MAX_STRING];
  92.     TCHAR   szErr[MAX_STRING];
  93.     TCHAR   szUnknown[] = TEXT("Unknown");
  94.     DWORD   cchErr = sizeof(szErr)/sizeof(TCHAR);
  95.     va_list va;
  96.  
  97.     // Check for Success Error code
  98.     if (hResult == DD_OK)
  99.         return;
  100.  
  101.     // Get DD/D3D error string
  102.     szErr[0] = 0;
  103.     GetDDErrorString (hResult, szErr, cchErr);    
  104.     wsprintf (szMsg, TEXT("DD/D3D Error = %s\r\n"), szErr);
  105.  
  106.     va_start( va, szFormat );
  107.     // Append the rest of the error message
  108.     wvsprintf (szMsg + lstrlen(szMsg), szFormat, va);
  109.     va_end( va );
  110.  
  111.     // Dump to debugger
  112.     DPF (DEBUG_ERROR, TEXT("%s"), szMsg);
  113.  
  114.     //
  115.     // Define the following if you want an in your face Messagebox on errors
  116.     //
  117. #ifdef DEBUG_PROMPT_ME
  118.     HWND    hWindow;
  119.  
  120.     // Pause App
  121.     if (g_hMainWindow)
  122.         OnPause (g_hMainWindow, TRUE);
  123.  
  124.     // Display Error Message to user
  125.     if (g_hMainWindow)
  126.         hWindow = g_hMainWindow;
  127.     else
  128.         hWindow = NULL;
  129.  
  130.     MessageBox (hWindow, szMsg, g_szMainTitle, MB_OK | MB_APPLMODAL);
  131.  
  132.     // Unpause app
  133.     if (g_hMainWindow)
  134.         OnPause (g_hMainWindow, FALSE);
  135. #endif // DEBUG_PROMPT_ME
  136.  
  137. } // ReportDDError
  138.  
  139.  
  140.  
  141. /*
  142. **-----------------------------------------------------------------------------
  143. ** Name:    GetDDErrorString
  144. ** Purpose: outputs a debug string to debugger
  145. **-----------------------------------------------------------------------------
  146. */
  147.  
  148. BOOL GetDDErrorString (HRESULT hResult, LPTSTR lpszErrorBuff, DWORD cchError)
  149. {
  150.     DWORD  cLen;
  151.     LPTSTR lpszError;
  152.     TCHAR  szMsg[MAX_STRING];
  153.  
  154.     // Check parameters
  155.     if (!lpszErrorBuff || !cchError)
  156.     {
  157.         // Error, invalid parameters
  158.         return FALSE;
  159.     }
  160.  
  161.     switch (hResult)
  162.     {
  163.     case DD_OK:
  164.         // The request completed successfully.
  165.         lpszError = TEXT("DD_OK");
  166.         break;
  167.  
  168.     case DDERR_ALREADYINITIALIZED:
  169.         // The object has already been initialized.
  170.         lpszError = TEXT("DDERR_ALREADYINITIALIZED");
  171.         break;
  172.  
  173.     case DDERR_BLTFASTCANTCLIP:
  174.         // A DirectDrawClipper object is attached to a source surface 
  175.         // that has passed into a call to the IDirectDrawSurface2::BltFast method. 
  176.         lpszError = TEXT("DDERR_BLTFASTCANTCLIP");
  177.         break;
  178.  
  179.     case DDERR_CANNOTATTACHSURFACE:
  180.         // A surface cannot be attached to another requested surface. 
  181.         lpszError = TEXT("DDERR_CANNOTATTACHSURFACE");
  182.         break;
  183.  
  184.     case DDERR_CANNOTDETACHSURFACE:
  185.         // A surface cannot be detached from another requested surface. 
  186.         lpszError = TEXT("DDERR_CANNOTDETACHSURFACE");
  187.         break;
  188.  
  189.     case DDERR_CANTCREATEDC:
  190.         // Windows cannot create any more device contexts (DCs). 
  191.         lpszError = TEXT("DDERR_CANTCREATEDC");
  192.         break;
  193.  
  194.     case DDERR_CANTDUPLICATE:
  195.         // Primary and 3D surfaces, or surfaces that are 
  196.         // implicitly created, cannot be duplicated. 
  197.         lpszError = TEXT("DDERR_CANTDUPLICATE");
  198.         break;
  199.  
  200.     case DDERR_CANTLOCKSURFACE:
  201.         // Access to this surface is refused because an 
  202.         // attempt was made to lock the primary surface without DCI support. 
  203.         lpszError = TEXT("DDERR_CANTLOCKSURFACE"); 
  204.         break;
  205.  
  206.     case DDERR_CANTPAGELOCK:
  207.         // An attempt to page lock a surface failed. 
  208.         // Page lock will not work on a display-memory 
  209.         // surface or an emulated primary surface.
  210.         lpszError = TEXT("DDERR_CANTPAGELOCK"); 
  211.         break;
  212.  
  213.     case DDERR_CANTPAGEUNLOCK:
  214.         // An attempt to page unlock a surface failed. 
  215.         // Page unlock will not work on a display-memory 
  216.         // surface or an emulated primary surface. 
  217.         lpszError = TEXT("DDERR_CANTPAGEUNLOCK");
  218.         break;
  219.  
  220.     case DDERR_CLIPPERISUSINGHWND:
  221.         // An attempt was made to set a clip list for a DirectDrawClipper 
  222.         // object that is already monitoring a window handle. 
  223.         lpszError = TEXT("DDERR_CLIPPERISUSINGHWND");
  224.         break;
  225.  
  226.     case DDERR_COLORKEYNOTSET:
  227.         // No source color key is specified for this operation
  228.         lpszError = TEXT("DDERR_COLORKEYNOTSET");
  229.         break;
  230.  
  231.     case DDERR_CURRENTLYNOTAVAIL:
  232.         // No support is currently available. 
  233.         lpszError = TEXT("DDERR_CURRENTLYNOTAVAIL");
  234.         break;
  235.  
  236.     case DDERR_DCALREADYCREATED:
  237.         // A device context (DC) has already been returned for this surface. 
  238.         // Only one DC can be retrieved for each surface. 
  239.         lpszError = TEXT("DDERR_DCALREADYCREATED");
  240.         break;
  241.  
  242.     case DDERR_DIRECTDRAWALREADYCREATED:
  243.         // A DirectDraw object representing this driver 
  244.         // has already been created for this process. 
  245.         lpszError = TEXT("DDERR_DIRECTDRAWALREADYCREATED");
  246.         break;
  247.  
  248.     case DDERR_EXCEPTION:
  249.         // An exception was encountered while 
  250.         // performing the requested operation. 
  251.         lpszError = TEXT("DDERR_EXCEPTION");
  252.         break;
  253.  
  254.     case DDERR_EXCLUSIVEMODEALREADYSET:
  255.         // An attempt was made to set the cooperative 
  256.         // level when it was already set to exclusive. 
  257.         lpszError = TEXT("DDERR_EXCLUSIVEMODEALREADYSET");
  258.         break;
  259.  
  260.     case DDERR_GENERIC:
  261.         // There is an undefined error condition. 
  262.         lpszError = TEXT("DDERR_GENERIC");
  263.         break;
  264.  
  265.     case DDERR_HEIGHTALIGN:
  266.         // The height of the provided rectangle 
  267.         // is not a multiple of the required alignment. 
  268.         lpszError = TEXT("DDERR_HEIGHTALIGN");
  269.         break;
  270.  
  271.     case DDERR_HWNDALREADYSET:
  272.         // The DirectDraw cooperative level window 
  273.         // handle has already been set. It cannot 
  274.         // be reset while the process has surfaces or palettes created. 
  275.         lpszError = TEXT("DDERR_HWNDALREADYSET");
  276.         break;
  277.  
  278.     case DDERR_HWNDSUBCLASSED:
  279.         // DirectDraw is prevented from restoring state because the
  280.         // DirectDraw cooperative level window handle has been subclassed. 
  281.         lpszError = TEXT("DDERR_HWNDSUBCLASSED");
  282.         break;
  283.  
  284.     case DDERR_IMPLICITLYCREATED:
  285.         // The surface cannot be restored because 
  286.         // it is an implicitly created surface. 
  287.         lpszError = TEXT("DDERR_IMPLICITLYCREATED");
  288.         break;
  289.  
  290.     case DDERR_INCOMPATIBLEPRIMARY:
  291.         // The primary surface creation request 
  292.         // does not match with the existing primary surface. 
  293.         lpszError = TEXT("DDERR_INCOMPATIBLEPRIMARY");
  294.         break;
  295.  
  296.     case DDERR_INVALIDCAPS:
  297.         // One or more of the capability bits 
  298.         // passed to the callback function are incorrect. 
  299.         lpszError = TEXT("DDERR_INVALIDCAPS");
  300.         break;
  301.  
  302.     case DDERR_INVALIDCLIPLIST:
  303.         // DirectDraw does not support the provided clip list.  
  304.         lpszError = TEXT("DDERR_INVALIDCLIPLIST");
  305.         break;
  306.  
  307.     case DDERR_INVALIDDIRECTDRAWGUID:
  308.         // The globally unique identifier (GUID) passed to the
  309.         // DirectDrawCreate function is not a valid DirectDraw driver identifier. 
  310.         lpszError = TEXT("DDERR_INVALIDDIRECTDRAWGUID");
  311.         break;
  312.  
  313.     case DDERR_INVALIDMODE:
  314.         // DirectDraw does not support the requested mode. 
  315.         lpszError = TEXT("DDERR_INVALIDMODE");
  316.         break;
  317.  
  318.     case DDERR_INVALIDOBJECT:
  319.         // DirectDraw received a pointer that was an invalid DirectDraw object. 
  320.         lpszError = TEXT("DDERR_INVALIDOBJECT");
  321.         break;
  322.  
  323.     case DDERR_INVALIDPARAMS:
  324.         // One or more of the parameters passed to the method are incorrect. 
  325.         lpszError = TEXT("DDERR_INVALIDPARAMS");
  326.         break;
  327.  
  328.     case DDERR_INVALIDPIXELFORMAT:
  329.         // The pixel format was invalid as specified. 
  330.         lpszError = TEXT("DDERR_INVALIDPIXELFORMAT");
  331.         break;
  332.  
  333.     case DDERR_INVALIDPOSITION:
  334.         // The position of the overlay on the destination is no longer legal. 
  335.         lpszError = TEXT("DDERR_INVALIDPOSITION");
  336.         break;
  337.  
  338.     case DDERR_INVALIDRECT:
  339.         // The provided rectangle was invalid. 
  340.         lpszError = TEXT("DDERR_INVALIDRECT");
  341.         break;
  342.  
  343.     case DDERR_INVALIDSURFACETYPE:
  344.         // The requested operation could not be performed
  345.         // because the surface was of the wrong type. 
  346.         lpszError = TEXT("DDERR_INVALIDSURFACETYPE");
  347.         break;
  348.  
  349.     case DDERR_LOCKEDSURFACES:
  350.         // One or more surfaces are locked, 
  351.         // causing the failure of the requested operation. 
  352.         lpszError = TEXT("DDERR_LOCKEDSURFACES");
  353.         break;
  354.  
  355.     case DDERR_MOREDATA:
  356.         // There is more data available than the specified 
  357.         // buffer size could hold.
  358.         lpszError = TEXT("DDERR_MOREDATA");
  359.         break;
  360.  
  361.     case DDERR_NO3D:
  362.         // No 3D hardware or emulation is present. 
  363.         lpszError = TEXT("DDERR_NO3D");
  364.         break;
  365.  
  366.     case DDERR_NOALPHAHW:
  367.         // No alpha acceleration hardware is present or available, 
  368.         // causing the failure of the requested operation. 
  369.         lpszError = TEXT("DDERR_NOALPHAHW");
  370.         break;
  371.  
  372.     case DDERR_NOBLTHW:
  373.         // No blitter hardware is present. 
  374.         lpszError = TEXT("DDERR_NOBLTHW");
  375.         break;
  376.  
  377.     case DDERR_NOCLIPLIST:
  378.         // No clip list is available. 
  379.         lpszError = TEXT("DDERR_NOCLIPLIST");
  380.         break;
  381.  
  382.     case DDERR_NOCLIPPERATTACHED:
  383.         // No DirectDrawClipper object is attached to the surface object. 
  384.         lpszError = TEXT("DDERR_NOCLIPPERATTACHED");
  385.         break;
  386.  
  387.     case DDERR_NOCOLORCONVHW:
  388.         // The operation cannot be carried out because 
  389.         // no color-conversion hardware is present or available. 
  390.         lpszError = TEXT("DDERR_NOCOLORCONVHW");
  391.         break;
  392.  
  393.     case DDERR_NOCOLORKEY:
  394.         // The surface does not currently have a color key. 
  395.         lpszError = TEXT("DDERR_NOCOLORKEY");
  396.         break;
  397.  
  398.     case DDERR_NOCOLORKEYHW:
  399.         // The operation cannot be carried out because there 
  400.         // is no hardware support for the destination color key. 
  401.         lpszError = TEXT("DDERR_NOCOLORKEYHW");
  402.         break;
  403.  
  404.     case DDERR_NOCOOPERATIVELEVELSET:
  405.         // A create function is called without the 
  406.         // IDirectDraw2::SetCooperativeLevel method being called. 
  407.         lpszError = TEXT("DDERR_NOCOOPERATIVELEVELSET");
  408.         break;
  409.  
  410.     case DDERR_NODC:
  411.         // No DC has ever been created for this surface. 
  412.         lpszError = TEXT("DDERR_NODC");
  413.         break;
  414.  
  415.     case DDERR_NODDROPSHW:
  416.         // No DirectDraw raster operation (ROP) hardware is available. 
  417.         lpszError = TEXT("DDERR_NODDROPSHW");
  418.         break;
  419.  
  420.     case DDERR_NODIRECTDRAWHW:
  421.         // Hardware-only DirectDraw object creation is not possible; 
  422.         // the driver does not support any hardware. 
  423.         lpszError = TEXT("DDERR_NODIRECTDRAWHW");
  424.         break;
  425.  
  426.     case DDERR_NODIRECTDRAWSUPPORT:
  427.         // DirectDraw support is not possible with the current display driver. 
  428.         lpszError = TEXT("DDERR_NODIRECTDRAWSUPPORT");
  429.         break;
  430.  
  431.     case DDERR_NOEMULATION: 
  432.         // Software emulation is not available. 
  433.         lpszError = TEXT("DDERR_NOEMULATION");
  434.         break;
  435.  
  436.     case DDERR_NOEXCLUSIVEMODE:
  437.         // The operation requires the application to have 
  438.         // exclusive mode, but the application does not have exclusive mode. 
  439.         lpszError = TEXT("DDERR_NOEXCLUSIVEMODE");
  440.         break;
  441.  
  442.     case DDERR_NOFLIPHW: 
  443.         // Flipping visible surfaces is not supported. 
  444.         lpszError = TEXT("DDERR_NOFLIPHW");
  445.         break;
  446.  
  447.     case DDERR_NOGDI: 
  448.         // No GDI is present. 
  449.         lpszError = TEXT("DDERR_NOGDI");
  450.         break;
  451.  
  452.     case DDERR_NOHWND: 
  453.         // Clipper notification requires a window handle, 
  454.         // or no window handle has been previously set 
  455.         // as the cooperative level window handle. 
  456.         lpszError = TEXT("DDERR_NOHWND");
  457.         break;
  458.  
  459.     case DDERR_NOMIPMAPHW: 
  460.         // The operation cannot be carried out because no 
  461.         // mipmap texture mapping hardware is present or available. 
  462.         lpszError = TEXT("DDERR_NOMIPMAPHW");
  463.         break;
  464.  
  465.     case DDERR_NOMIRRORHW: 
  466.         // The operation cannot be carried out because 
  467.         // no mirroring hardware is present or available. 
  468.         lpszError = TEXT("DDERR_NOMIRRORHW");
  469.         break;
  470.  
  471.     case DDERR_NONONLOCALVIDMEM: 
  472.         // An attempt was made to allocate non-local video memory
  473.         // from a device that does not support non-local video memory.
  474.         lpszError = TEXT("DDERR_NONONLOCALVIDMEM");
  475.         break;
  476.  
  477.     case DDERR_NOOVERLAYDEST: 
  478.         // The IDirectDrawSurface2::GetOverlayPosition method 
  479.         // is called on an overlay that the IDirectDrawSurface2::UpdateOverlay 
  480.         // method has not been called on to establish a destination. 
  481.         lpszError = TEXT("DDERR_NOOVERLAYDEST");
  482.         break;
  483.  
  484.     case DDERR_NOOVERLAYHW: 
  485.         // The operation cannot be carried out because 
  486.         // no overlay hardware is present or available. 
  487.         lpszError = TEXT("DDERR_NOOVERLAYHW");
  488.         break;
  489.  
  490.     case DDERR_NOPALETTEATTACHED: 
  491.         // No palette object is attached to this surface. 
  492.         lpszError = TEXT("DDERR_NOPALETTEATTACHED");
  493.         break;
  494.  
  495.     case DDERR_NOPALETTEHW: 
  496.         // There is no hardware support for 16- or 256-color palettes. 
  497.         lpszError = TEXT("DDERR_NOPALETTEHW");
  498.         break;
  499.  
  500.     case DDERR_NORASTEROPHW: 
  501.         // The operation cannot be carried out because 
  502.         // no appropriate raster operation hardware is present or available. 
  503.         lpszError = TEXT("DDERR_NORASTEROPHW");
  504.         break;
  505.  
  506.     case DDERR_NOROTATIONHW: 
  507.         // The operation cannot be carried out because 
  508.         // no rotation hardware is present or available. 
  509.         lpszError = TEXT("DDERR_NOROTATIONHW");
  510.         break;
  511.  
  512.     case DDERR_NOSTRETCHHW: 
  513.         // The operation cannot be carried out because 
  514.         // there is no hardware support for stretching. 
  515.         lpszError = TEXT("DDERR_NOSTRETCHHW");
  516.         break;
  517.  
  518.     case DDERR_NOT4BITCOLOR: 
  519.         // The DirectDrawSurface object is not using a 
  520.         // 4-bit color palette and the requested operation 
  521.         // requires a 4-bit color palette. 
  522.         lpszError = TEXT("DDERR_NOT4BITCOLOR");
  523.         break;
  524.  
  525.     case DDERR_NOT4BITCOLORINDEX: 
  526.         // The DirectDrawSurface object is not using a 4-bit 
  527.         // color index palette and the requested operation 
  528.         // requires a 4-bit color index palette. 
  529.         lpszError = TEXT("DDERR_NOT4BITCOLORINDEX");
  530.         break;
  531.  
  532.     case DDERR_NOT8BITCOLOR: 
  533.         // The DirectDrawSurface object is not using an 8-bit 
  534.         // color palette and the requested operation requires 
  535.         // an 8-bit color palette. 
  536.         lpszError = TEXT("DDERR_NOT8BITCOLOR");
  537.         break;
  538.  
  539.     case DDERR_NOTAOVERLAYSURFACE: 
  540.         // An overlay component is called for a non-overlay surface. 
  541.         lpszError = TEXT("DDERR_NOTAOVERLAYSURFACE");
  542.         break;
  543.  
  544.     case DDERR_NOTEXTUREHW: 
  545.         // The operation cannot be carried out because no 
  546.         // texture-mapping hardware is present or available. 
  547.         lpszError = TEXT("DDERR_NOTEXTUREHW");
  548.         break;
  549.  
  550.     case DDERR_NOTFLIPPABLE: 
  551.         // An attempt has been made to flip a surface that cannot be flipped. 
  552.         lpszError = TEXT("DDERR_NOTFLIPPABLE");
  553.         break;
  554.  
  555.     case DDERR_NOTFOUND: 
  556.         // The requested item was not found. 
  557.         lpszError = TEXT("DDERR_NOTFOUND");
  558.         break;
  559.  
  560.     case DDERR_NOTINITIALIZED: 
  561.         // An attempt was made to call an interface method of a DirectDraw object 
  562.         // created by CoCreateInstance before the object was initialized. 
  563.         lpszError = TEXT("DDERR_NOTINITIALIZED");
  564.         break;
  565.  
  566.     case DDERR_NOTLOCKED: 
  567.         // An attempt is made to unlock a surface that was not locked. 
  568.         lpszError = TEXT("DDERR_NOTLOCKED");
  569.         break;
  570.  
  571.     case DDERR_NOTPAGELOCKED: 
  572.         // An attempt is made to page unlock a surface 
  573.         // with no outstanding page locks. 
  574.         lpszError = TEXT("DDERR_NOTPAGELOCKED");
  575.         break;
  576.  
  577.     case DDERR_NOTPALETTIZED: 
  578.         // The surface being used is not a palette-based surface. 
  579.         lpszError = TEXT("DDERR_NOTPALETTIZED");
  580.         break;
  581.  
  582.     case DDERR_NOVSYNCHW: 
  583.         // The operation cannot be carried out because 
  584.         // there is no hardware support for vertical blank synchronized operations. 
  585.         lpszError = TEXT("DDERR_NOVSYNCHW");
  586.         break;
  587.  
  588.     case DDERR_NOZBUFFERHW: 
  589.         // The operation to create a z-buffer in display memory 
  590.         // or to perform a blit using a z-buffer cannot be carried 
  591.         // out because there is no hardware support for z-buffers. 
  592.         lpszError = TEXT("DDERR_NOZBUFFERHW");
  593.         break;
  594.  
  595.     case DDERR_NOZOVERLAYHW: 
  596.         // The overlay surfaces cannot be z-layered based 
  597.         // on the z-order because the hardware does not 
  598.         // support z-ordering of overlays. 
  599.         lpszError = TEXT("DDERR_NOZOVERLAYHW");
  600.         break;
  601.  
  602.     case DDERR_OUTOFCAPS: 
  603.         // The hardware needed for the requested operation has already been allocated. 
  604.         lpszError = TEXT("DDERR_OUTOFCAPS");
  605.         break;
  606.  
  607.     case DDERR_OUTOFMEMORY: 
  608.         // DirectDraw does not have enough memory to perform the operation. 
  609.         lpszError = TEXT("DDERR_OUTOFMEMORY");
  610.         break;
  611.  
  612.     case DDERR_OUTOFVIDEOMEMORY: 
  613.         // DirectDraw does not have enough display memory to perform the operation. 
  614.         lpszError = TEXT("DDERR_OUTOFVIDEOMEMORY");
  615.         break;
  616.  
  617.     case DDERR_OVERLAYCANTCLIP: 
  618.         // The hardware does not support clipped overlays. 
  619.         lpszError = TEXT("DDERR_OVERLAYCANTCLIP");
  620.         break;
  621.  
  622.     case DDERR_OVERLAYCOLORKEYONLYONEACTIVE: 
  623.         // An attempt was made to have more than one color key active on an overlay. 
  624.         lpszError = TEXT("DDERR_OVERLAYCOLORKEYONLYONEACTIVE");
  625.         break;
  626.  
  627.     case DDERR_OVERLAYNOTVISIBLE: 
  628.         // The IDirectDrawSurface2::GetOverlayPosition method is called on a hidden overlay. 
  629.         lpszError = TEXT("DDERR_OVERLAYNOTVISIBLE");
  630.         break;
  631.  
  632.     case DDERR_PALETTEBUSY: 
  633.         // Access to this palette is refused 
  634.         // because the palette is locked by another thread. 
  635.         lpszError = TEXT("DDERR_PALETTEBUSY");
  636.         break;
  637.  
  638.     case DDERR_PRIMARYSURFACEALREADYEXISTS: 
  639.         // This process has already created a primary surface. 
  640.         lpszError = TEXT("DDERR_PRIMARYSURFACEALREADYEXISTS");
  641.         break;
  642.  
  643.     case DDERR_REGIONTOOSMALL: 
  644.         // The region passed to the 
  645.         // IDirectDrawClipper::GetClipList method is too small. 
  646.         lpszError = TEXT("DDERR_REGIONTOOSMALL");
  647.         break;
  648.  
  649.     case DDERR_SURFACEALREADYATTACHED: 
  650.         // An attempt was made to attach a surface to 
  651.         // another surface to which it is already attached. 
  652.         lpszError = TEXT("DDERR_SURFACEALREADYATTACHED");
  653.         break;
  654.  
  655.     case DDERR_SURFACEALREADYDEPENDENT: 
  656.         // An attempt was made to make a surface a dependency 
  657.         // of another surface to which it is already dependent. 
  658.         lpszError = TEXT("DDERR_SURFACEALREADYDEPENDENT");
  659.         break;
  660.  
  661.     case DDERR_SURFACEBUSY: 
  662.         // Access to the surface is refused because the 
  663.         // surface is locked by another thread. 
  664.         lpszError = TEXT("DDERR_SURFACEBUSY");
  665.         break;
  666.  
  667.     case DDERR_SURFACEISOBSCURED: 
  668.         // Access to the surface is refused 
  669.         // because the surface is obscured. 
  670.         lpszError = TEXT("DDERR_SURFACEISOBSCURED");
  671.         break;
  672.  
  673.     case DDERR_SURFACELOST: 
  674.         // Access to the surface is refused because the 
  675.         // surface memory is gone. The DirectDrawSurface 
  676.         // object representing this surface should have 
  677.         // the IDirectDrawSurface2::Restore method called on it. 
  678.         lpszError = TEXT("DDERR_SURFACELOST");
  679.         break;
  680.  
  681.     case DDERR_SURFACENOTATTACHED: 
  682.         // The requested surface is not attached. 
  683.         lpszError = TEXT("DDERR_SURFACENOTATTACHED");
  684.         break;
  685.  
  686.     case DDERR_TOOBIGHEIGHT: 
  687.         // The height requested by DirectDraw is too large. 
  688.         lpszError = TEXT("DDERR_TOOBIGHEIGHT");
  689.         break;
  690.  
  691.     case DDERR_TOOBIGSIZE: 
  692.         // The size requested by DirectDraw is too large. 
  693.         // However, the individual height and width are OK.
  694.         lpszError = TEXT("DDERR_TOOBIGSIZE");
  695.         break;
  696.  
  697.     case DDERR_TOOBIGWIDTH: 
  698.         // The width requested by DirectDraw is too large. 
  699.         lpszError = TEXT("DDERR_TOOBIGWIDTH");
  700.         break;
  701.  
  702.     case DDERR_UNSUPPORTED: 
  703.         // The operation is not supported. 
  704.         lpszError = TEXT("DDERR_UNSUPPORTED");
  705.         break;
  706.  
  707.     case DDERR_UNSUPPORTEDFORMAT: 
  708.         // The FourCC format requested is not supported by DirectDraw. 
  709.         lpszError = TEXT("DDERR_UNSUPPORTEDFORMAT");
  710.         break;
  711.  
  712.     case DDERR_UNSUPPORTEDMASK: 
  713.         // The bitmask in the pixel format requested is not supported by DirectDraw. 
  714.         lpszError = TEXT("DDERR_UNSUPPORTEDMASK");
  715.         break;
  716.  
  717.     case DDERR_UNSUPPORTEDMODE: 
  718.         // The display is currently in an unsupported mode. 
  719.         lpszError = TEXT("DDERR_UNSUPPORTEDMODE");
  720.         break;
  721.  
  722.     case DDERR_VERTICALBLANKINPROGRESS: 
  723.         // A vertical blank is in progress. 
  724.         lpszError = TEXT("DDERR_VERTICALBLANKINPROGRESS");
  725.         break;
  726.  
  727.     case DDERR_WASSTILLDRAWING: 
  728.         // The previous blit operation that is transferring 
  729.         // information to or from this surface is incomplete. 
  730.         lpszError = TEXT("DDERR_WASSTILLDRAWING");
  731.         break;
  732.  
  733.     case DDERR_WRONGMODE:
  734.         // This surface cannot be restored because it was created in a different mode. 
  735.         lpszError = TEXT("DDERR_WRONGMODE");
  736.         break;
  737.  
  738.     case DDERR_XALIGN:
  739.         // The provided rectangle was not horizontally aligned on a required boundary. 
  740.         lpszError = TEXT("DDERR_XALIGN");
  741.         break;
  742.  
  743.     case DDERR_VIDEONOTACTIVE:
  744.         // The video port is not active
  745.         lpszError = TEXT("DDERR_VIDEONOTACTIVE");
  746.         break;
  747.  
  748.  
  749.         //
  750.         // D3D Immediate Mode Errors
  751.         //
  752.  
  753.     case D3DERR_BADMAJORVERSION:
  754.         // ???
  755.         lpszError = TEXT("D3DERR_BADMAJORVERSION");
  756.         break;
  757.  
  758.     case D3DERR_BADMINORVERSION:
  759.         // ???
  760.         lpszError = TEXT("D3DERR_BADMINORVERSION");
  761.         break;
  762.  
  763.     case D3DERR_INVALID_DEVICE:
  764.         // ???
  765.         lpszError = TEXT("D3DERR_INVALID_DEVICE");
  766.         break;
  767.  
  768.     case D3DERR_INITFAILED:
  769.         // ???
  770.         lpszError = TEXT("D3DERR_INITFAILED");
  771.         break;
  772.  
  773.     case D3DERR_EXECUTE_CREATE_FAILED:
  774.         // ???
  775.         lpszError = TEXT("D3DERR_EXECUTE_CREATE_FAILED");
  776.         break;
  777.  
  778.     case D3DERR_EXECUTE_DESTROY_FAILED:
  779.         // ???
  780.         lpszError = TEXT("D3DERR_EXECUTE_DESTROY_FAILED");
  781.         break;
  782.  
  783.     case D3DERR_EXECUTE_LOCK_FAILED:
  784.         // ???
  785.         lpszError = TEXT("D3DERR_EXECUTE_LOCK_FAILED");
  786.         break;
  787.  
  788.     case D3DERR_EXECUTE_UNLOCK_FAILED:
  789.         // ???
  790.         lpszError = TEXT("D3DERR_EXECUTE_UNLOCK_FAILED");
  791.         break;
  792.  
  793.     case D3DERR_EXECUTE_LOCKED:
  794.         // ???
  795.         lpszError = TEXT("D3DERR_EXECUTE_LOCKED");
  796.         break;
  797.  
  798.     case D3DERR_EXECUTE_NOT_LOCKED:
  799.         // ???
  800.         lpszError = TEXT("D3DERR_EXECUTE_NOT_LOCKED");
  801.         break;
  802.  
  803.     case D3DERR_EXECUTE_FAILED:
  804.         // ???
  805.         lpszError = TEXT("D3DERR_EXECUTE_FAILED");
  806.         break;
  807.  
  808.     case D3DERR_EXECUTE_CLIPPED_FAILED:
  809.         // ???
  810.         lpszError = TEXT("D3DERR_CLIPPED_FAILED");
  811.         break;
  812.  
  813.     case D3DERR_TEXTURE_NO_SUPPORT:
  814.         // ???
  815.         lpszError = TEXT("D3DERR_TEXTURE_NO_SUPPORT");
  816.         break;
  817.  
  818.     case D3DERR_TEXTURE_CREATE_FAILED:
  819.         // ???
  820.         lpszError = TEXT("D3DERR_TEXTURE_CREATE_FAILED");
  821.         break;
  822.  
  823.     case D3DERR_TEXTURE_DESTROY_FAILED:
  824.         // ???
  825.         lpszError = TEXT("D3DERR_TEXTURE_DESTROY_FAILED");
  826.         break;
  827.  
  828.     case D3DERR_TEXTURE_LOCK_FAILED:
  829.         // ???
  830.         lpszError = TEXT("D3DERR_TEXTURE_LOCK_FAILED");
  831.         break;
  832.  
  833.     case D3DERR_TEXTURE_UNLOCK_FAILED:
  834.         // ???
  835.         lpszError = TEXT("D3DERR_TEXTURE_UNLOCK_FAILED");
  836.         break;
  837.  
  838.     case D3DERR_TEXTURE_LOAD_FAILED:
  839.         // ???
  840.         lpszError = TEXT("D3DERR_LOAD_FAILED");
  841.         break;
  842.  
  843.     case D3DERR_TEXTURE_SWAP_FAILED:
  844.         // ???
  845.         lpszError = TEXT("D3DERR_SWAP_FAILED");
  846.         break;
  847.  
  848.     case D3DERR_TEXTURE_LOCKED:
  849.         // ???
  850.         lpszError = TEXT("D3DERR_TEXTURE_LOCKED");
  851.         break;
  852.  
  853.     case D3DERR_TEXTURE_NOT_LOCKED:
  854.         // ???
  855.         lpszError = TEXT("D3DERR_TEXTURE_NOT_LOCKED");
  856.         break;
  857.  
  858.     case D3DERR_TEXTURE_GETSURF_FAILED:
  859.         // ???
  860.         lpszError = TEXT("D3DERR_TEXTURE_GETSURF_FAILED");
  861.         break;
  862.  
  863.     case D3DERR_MATRIX_CREATE_FAILED:
  864.         // ???
  865.         lpszError = TEXT("D3DERR_MATRIX_CREATE_FAILED");
  866.         break;
  867.  
  868.     case D3DERR_MATRIX_DESTROY_FAILED:
  869.         // ???
  870.         lpszError = TEXT("D3DERR_MATRIX_DESTROY_FAILED");
  871.         break;
  872.  
  873.     case D3DERR_MATRIX_SETDATA_FAILED:
  874.         // ???
  875.         lpszError = TEXT("D3DERR_MATRIX_SETDATA_FAILED");
  876.         break;
  877.  
  878.     case D3DERR_MATRIX_GETDATA_FAILED:
  879.         // ???
  880.         lpszError = TEXT("D3DERR_MAXTRIX_GETDATA_FAILED");
  881.         break;
  882.  
  883.     case D3DERR_SETVIEWPORTDATA_FAILED:
  884.         // ???
  885.         lpszError = TEXT("D3DERR_SETVIEWPORTDATA_FAILED");
  886.         break;
  887.  
  888.     case D3DERR_INVALIDCURRENTVIEWPORT:
  889.         // ???
  890.         lpszError = TEXT("D3DERR_INVALIDCURRENTVIEWPORT");
  891.         break;
  892.     
  893.     case D3DERR_INVALIDPRIMITIVETYPE:
  894.         // ???
  895.         lpszError = TEXT("D3DERR_INVALIDPRIMITIVETYPE");
  896.         break;
  897.  
  898.     case D3DERR_INVALIDVERTEXTYPE:
  899.         // ???
  900.         lpszError = TEXT("D3DERR_INVALIDVERTEXTYPE");
  901.         break;
  902.  
  903.     case D3DERR_TEXTURE_BADSIZE:
  904.         // ???
  905.         lpszError = TEXT("D3DERR_TEXTURE_BADSIZE");
  906.         break;
  907.  
  908.     case D3DERR_MATERIAL_CREATE_FAILED:
  909.         // ???
  910.         lpszError = TEXT("D3DERR_MATERIAL_CREATE_FAILED");
  911.         break;
  912.  
  913.     case D3DERR_MATERIAL_DESTROY_FAILED:
  914.         // ???
  915.         lpszError = TEXT("D3DERR_MATERIAL_DESTROY_FAILED");
  916.         break;
  917.  
  918.     case D3DERR_MATERIAL_SETDATA_FAILED:
  919.         // ???
  920.         lpszError = TEXT("D3DERR_MATERIAL_SETDATA_FAILED");
  921.         break;
  922.  
  923.     case D3DERR_MATERIAL_GETDATA_FAILED:
  924.         // ???
  925.         lpszError = TEXT("D3DERR_MATERIAL_GETDATA_FAILED");
  926.         break;
  927.  
  928.     case D3DERR_INVALIDPALETTE:
  929.         // ???
  930.         lpszError = TEXT("D3DERR_INVALIDPALETTE");
  931.         break;
  932.  
  933.     case D3DERR_ZBUFF_NEEDS_SYSTEMMEMORY:
  934.         // ???
  935.         lpszError = TEXT("D3DERR_ZBUFF_NEEDS_SYSTEMMEMORY");
  936.         break;
  937.  
  938.     case D3DERR_ZBUFF_NEEDS_VIDEOMEMORY:
  939.         // ???
  940.         lpszError = TEXT("D3DERR_ZBUFF_NEEDS_VIDEOMEMORY");
  941.         break;
  942.  
  943.     case D3DERR_SURFACENOTINVIDMEM:
  944.         // ???
  945.         lpszError = TEXT("D3DERR_SURFACENOTINVIDMEM");
  946.         break;
  947.  
  948.     case D3DERR_LIGHT_SET_FAILED:
  949.         // ???
  950.         lpszError = TEXT("D3DERR_LIGHT_SET_FAILED");
  951.         break;
  952.  
  953.     case D3DERR_LIGHTHASVIEWPORT:
  954.         // ???
  955.         lpszError = TEXT("D3DERR_LIGHTHASVIEWPORT");
  956.         break;
  957.  
  958.     case D3DERR_LIGHTNOTINTHISVIEWPORT:
  959.         // ???
  960.         lpszError = TEXT("D3DERR_LIGHTNOTINTHISVIEWPORT");
  961.         break;
  962.  
  963.     case D3DERR_SCENE_IN_SCENE:
  964.         // ???
  965.         lpszError = TEXT("D3DERR_SCENE_IN_SCENE");
  966.         break;
  967.  
  968.     case D3DERR_SCENE_NOT_IN_SCENE:
  969.         // ???
  970.         lpszError = TEXT("D3DERR_SCENE_NOT_IN_SCENE");
  971.         break;
  972.  
  973.     case D3DERR_SCENE_BEGIN_FAILED:
  974.         // ???
  975.         lpszError = TEXT("D3DERR_SCENE_BEGIN_FAILED");
  976.         break;
  977.  
  978.     case D3DERR_SCENE_END_FAILED:
  979.         // ???
  980.         lpszError = TEXT("D3DERR_SCENE_END_FAILED");
  981.         break;
  982.  
  983.     case D3DERR_INBEGIN:
  984.         // ???
  985.         lpszError = TEXT("D3DERR_INBEGIN");
  986.         break;
  987.  
  988.     case D3DERR_NOTINBEGIN:
  989.         // ???
  990.         lpszError = TEXT("D3DERR_NOTINBEGIN");
  991.         break;
  992.  
  993.     case D3DERR_NOVIEWPORTS:
  994.         // ???
  995.         lpszError = TEXT("D3DERR_NOVIEWPORTS");
  996.         break;
  997.  
  998.     case D3DERR_VIEWPORTDATANOTSET:
  999.         // ???
  1000.         lpszError = TEXT("D3DERR_VIEWPORTDATANOTSET");
  1001.         break;
  1002.  
  1003.     case D3DERR_VIEWPORTHASNODEVICE:
  1004.         // ???
  1005.         lpszError = TEXT("D3DERR_VIEWPORTHASNODEVICE");
  1006.         break;
  1007.  
  1008.     
  1009.         //
  1010.         // D3D Retained Mode Errors
  1011.         //
  1012. #if 0    
  1013.     case D3DRMERR_BADOBJECT:
  1014.         // ???
  1015.         lpszError = TEXT("D3DRMERR_BADOBJECT");
  1016.         break;
  1017.  
  1018.     case D3DRMERR_BADTYPE:
  1019.         // ???
  1020.         lpszError = TEXT("D3DRMERR_BADTYPE");
  1021.         break;
  1022.  
  1023.     case D3DRMERR_BADALLOC:
  1024.         // ???
  1025.         lpszError = TEXT("D3DRMERR_BADALLOC");
  1026.         break;
  1027.  
  1028.     case D3DRMERR_FACEUSED:
  1029.         // ???
  1030.         lpszError = TEXT("D3DRMERR_FACEUSED");
  1031.         break;
  1032.  
  1033.     case D3DRMERR_NOTFOUND:
  1034.         // ???
  1035.         lpszError = TEXT("D3DRMERR_NOTFOUND");
  1036.         break;
  1037.  
  1038.     case D3DRMERR_NOTDONEYET:
  1039.         // ???
  1040.         lpszError = TEXT("D3DRMERR_NOTDONEYET");
  1041.         break;
  1042.  
  1043.     case D3DRMERR_FILENOTFOUND:
  1044.         // ???
  1045.         lpszError = TEXT("D3DRMERR_FILENOTFOUND");
  1046.         break;
  1047.  
  1048.     case D3DRMERR_BADFILE:
  1049.         // ???
  1050.         lpszError = TEXT("D3DRMERR_BADFILE");
  1051.         break;
  1052.  
  1053.     case D3DRMERR_BADDEVICE:
  1054.         // ???
  1055.         lpszError = TEXT("D3DRMERR_BADDEVICE");
  1056.         break;
  1057.  
  1058.     case D3DRMERR_BADVALUE:
  1059.         // ???
  1060.         lpszError = TEXT("D3DRMERR_BADVALUE");
  1061.         break;
  1062.  
  1063.     case D3DRMERR_BADMAJORVERSION:
  1064.         // ???
  1065.         lpszError = TEXT("D3DRMERR_BADMAJORVERSION");
  1066.         break;
  1067.  
  1068.     case D3DRMERR_BADMINORVERSION:
  1069.         // ???
  1070.         lpszError = TEXT("D3DRMERR_BADMINORVERSION");
  1071.         break;
  1072.  
  1073.     case D3DRMERR_UNABLETOEXECUTE:
  1074.         // ???
  1075.         lpszError = TEXT("D3DRMERR_BADMINORVERSION");
  1076.         break;
  1077. #endif // D3DRM_ERRORS
  1078.  
  1079.  
  1080.         //
  1081.         // Application defined errors
  1082.         //
  1083.     case APPERR_GENERIC:
  1084.         // Generic Error
  1085.         lpszError = TEXT("APPERR_GENERIC");
  1086.         break;
  1087.  
  1088.     case APPERR_INVALIDPARAMS:
  1089.         // Invalid Parameters passed into function
  1090.         lpszError = TEXT("APPERR_INVALIDPARAMS");
  1091.         break;
  1092.  
  1093.     case APPERR_NOTINITIALIZED:
  1094.         // Programmer error, called function without proper initialization
  1095.         lpszError = TEXT("APPERR_NOT_INITIALIZED");
  1096.         break;
  1097.  
  1098.     default:
  1099.         // Unknown DD/D3D/App Error
  1100.         wsprintf (szMsg, "Unknown Error #%ld", (DWORD)(hResult & 0x0000FFFFL));
  1101.         lpszError = szMsg;
  1102.         break;
  1103.     }
  1104.  
  1105.     // Copy DD/D3D Error string to buff
  1106.     cLen = strlen (lpszError);
  1107.     if (cLen >= cchError)
  1108.     {
  1109.         cLen = cchError - 1;
  1110.     }
  1111.  
  1112.     if (cLen)
  1113.     {
  1114.         strncpy (lpszErrorBuff, lpszError, cLen);
  1115.         lpszErrorBuff[cLen] = 0;
  1116.     }
  1117.  
  1118.     return TRUE;
  1119. } // End GetDDErrorString
  1120.  
  1121.  
  1122.  
  1123.  
  1124. /*
  1125. **-----------------------------------------------------------------------------
  1126. ** End of File
  1127. **-----------------------------------------------------------------------------
  1128. */
  1129.  
  1130.  
  1131.