debug.cpp
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:50k
源码类别:

打印编程

开发平台:

Visual C++

  1. //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. //  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. //  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. //  PARTICULAR PURPOSE.
  5. //
  6. //  Copyright  1996 - 2003  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  FILE:   Debug.cpp
  9. //
  10. //
  11. //  PURPOSE:  Implementation of the COemUniDbg debug class and
  12. //          its associated debug functions.
  13. //
  14. //
  15. //  Functions:
  16. //          COemUniDbg constructor and destructor
  17. //          COemUniDbg::OEMDebugMessage
  18. //          COemUniDbg::OEMRealDebugMessage
  19. //          COemUniDbg::StripDirPrefixA
  20. //          COemUniDbg::EnsureLabel
  21. //          COemUniDbg::vDumpFlags
  22. //          COemUniDbg::vDumpOemDevMode
  23. //          COemUniDbg::vDumpOemDMParam
  24. //          COemUniDbg::vDumpSURFOBJ
  25. //          COemUniDbg::vDumpSTROBJ
  26. //          COemUniDbg::vDumpFONTOBJ
  27. //          COemUniDbg::vDumpCLIPOBJ
  28. //          COemUniDbg::vDumpBRUSHOBJ
  29. //          COemUniDbg::vDumpGDIINFO
  30. //          COemUniDbg::vDumpDEVINFO
  31. //          COemUniDbg::vDumpBitmapInfoHeader
  32. //          COemUniDbg::vDumpPOINTL
  33. //          COemUniDbg::vDumpRECTL
  34. //          COemUniDbg::vDumpXLATEOBJ
  35. //          COemUniDbg::vDumpCOLORADJUSTMENT
  36. //
  37. //
  38. //
  39. //  PLATFORMS:  Windows XP, Windows Server 2003, Windows codenamed Longhorn
  40. //
  41. //
  42. //  History:
  43. //          06/28/03    xxx created.
  44. //
  45. //
  46. #include "precomp.h"
  47. #include "bitmap.h"
  48. #include "devmode.h"
  49. #include "debug.h"
  50. // StrSafe.h needs to be included last
  51. // to disallow bad string functions.
  52. #include <STRSAFE.H>
  53. ////////////////////////////////////////////////////////
  54. //      INTERNAL DEFINES
  55. ////////////////////////////////////////////////////////
  56. #define DEBUG_BUFFER_SIZE       1024
  57. #define PATH_SEPARATOR          '\'
  58. #define MAX_LOOP                10
  59. // Determine what level of debugging messages to eject.
  60. #ifdef VERBOSE_MSG
  61.     #define DEBUG_LEVEL     DBG_VERBOSE
  62. #elif TERSE_MSG
  63.     #define DEBUG_LEVEL     DBG_TERSE
  64. #elif WARNING_MSG
  65.     #define DEBUG_LEVEL     DBG_WARNING
  66. #elif ERROR_MSG
  67.     #define DEBUG_LEVEL     DBG_ERROR
  68. #elif RIP_MSG
  69.     #define DEBUG_LEVEL     DBG_RIP
  70. #elif NO_DBG_MSG
  71.     #define DEBUG_LEVEL     DBG_NONE
  72. #else
  73.     #define DEBUG_LEVEL     DBG_WARNING
  74. #endif
  75. ////////////////////////////////////////////////////////
  76. //      EXTERNAL GLOBALS
  77. ////////////////////////////////////////////////////////
  78. INT giDebugLevel = DEBUG_LEVEL;
  79. ////////////////////////////////////////////////////////////////////////////////
  80. //
  81. // COemUniDbg body
  82. //
  83. __stdcall COemUniDbg::COemUniDbg(
  84.          INT     iDebugLevel,
  85.     __in PWSTR   pszInTag
  86.     )
  87. {
  88.     // Do any init stuff here.
  89.     //
  90.     // Check if the debug level is appropriate to output the tag
  91.     //
  92.     if (iDebugLevel >= giDebugLevel)
  93.     {
  94.         PCWSTR pszTag = EnsureLabel(pszInTag, L"??? function entry.");
  95.         OEMDebugMessage(DLLTEXT("%srn"), pszTag);
  96.     }
  97. }
  98. __stdcall COemUniDbg::~COemUniDbg(
  99.     VOID
  100.     )
  101. {
  102.     // Do any cleanup stuff here.
  103.     //
  104. }
  105. BOOL __stdcall
  106. COemUniDbg::
  107. OEMDebugMessage(
  108.     LPCWSTR lpszMessage,
  109.     ...
  110.     )
  111. /*++
  112. Routine Description:
  113.     Outputs variable argument debug string.
  114. Arguments:
  115.     lpszMessage - format string
  116. Return Value:
  117.     TRUE if successful, FALSE if there is an error
  118. --*/
  119. {
  120.     BOOL    bResult;
  121.     va_list VAList;
  122.     // Pass the variable parameters to OEMRealDebugMessage to be processed.
  123.     va_start(VAList, lpszMessage);
  124.     bResult = OEMRealDebugMessage(MAX_PATH, lpszMessage, VAList);
  125.     va_end(VAList);
  126.     return bResult;
  127. }
  128. BOOL __stdcall
  129. COemUniDbg::
  130. OEMRealDebugMessage(
  131.     DWORD       dwSize,
  132.     LPCWSTR lpszMessage,
  133.     va_list     arglist
  134.     )
  135. /*++
  136. Routine Description:
  137.     Outputs variable argument debug string.
  138. Arguments:
  139.     dwSize - size of temp buffer to hold formatted string
  140.     lpszMessage - format string
  141.     arglist - Variable argument list...
  142. Return Value:
  143.     TRUE if successful, FALSE if there is an error
  144. --*/
  145. {
  146.     LPWSTR      lpszMsgBuf;
  147.     HRESULT     hResult;
  148.     // Parameter checking.
  149.     if( (NULL == lpszMessage)
  150.         ||
  151.         (0 == dwSize) )
  152.     {
  153.         return FALSE;
  154.     }
  155.     // Allocate memory for message buffer.
  156.     lpszMsgBuf = new WCHAR[dwSize + 1];
  157.     if(NULL == lpszMsgBuf)
  158.         return FALSE;
  159.     // Pass the variable parameters to wvsprintf to be formated.
  160.     hResult = StringCbVPrintfW(lpszMsgBuf, (dwSize + 1) * sizeof(WCHAR), lpszMessage, arglist);
  161.     // Dump string to debug output.
  162.     OutputDebugStringW(lpszMsgBuf);
  163.     // Clean up.
  164.     delete[] lpszMsgBuf;
  165.     return SUCCEEDED(hResult);
  166. }
  167. PCSTR __stdcall
  168. COemUniDbg::
  169. StripDirPrefixA(
  170.     IN PCSTR    pstrFilename
  171.     )
  172. /*++
  173. Routine Description:
  174.     Strip the directory prefix off a filename (ANSI version)
  175. Arguments:
  176.     pstrFilename - Pointer to filename string
  177. Return Value:
  178.     Pointer to the last component of a filename (without directory prefix)
  179. --*/
  180. {
  181.     PCSTR   pstr;
  182.     pstr = strrchr(pstrFilename, PATH_SEPARATOR);
  183.     if (pstr)
  184.         return pstr + 1;
  185.     return pstrFilename;
  186. }
  187. PCWSTR __stdcall
  188. COemUniDbg::
  189. EnsureLabel(
  190.     PCWSTR      pszInLabel,
  191.     PCWSTR      pszDefLabel
  192.     )
  193. /*++
  194. Routine Description:
  195.     This function checks if pszInLabel is valid. If not, it returns
  196.     pszDefLabel else pszInLabel is returned.
  197. Arguments:
  198.     pszInLabel - custom label string passed in with the call to the dump function
  199.     pszDefLabel - default label string in case custom label string is not valid
  200. Return Value:
  201.     pszInLabel if it is valid, else pszDefLabel
  202. --*/
  203. {
  204.     // By design, pszDefLabel is assumed to be a valid, non-empty
  205.     // string (since it is supplied internally).
  206.     //
  207.     if (!pszInLabel || !*pszInLabel)
  208.     {
  209.         // The caller supplied a NULL string or empty string;
  210.         // supply the internal default.
  211.         //
  212.         return pszDefLabel;
  213.     }
  214.     return pszInLabel;
  215. }
  216. void __stdcall
  217. COemUniDbg::
  218. vDumpFlags(
  219.     DWORD           dwFlags,
  220.     PDBG_FLAGS      pDebugFlags
  221.     )
  222. /*++
  223. Routine Description:
  224.     Dumps the combination of flags in members such as
  225.     pso->fjBitmap, pstro->flAccel, pfo->flFontType etc.
  226. Arguments:
  227.     dwFlags - combined value of the relevant member
  228.         Example values are pso->fjBitmap, pstro->flAccel
  229.     pDebugFlags - structure containing the different possible values
  230.         that can be combined in dwFlags
  231. Return Value:
  232.     NONE
  233. --*/
  234. {
  235.     DWORD dwFound = 0;
  236.     BOOL bFirstFlag = FALSE;
  237.     OEMDebugMessage(TEXT( "%#x ["), dwFlags);
  238.     // Traverse through the list of flags to see if any match
  239.     //
  240.     for ( ; pDebugFlags->dwFlag; ++pDebugFlags)
  241.     {
  242.         if(dwFlags & pDebugFlags->dwFlag)
  243.         {
  244.             if (!bFirstFlag)
  245.             {
  246.                 OEMDebugMessage(TEXT("%s"), pDebugFlags->pszFlag);
  247.                 bFirstFlag = TRUE;
  248.             }
  249.             else
  250.             {
  251.                 OEMDebugMessage(TEXT(" | %s"), pDebugFlags->pszFlag);
  252.             }
  253.             dwFound |= pDebugFlags->dwFlag;
  254.         }
  255.     }
  256.     OEMDebugMessage(TEXT("]"));
  257.     //
  258.     // Check if there are extra bits set that we don't understand.
  259.     //
  260.     if(dwFound != dwFlags)
  261.     {
  262.         OEMDebugMessage(TEXT("  <ExtraBits: %x>"), dwFlags & ~dwFound);
  263.     }
  264.     OEMDebugMessage(TEXT("rn"));
  265. }
  266. void __stdcall
  267. COemUniDbg::
  268. vDumpOemDevMode(
  269.     INT             iDebugLevel,
  270.     __in PWSTR      pszInLabel,
  271.     PCOEMDEV        pOemDevmode
  272.     )
  273. /*++
  274. Routine Description:
  275.     Dumps the members of a private OEM devmode (OEMDEV) structure.
  276. Arguments:
  277.     iDebugLevel - desired output debug level
  278.     pszInLabel - output label string
  279.     pOemDevmode - pointer to the OEMDEV strct to be dumped
  280. Return Value:
  281.     NONE
  282. --*/
  283. {
  284.     // Check if the debug level is appropriate
  285.     //
  286.     if (iDebugLevel < giDebugLevel)
  287.     {
  288.         // Nothing to output here
  289.         //
  290.         return;
  291.     }
  292.     // Prepare the label string
  293.     //
  294.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pOemDevMode");
  295.     // Return if strct to be dumped is invalid
  296.     //
  297.     if (!pOemDevmode)
  298.     {
  299.         OEMDebugMessage(TEXT("npOemDevmode [%s]: NULLrn"), pszLabel);
  300.         // Nothing else to output
  301.         //
  302.         return;
  303.     }
  304.     // Format the data
  305.     //
  306.     OEMDebugMessage(TEXT("npOemDevmode [%s]: %#xrn"), pszLabel, pOemDevmode);
  307.     if ((pOemDevmode->dmOEMExtra.dwSize >= sizeof(OEMDEV))
  308.         &&
  309.         (OEM_SIGNATURE == pOemDevmode->dmOEMExtra.dwSignature))
  310.     {
  311.         OEMDebugMessage(TEXT("tdmOEMExtra.dwSize: %drn"), pOemDevmode->dmOEMExtra.dwSize);
  312.         OEMDebugMessage(TEXT("tdmOEMExtra.dwSignature: %#xrn"), pOemDevmode->dmOEMExtra.dwSignature);
  313.         OEMDebugMessage(TEXT("tdmOEMExtra.dwVersion: %#xrn"), pOemDevmode->dmOEMExtra.dwVersion);
  314.         OEMDebugMessage(TEXT("tdwDriverData: %#xrn"), pOemDevmode->dwDriverData);
  315.     }
  316.     else
  317.     {
  318.         OEMDebugMessage(TEXT("tUnknown private OEM DEVMODE.rn"));
  319.     }
  320.     OEMDebugMessage(TEXT("n"));
  321. }
  322. void __stdcall
  323. COemUniDbg::
  324. vDumpOemDMParam(
  325.     INT             iDebugLevel,
  326.     __in PWSTR      pszInLabel,
  327.     POEMDMPARAM     pOemDMParam
  328.     )
  329. /*++
  330. Routine Description:
  331.     Dumps the members of a OEMDMPARAM structure.
  332. Arguments:
  333.     iDebugLevel - desired output debug level
  334.     pszInLabel - output label string
  335.     pOemDMParam - pointer to the OEMDMPARAM strct to be dumped
  336. Return Value:
  337.     NONE
  338. --*/
  339. {
  340.     // Check if the debug level is appropriate
  341.     //
  342.     if (iDebugLevel < giDebugLevel)
  343.     {
  344.         // Nothing to output here
  345.         //
  346.         return;
  347.     }
  348.     // Prepare the label string
  349.     //
  350.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pOemDMParam");
  351.     // Return if strct to be dumped is invalid
  352.     //
  353.     if (!pOemDMParam)
  354.     {
  355.         OEMDebugMessage(TEXT("npOemDMParam [%s]: NULLrn"), pszLabel);
  356.         // Nothing else to output
  357.         //
  358.         return;
  359.     }
  360.     // Format the data
  361.     //
  362.     OEMDebugMessage(TEXT("npOemDMParam [%s]: %#xrn"), pszLabel, pOemDMParam);
  363.     OEMDebugMessage(TEXT("tcbSize = %drn"), pOemDMParam->cbSize);
  364.     OEMDebugMessage(TEXT("tpdriverobj = %#xrn"), pOemDMParam->pdriverobj);
  365.     OEMDebugMessage(TEXT("thPrinter = %#xrn"), pOemDMParam->hPrinter);
  366.     OEMDebugMessage(TEXT("thModule = %#xrn"), pOemDMParam->hModule);
  367.     OEMDebugMessage(TEXT("tpPublicDMIn = %#xrn"), pOemDMParam->pPublicDMIn);
  368.     OEMDebugMessage(TEXT("tpPublicDMOut = %#xrn"), pOemDMParam->pPublicDMOut);
  369.     OEMDebugMessage(TEXT("tpOEMDMIn = %#xrn"), pOemDMParam->pOEMDMIn);
  370.     OEMDebugMessage(TEXT("tpOEMDMOut = %#xrn"), pOemDMParam->pOEMDMOut);
  371.     OEMDebugMessage(TEXT("tcbBufSize = %drn"), pOemDMParam->cbBufSize);
  372.     OEMDebugMessage(TEXT("n"));
  373. }
  374. #if DBG
  375.     DBG_FLAGS gafdSURFOBJ_fjBitmap[] = {
  376.         { L"BMF_TOPDOWN",       BMF_TOPDOWN},
  377.         { L"BMF_NOZEROINIT",        BMF_NOZEROINIT},
  378.         { L"BMF_DONTCACHE",     BMF_DONTCACHE},
  379.         { L"BMF_USERMEM",       BMF_USERMEM},
  380.         { L"BMF_KMSECTION",     BMF_KMSECTION},
  381.         { L"BMF_NOTSYSMEM",     BMF_NOTSYSMEM},
  382.         { L"BMF_WINDOW_BLT",    BMF_WINDOW_BLT},
  383.         {NULL, 0}               // The NULL entry is important
  384. //      { L"BMF_UMPDMEM",       BMF_UMPDMEM},
  385. //      { L"BMF_RESERVED",      BMF_RESERVED},
  386.     };
  387. #else
  388.     DBG_FLAGS gafdSURFOBJ_fjBitmap[] = {
  389.         {NULL, 0}
  390.     };
  391. #endif
  392. void __stdcall
  393. COemUniDbg::
  394. vDumpSURFOBJ(
  395.     INT         iDebugLevel,
  396.     __in PWSTR  pszInLabel,
  397.     SURFOBJ     *pso
  398.     )
  399. /*++
  400. Routine Description:
  401.     Dumps the members of a SURFOBJ structure.
  402. Arguments:
  403.     iDebugLevel - desired output debug level
  404.     pszInLabel - output label string
  405.     pso - pointer to the SURFOBJ strct to be dumped
  406. Return Value:
  407.     NONE
  408. --*/
  409. {
  410.     // Check if the debug level is appropriate
  411.     //
  412.     if (iDebugLevel < giDebugLevel)
  413.     {
  414.         // Nothing to output here
  415.         //
  416.         return;
  417.     }
  418.     // Prepare the label string
  419.     //
  420.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pso");
  421.     // Return if strct to be dumped is invalid
  422.     //
  423.     if (!pso)
  424.     {
  425.         OEMDebugMessage(TEXT("nSURFOBJ [%s]: NULLrn"), pszLabel);
  426.         // Nothing else to output
  427.         //
  428.         return;
  429.     }
  430.     // Format the data
  431.     //
  432.     OEMDebugMessage(TEXT("nSURFOBJ [%s]: %#xrn"), pszLabel, pso);
  433.     OEMDebugMessage(TEXT("tdhSurf: %#xrn"), pso->dhsurf);
  434.     OEMDebugMessage(TEXT("thSurf: %#xrn"), pso->hsurf);
  435.     OEMDebugMessage(TEXT("tdhpdev: %#xrn"), pso->dhpdev);
  436.     OEMDebugMessage(TEXT("thdev: %#xrn"), pso->hdev);
  437.     OEMDebugMessage(TEXT("tsizlBitmap: [%ld x %ld]rn"), pso->sizlBitmap.cx, pso->sizlBitmap.cy);
  438.     OEMDebugMessage(TEXT("tcjBits: %ldrn"), pso->cjBits);
  439.     OEMDebugMessage(TEXT("tpvBits: %#xrn"), pso->pvBits);
  440.     OEMDebugMessage(TEXT("tpvScan0: %#xrn"), pso->pvScan0);
  441.     OEMDebugMessage(TEXT("tlDelta: %ldrn"), pso->lDelta);
  442.     OEMDebugMessage(TEXT("tiUniq: %ldrn"), pso->iUniq);
  443.     PWSTR psziBitmapFormat = L"0";
  444.     switch (pso->iBitmapFormat)
  445.     {
  446.         case BMF_1BPP : psziBitmapFormat = L"BMF_1BPP" ; break;
  447.         case BMF_4BPP : psziBitmapFormat = L"BMF_4BPP" ; break;
  448.         case BMF_8BPP : psziBitmapFormat = L"BMF_8BPP" ; break;
  449.         case BMF_16BPP: psziBitmapFormat = L"BMF_16BPP"; break;
  450.         case BMF_24BPP: psziBitmapFormat = L"BMF_24BPP"; break;
  451.         case BMF_32BPP: psziBitmapFormat = L"BMF_32BPP"; break;
  452.         case BMF_4RLE : psziBitmapFormat = L"BMF_4RLE" ; break;
  453.         case BMF_8RLE : psziBitmapFormat = L"BMF_8RLE" ; break;
  454.         case BMF_JPEG : psziBitmapFormat = L"BMF_JPEG" ; break;
  455.         case BMF_PNG  : psziBitmapFormat = L"BMF_PNG " ; break;
  456.     }
  457.     OEMDebugMessage(TEXT("tiBitmapFormat: %srn"), psziBitmapFormat);
  458.     PWSTR psziType = L"0";
  459.     switch (pso->iType)
  460.     {
  461.         case STYPE_BITMAP   : psziType = L"STYPE_BITMAP"   ; break;
  462.         case STYPE_DEVBITMAP: psziType = L"STYPE_DEVBITMAP"; break;
  463.         case STYPE_DEVICE   : psziType = L"STYPE_DEVICE"   ; break;
  464.     }
  465.     OEMDebugMessage(TEXT("tiType: %srn"), psziType);
  466.     OEMDebugMessage(TEXT("tfjBitmap: "));
  467.     if (STYPE_BITMAP == pso->iType)
  468.         vDumpFlags(pso->fjBitmap, gafdSURFOBJ_fjBitmap);
  469.     else
  470.         OEMDebugMessage(TEXT("IGNORErn"));
  471.     OEMDebugMessage(TEXT("n"));
  472. }
  473. #if DBG
  474.     DBG_FLAGS gafdSTROBJ_flAccel[] = {
  475.         { L"SO_FLAG_DEFAULT_PLACEMENT",             SO_FLAG_DEFAULT_PLACEMENT},
  476.         { L"SO_HORIZONTAL",                         SO_HORIZONTAL},
  477.         { L"SO_VERTICAL",                           SO_VERTICAL},
  478.         { L"SO_REVERSED",                           SO_REVERSED},
  479.         { L"SO_ZERO_BEARINGS",                      SO_ZERO_BEARINGS},
  480.         { L"SO_CHAR_INC_EQUAL_BM_BASE",         SO_CHAR_INC_EQUAL_BM_BASE},
  481.         { L"SO_MAXEXT_EQUAL_BM_SIDE",               SO_MAXEXT_EQUAL_BM_SIDE},
  482.         { L"SO_DO_NOT_SUBSTITUTE_DEVICE_FONT",      SO_DO_NOT_SUBSTITUTE_DEVICE_FONT},
  483.         { L"SO_GLYPHINDEX_TEXTOUT",                 SO_GLYPHINDEX_TEXTOUT},
  484.         { L"SO_ESC_NOT_ORIENT",                     SO_ESC_NOT_ORIENT},
  485.         { L"SO_DXDY",                               SO_DXDY},
  486.         { L"SO_CHARACTER_EXTRA",                    SO_CHARACTER_EXTRA},
  487.         { L"SO_BREAK_EXTRA",                            SO_BREAK_EXTRA},
  488.         {NULL, 0}                                   // The NULL entry is important
  489.     };
  490. #else
  491.     DBG_FLAGS gafdSTROBJ_flAccel[] = {
  492.         {NULL, 0}
  493.     };
  494. #endif
  495. void __stdcall
  496. COemUniDbg::
  497. vDumpSTROBJ(
  498.     INT         iDebugLevel,
  499.     __in PWSTR  pszInLabel,
  500.     STROBJ      *pstro
  501.     )
  502. /*++
  503. Routine Description:
  504.     Dumps the members of a STROBJ structure.
  505. Arguments:
  506.     iDebugLevel - desired output debug level
  507.     pszInLabel - output label string
  508.     pstro - pointer to the STROBJ strct to be dumped
  509. Return Value:
  510.     NONE
  511. --*/
  512. {
  513.     // Check if the debug level is appropriate
  514.     //
  515.     if (iDebugLevel < giDebugLevel)
  516.     {
  517.         // Nothing to output here
  518.         //
  519.         return;
  520.     }
  521.     // Prepare the label string
  522.     //
  523.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pstro");
  524.     // Return if strct to be dumped is invalid
  525.     //
  526.     if (!pstro)
  527.     {
  528.         OEMDebugMessage(TEXT("nSTROBJ [%s]: NULLrn"), pszLabel);
  529.         // Nothing else to output
  530.         //
  531.         return;
  532.     }
  533.     // Format the data
  534.     //
  535.     OEMDebugMessage(TEXT("nSTROBJ [%s]: %#xrn"), pszLabel, pstro);
  536.     OEMDebugMessage(TEXT("tcGlyphs: %ldrn"), pstro->cGlyphs);
  537.     OEMDebugMessage(TEXT("tflAccel: "));
  538.     vDumpFlags(pstro->flAccel, gafdSTROBJ_flAccel);
  539.     OEMDebugMessage(TEXT("tulCharInc: %ldrn"), pstro->ulCharInc);
  540.     OEMDebugMessage(TEXT("trclBkGround: (%ld, %ld) (%ld, %ld)rn"), pstro->rclBkGround.left, pstro->rclBkGround.top, pstro->rclBkGround.right, pstro->rclBkGround.bottom);
  541.     if (!pstro->pgp)
  542.         OEMDebugMessage(TEXT("tpgp: NULLrn"));
  543.     else
  544.         OEMDebugMessage(TEXT("tpgp: %#xrn"), pstro->pgp);
  545.     OEMDebugMessage(TEXT("tpwszOrg: "%s"rn"), pstro->pwszOrg);
  546.     OEMDebugMessage(TEXT("n"));
  547. }
  548. #if DBG
  549.     DBG_FLAGS gafdFONTOBJ_flFontType[] = {
  550.         { L"FO_TYPE_RASTER",        FO_TYPE_RASTER},
  551.         { L"FO_TYPE_DEVICE",        FO_TYPE_DEVICE},
  552.         { L"FO_TYPE_TRUETYPE",  FO_TYPE_TRUETYPE},
  553.         { L"FO_TYPE_OPENTYPE",  0x8},
  554.         { L"FO_SIM_BOLD",       FO_SIM_BOLD},
  555.         { L"FO_SIM_ITALIC",     FO_SIM_ITALIC},
  556.         { L"FO_EM_HEIGHT",      FO_EM_HEIGHT},
  557.         { L"FO_GRAY16",         FO_GRAY16},
  558.         { L"FO_NOGRAY16",       FO_NOGRAY16},
  559.         { L"FO_CFF",                FO_CFF},
  560.         { L"FO_POSTSCRIPT",     FO_POSTSCRIPT},
  561.         { L"FO_MULTIPLEMASTER", FO_MULTIPLEMASTER},
  562.         { L"FO_VERT_FACE",      FO_VERT_FACE},
  563.         { L"FO_DBCS_FONT",      FO_DBCS_FONT},
  564.         {NULL, 0}               // The NULL entry is important
  565.     };
  566. #else
  567.     DBG_FLAGS gafdFONTOBJ_flFontType[] = {
  568.         {NULL, 0}
  569.     };
  570. #endif
  571. void __stdcall
  572. COemUniDbg::
  573. vDumpFONTOBJ(
  574.     INT         iDebugLevel,
  575.     __in PWSTR  pszInLabel,
  576.     FONTOBJ     *pfo
  577.     )
  578. /*++
  579. Routine Description:
  580.     Dumps the members of a FONTOBJ structure.
  581. Arguments:
  582.     iDebugLevel - desired output debug level
  583.     pszInLabel - output label string
  584.     pfo - pointer to the FONTOBJ strct to be dumped
  585. Return Value:
  586.     NONE
  587. --*/
  588. {
  589.     // Check if the debug level is appropriate
  590.     //
  591.     if (iDebugLevel < giDebugLevel)
  592.     {
  593.         // Nothing to output here
  594.         //
  595.         return;
  596.     }
  597.     // Prepare the label string
  598.     //
  599.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pfo");
  600.     // Return if strct to be dumped is invalid
  601.     //
  602.     if (!pfo)
  603.     {
  604.         OEMDebugMessage(TEXT("nFONTOBJ [%s]: NULLrn"), pszLabel);
  605.         // Nothing else to output
  606.         //
  607.         return;
  608.     }
  609.     // Format the data
  610.     //
  611.     OEMDebugMessage(TEXT("nFONTOBJ [%s]: %#xrn"), pszLabel, pfo);
  612.     OEMDebugMessage(TEXT("tiUniq: %ldrn"), pfo->iUniq);
  613.     OEMDebugMessage(TEXT("tiFace: %ldrn"), pfo->iFace);
  614.     OEMDebugMessage(TEXT("tcxMax: %ldrn"), pfo->cxMax);
  615.     OEMDebugMessage(TEXT("tflFontType: "));
  616.     vDumpFlags(pfo->flFontType, gafdFONTOBJ_flFontType);
  617.     OEMDebugMessage(TEXT("tiTTUniq: %#xrn"), pfo->iTTUniq);
  618.     OEMDebugMessage(TEXT("tiFile: %#xrn"), pfo->iFile);
  619.     OEMDebugMessage(TEXT("tsizLogResPpi: [%ld x %ld]rn"), pfo->sizLogResPpi.cx, pfo->sizLogResPpi.cy);
  620.     OEMDebugMessage(TEXT("tulStyleSize: %ldrn"), pfo->ulStyleSize);
  621.     if (!pfo->pvConsumer)
  622.         OEMDebugMessage(TEXT("tpvConsumer: NULLrn"));
  623.     else
  624.         OEMDebugMessage(TEXT("tpvConsumer: %#xrn"), pfo->pvConsumer);
  625.     if (!pfo->pvProducer)
  626.         OEMDebugMessage(TEXT("tpvProducer: NULLrn"));
  627.     else
  628.         OEMDebugMessage(TEXT("tpvProducer: %#xrn"), pfo->pvProducer);
  629.     OEMDebugMessage(TEXT("n"));
  630. }
  631. void __stdcall
  632. COemUniDbg::
  633. vDumpCLIPOBJ(
  634.     INT         iDebugLevel,
  635.     __in PWSTR  pszInLabel,
  636.     CLIPOBJ     *pco
  637.     )
  638. /*++
  639. Routine Description:
  640.     Dumps the members of a CLIPOBJ structure.
  641. Arguments:
  642.     iDebugLevel - desired output debug level
  643.     pszInLabel - output label string
  644.     pco - pointer to the CLIPOBJ strct to be dumped
  645. Return Value:
  646.     NONE
  647. --*/
  648. {
  649.     // Check if the debug level is appropriate
  650.     //
  651.     if (iDebugLevel < giDebugLevel)
  652.     {
  653.         // Nothing to output here
  654.         //
  655.         return;
  656.     }
  657.     // Prepare the label string
  658.     //
  659.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pco");
  660.     // Return if strct to be dumped is invalid
  661.     //
  662.     if (!pco)
  663.     {
  664.         OEMDebugMessage(TEXT("nCLIPOBJ [%s]: NULLrn"), pszLabel);
  665.         // Nothing else to output
  666.         //
  667.         return;
  668.     }
  669.     // Format the data
  670.     //
  671.     OEMDebugMessage(TEXT("nCLIPOBJ [%s]: %#xrn"), pszLabel, pco);
  672.     OEMDebugMessage(TEXT("tiUniq: %ldrn"), pco->iUniq);
  673.     OEMDebugMessage(TEXT("trclBounds: (%ld, %ld) (%ld, %ld)rn"), pco->rclBounds.left, pco->rclBounds.top, pco->rclBounds.right, pco->rclBounds.bottom);
  674.     PWSTR psziDComplexity = L"Unknown iDComplexity.";
  675.     switch (pco->iDComplexity )
  676.     {
  677.         case DC_COMPLEX: psziDComplexity = L"DC_COMPLEX"; break;
  678.         case DC_RECT: psziDComplexity = L"DC_RECT"; break;
  679.         case DC_TRIVIAL: psziDComplexity = L"DC_TRIVIAL"; break;
  680.     }
  681.     OEMDebugMessage(TEXT("tiDComplexity: %srn"), psziDComplexity);
  682.     PWSTR psziFComplexity = L"0";
  683.     switch (pco->iFComplexity)
  684.     {
  685.         case FC_COMPLEX: psziFComplexity = L"FC_COMPLEX"; break;
  686.         case FC_RECT: psziFComplexity = L"FC_RECT"; break;
  687.         case FC_RECT4: psziFComplexity = L"FC_RECT4"; break;
  688.     }
  689.     OEMDebugMessage(TEXT("tiFComplexity: %srn"), psziFComplexity);
  690.     PWSTR psziMode = L"0";
  691.     switch (pco->iMode)
  692.     {
  693.         case TC_PATHOBJ: psziMode = L"TC_PATHOBJ"; break;
  694.         case TC_RECTANGLES: psziMode = L"TC_RECTANGLES"; break;
  695.     }
  696.     OEMDebugMessage(TEXT("tiMode: %srn"), psziMode);
  697.     PWSTR pszfjOptions = L"0";
  698.     switch (pco->fjOptions)
  699.     {
  700.         case OC_BANK_CLIP: pszfjOptions = L"TC_PATHOBJ"; break;
  701.     }
  702.     OEMDebugMessage(TEXT("tfjOptions: %srn"), pszfjOptions);
  703.     OEMDebugMessage(TEXT("n"));
  704. }
  705. #if DBG
  706.     DBG_FLAGS gafdBRUSHOBJ_flColorType[] = {
  707.         { L"BR_CMYKCOLOR",      BR_CMYKCOLOR},
  708.         { L"BR_DEVICE_ICM",     BR_DEVICE_ICM},
  709.         { L"BR_HOST_ICM",       BR_HOST_ICM},
  710.         {NULL, 0}               // The NULL entry is important
  711.     };
  712. #else
  713.     DBG_FLAGS gafdBRUSHOBJ_flColorType[] = {
  714.         {NULL, 0}
  715.     };
  716. #endif
  717. void __stdcall
  718. COemUniDbg::
  719. vDumpBRUSHOBJ(
  720.     INT         iDebugLevel,
  721.     __in PWSTR  pszInLabel,
  722.     BRUSHOBJ    *pbo
  723.     )
  724. /*++
  725. Routine Description:
  726.     Dumps the members of a BRUSHOBJ structure.
  727. Arguments:
  728.     iDebugLevel - desired output debug level
  729.     pszInLabel - output label string
  730.     pbo - pointer to the BRUSHOBJ strct to be dumped
  731. Return Value:
  732.     NONE
  733. --*/
  734. {
  735.     // Check if the debug level is appropriate
  736.     //
  737.     if (iDebugLevel < giDebugLevel)
  738.     {
  739.         // Nothing to output here
  740.         //
  741.         return;
  742.     }
  743.     // Prepare the label string
  744.     //
  745.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pbo");
  746.     // Return if strct to be dumped is invalid
  747.     //
  748.     if (!pbo)
  749.     {
  750.         OEMDebugMessage(TEXT("nBRUSHOBJ [%s]: NULLrn"), pszLabel);
  751.         // Nothing else to output
  752.         //
  753.         return;
  754.     }
  755.     // Format the data
  756.     //
  757.     OEMDebugMessage(TEXT("nBRUSHOBJ [%s]: %#xrn"), pszLabel, pbo);
  758.     OEMDebugMessage(TEXT("tiSolidColor: %#xrn"), pbo->iSolidColor);
  759.     OEMDebugMessage(TEXT("tpvRbrush: %#xrn"), pbo->pvRbrush);
  760.     OEMDebugMessage(TEXT("tflColorType: "));
  761.     vDumpFlags(pbo->flColorType, gafdBRUSHOBJ_flColorType);
  762.     OEMDebugMessage(TEXT("n"));
  763. }
  764. #if DBG
  765.     DBG_FLAGS gafdGDIINFO_flHTFlags[] = {
  766.         { L"HT_FLAG_8BPP_CMY332_MASK",          HT_FLAG_8BPP_CMY332_MASK},
  767.         { L"HT_FLAG_ADDITIVE_PRIMS",                HT_FLAG_ADDITIVE_PRIMS},
  768.         { L"HT_FLAG_DO_DEVCLR_XFORM",           HT_FLAG_DO_DEVCLR_XFORM},
  769.         { L"HT_FLAG_HAS_BLACK_DYE",             HT_FLAG_HAS_BLACK_DYE},
  770.         { L"HT_FLAG_HIGH_INK_ABSORPTION",       HT_FLAG_HIGH_INK_ABSORPTION},
  771.         { L"HT_FLAG_HIGHER_INK_ABSORPTION",     HT_FLAG_HIGHER_INK_ABSORPTION},
  772.         { L"HT_FLAG_HIGHEST_INK_ABSORPTION",    HT_FLAG_HIGHEST_INK_ABSORPTION},
  773.         { L"HT_FLAG_INK_ABSORPTION_IDX0",       HT_FLAG_INK_ABSORPTION_IDX0},
  774.         { L"HT_FLAG_INK_ABSORPTION_IDX1",       HT_FLAG_INK_ABSORPTION_IDX1},
  775.         { L"HT_FLAG_INK_ABSORPTION_IDX2",       HT_FLAG_INK_ABSORPTION_IDX2},
  776.         { L"HT_FLAG_INK_ABSORPTION_IDX3",       HT_FLAG_INK_ABSORPTION_IDX3},
  777.         { L"HT_FLAG_INK_HIGH_ABSORPTION",       HT_FLAG_INK_HIGH_ABSORPTION},
  778.         { L"HT_FLAG_LOW_INK_ABSORPTION",        HT_FLAG_LOW_INK_ABSORPTION},
  779.         { L"HT_FLAG_LOWER_INK_ABSORPTION",      HT_FLAG_LOWER_INK_ABSORPTION},
  780.         { L"HT_FLAG_LOWEST_INK_ABSORPTION",     HT_FLAG_LOWEST_INK_ABSORPTION},
  781.         { L"HT_FLAG_OUTPUT_CMY",                    HT_FLAG_OUTPUT_CMY},
  782.         { L"HT_FLAG_PRINT_DRAFT_MODE",          HT_FLAG_PRINT_DRAFT_MODE},
  783.         { L"HT_FLAG_SQUARE_DEVICE_PEL",         HT_FLAG_SQUARE_DEVICE_PEL},
  784.         { L"HT_FLAG_USE_8BPP_BITMASK",          HT_FLAG_USE_8BPP_BITMASK},
  785.         { L"HT_FLAG_NORMAL_INK_ABSORPTION",     HT_FLAG_NORMAL_INK_ABSORPTION},
  786. //      { L"HT_FLAG_INVERT_8BPP_BITMASK_IDX",   HT_FLAG_INVERT_8BPP_BITMASK_IDX},
  787.         {NULL, 0}                               // The NULL entry is important
  788.     };
  789. #else
  790.     DBG_FLAGS gafdGDIINFO_flHTFlags[] = {
  791.         {NULL, 0}
  792.     };
  793. #endif
  794. void __stdcall
  795. COemUniDbg::
  796. vDumpGDIINFO(
  797.     INT         iDebugLevel,
  798.     __in PWSTR  pszInLabel,
  799.     GDIINFO     *pGdiInfo
  800.     )
  801. /*++
  802. Routine Description:
  803.     Dumps the members of a GDIINFO structure.
  804. Arguments:
  805.     iDebugLevel - desired output debug level
  806.     pszInLabel - output label string
  807.     pGdiInfo - pointer to the GDIINFO strct to be dumped
  808. Return Value:
  809.     NONE
  810. --*/
  811. {
  812.     // Check if the debug level is appropriate
  813.     //
  814.     if (iDebugLevel < giDebugLevel)
  815.     {
  816.         // Nothing to output here
  817.         //
  818.         return;
  819.     }
  820.     // Prepare the label string
  821.     //
  822.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pGdiInfo");
  823.     // Return if strct to be dumped is invalid
  824.     //
  825.     if (!pGdiInfo)
  826.     {
  827.         OEMDebugMessage(TEXT("nGDIINFO [%s]: NULLrn"), pszLabel);
  828.         // Nothing else to output
  829.         //
  830.         return;
  831.     }
  832.     // Format the data
  833.     //
  834.     OEMDebugMessage(TEXT("nGDIINFO [%s]: %#xrn"), pszLabel, pGdiInfo);
  835.     OEMDebugMessage(TEXT("tulVersion: %#xrn"), pGdiInfo->ulVersion);
  836.     PWSTR pszulTechnology = L"???";
  837.     switch (pGdiInfo->ulTechnology)
  838.     {
  839.         case DT_PLOTTER: pszulTechnology = L"DT_PLOTTER"; break;
  840.         case DT_RASDISPLAY: pszulTechnology = L"DT_RASDISPLAY"; break;
  841.         case DT_RASPRINTER: pszulTechnology = L"DT_RASPRINTER"; break;
  842.         case DT_RASCAMERA: pszulTechnology = L"DT_RASCAMERA"; break;
  843.         case DT_CHARSTREAM: pszulTechnology = L"DT_CHARSTREAM"; break;
  844.     }
  845.     OEMDebugMessage(TEXT("tulTechnology: %ld [%s]rn"), pGdiInfo->ulTechnology, pszulTechnology);
  846.     OEMDebugMessage(TEXT("tulHorzSize: %ldrn"), pGdiInfo->ulHorzSize);
  847.     OEMDebugMessage(TEXT("tulVertSize: %ldrn"), pGdiInfo->ulVertSize);
  848.     OEMDebugMessage(TEXT("tulHorzRes: %ldrn"), pGdiInfo->ulHorzRes);
  849.     OEMDebugMessage(TEXT("tulVertRes: %ldrn"), pGdiInfo->ulVertRes);
  850.     OEMDebugMessage(TEXT("tcBitsPixel: %ldrn"), pGdiInfo->cBitsPixel);
  851.     OEMDebugMessage(TEXT("tcPlanes: %ldrn"), pGdiInfo->cPlanes);
  852.     OEMDebugMessage(TEXT("tulNumColors: %ldrn"), pGdiInfo->ulNumColors);
  853.     OEMDebugMessage(TEXT("tflRaster: %#xrn"), pGdiInfo->flRaster);
  854.     OEMDebugMessage(TEXT("tulLogPixelsX: %ldrn"), pGdiInfo->ulLogPixelsX);
  855.     OEMDebugMessage(TEXT("tulLogPixelsY: %ldrn"), pGdiInfo->ulLogPixelsY);
  856.     PWSTR pszTextCaps = L"Text scrolling through DrvBitBlt/DrvCopyBits";
  857.     if (TC_SCROLLBLT == (pGdiInfo->flTextCaps & TC_SCROLLBLT))
  858.     {
  859.         pszTextCaps = L"Text scrolling through DrvTextOut";
  860.     }
  861.     OEMDebugMessage(TEXT("tflTextCaps: %sn"), pszTextCaps);
  862.     OEMDebugMessage(TEXT("tulDACRed: %#xrn"), pGdiInfo->ulDACRed);
  863.     OEMDebugMessage(TEXT("tulDACGreen: %#xrn"), pGdiInfo->ulDACGreen);
  864.     OEMDebugMessage(TEXT("tulDACBlue: %#xrn"), pGdiInfo->ulDACBlue);
  865.     OEMDebugMessage(TEXT("tulAspectX: %ldrn"), pGdiInfo->ulAspectX);
  866.     OEMDebugMessage(TEXT("tulAspectY: %ldrn"), pGdiInfo->ulAspectY);
  867.     OEMDebugMessage(TEXT("tulAspectXY: %ldrn"), pGdiInfo->ulAspectXY);
  868.     OEMDebugMessage(TEXT("txStyleStep: %ldrn"), pGdiInfo->xStyleStep);
  869.     OEMDebugMessage(TEXT("tyStyleStep: %ldrn"), pGdiInfo->yStyleStep);
  870.     OEMDebugMessage(TEXT("tdenStyleStep: %ldrn"), pGdiInfo->denStyleStep);
  871.     OEMDebugMessage(TEXT("tptlPhysOffset: (%ld, %ld)rn"), pGdiInfo->ptlPhysOffset.x, pGdiInfo->ptlPhysOffset.y);
  872.     OEMDebugMessage(TEXT("tszlPhysSize: (%ld, %ld)rn"), pGdiInfo->szlPhysSize.cx, pGdiInfo->szlPhysSize.cy);
  873.     OEMDebugMessage(TEXT("tulNumPalReg: %ldrn"), pGdiInfo->ulNumPalReg);
  874.     OEMDebugMessage(TEXT("tulDevicePelsDPI: %ldrn"), pGdiInfo->ulDevicePelsDPI);
  875.     PWSTR pszPrimaryOrder = L"???";
  876.     switch(pGdiInfo->ulPrimaryOrder)
  877.     {
  878.         case PRIMARY_ORDER_ABC: pszPrimaryOrder = L"PRIMARY_ORDER_ABC [RGB/CMY]"; break;
  879.         case PRIMARY_ORDER_ACB: pszPrimaryOrder = L"PRIMARY_ORDER_ACB [RBG/CYM]"; break;
  880.         case PRIMARY_ORDER_BAC: pszPrimaryOrder = L"PRIMARY_ORDER_BAC [GRB/MCY]"; break;
  881.         case PRIMARY_ORDER_BCA: pszPrimaryOrder = L"PRIMARY_ORDER_BCA [GBR/MYC]"; break;
  882.         case PRIMARY_ORDER_CBA: pszPrimaryOrder = L"PRIMARY_ORDER_CBA [BGR/YMC]"; break;
  883.         case PRIMARY_ORDER_CAB: pszPrimaryOrder = L"PRIMARY_ORDER_CAB [BRG/YCM]"; break;
  884.     }
  885.     OEMDebugMessage(TEXT("tulPrimaryOrder: %sn"), pszPrimaryOrder);
  886.     PWSTR pszHTPat = L"???";
  887.     switch(pGdiInfo->ulHTPatternSize)
  888.     {
  889.         case HT_PATSIZE_2x2         : pszHTPat = L"HT_PATSIZE_2x2 ";            break;
  890.         case HT_PATSIZE_2x2_M       : pszHTPat = L"HT_PATSIZE_2x2_M";           break;
  891.         case HT_PATSIZE_4x4         : pszHTPat = L"HT_PATSIZE_4x4";         break;
  892.         case HT_PATSIZE_4x4_M       : pszHTPat = L"HT_PATSIZE_4x4_M";           break;
  893.         case HT_PATSIZE_6x6         : pszHTPat = L"HT_PATSIZE_6x6";         break;
  894.         case HT_PATSIZE_6x6_M       : pszHTPat = L"HT_PATSIZE_6x6_M";           break;
  895.         case HT_PATSIZE_8x8         : pszHTPat = L"HT_PATSIZE_8x8";         break;
  896.         case HT_PATSIZE_8x8_M       : pszHTPat = L"HT_PATSIZE_8x8_M";           break;
  897.         case HT_PATSIZE_10x10       : pszHTPat = L"HT_PATSIZE_10x10";           break;
  898.         case HT_PATSIZE_10x10_M     : pszHTPat = L"HT_PATSIZE_10x10_M";     break;
  899.         case HT_PATSIZE_12x12       : pszHTPat = L"HT_PATSIZE_12x12";           break;
  900.         case HT_PATSIZE_12x12_M     : pszHTPat = L"HT_PATSIZE_12x12_M";     break;
  901.         case HT_PATSIZE_14x14       : pszHTPat = L"HT_PATSIZE_14x14";           break;
  902.         case HT_PATSIZE_14x14_M     : pszHTPat = L"HT_PATSIZE_14x14_M";     break;
  903.         case HT_PATSIZE_16x16       : pszHTPat = L"HT_PATSIZE_16x16";           break;
  904.         case HT_PATSIZE_16x16_M     : pszHTPat = L"HT_PATSIZE_16x16_M";     break;
  905.         case HT_PATSIZE_SUPERCELL   : pszHTPat = L"HT_PATSIZE_SUPERCELL";       break;
  906.         case HT_PATSIZE_SUPERCELL_M : pszHTPat = L"HT_PATSIZE_SUPERCELL_M"; break;
  907.         case HT_PATSIZE_USER        : pszHTPat = L"HT_PATSIZE_USER";            break;
  908. //      case HT_PATSIZE_MAX_INDEX   : pszHTPat = L"HT_PATSIZE_MAX_INDEX";       break;
  909. //      case HT_PATSIZE_DEFAULT     : pszHTPat = L"HT_PATSIZE_DEFAULT";     break;
  910.     }
  911.     OEMDebugMessage(TEXT("tulHTPatternSize: %sn"), pszHTPat);
  912.     PWSTR pszHTOutputFormat = L"???";
  913.     switch(pGdiInfo->ulHTOutputFormat)
  914.     {
  915.         case HT_FORMAT_1BPP         : pszHTOutputFormat = L"HT_FORMAT_1BPP";        break;
  916.         case HT_FORMAT_4BPP         : pszHTOutputFormat = L"HT_FORMAT_4BPP";        break;
  917.         case HT_FORMAT_4BPP_IRGB    : pszHTOutputFormat = L"HT_FORMAT_4BPP_IRGB";   break;
  918.         case HT_FORMAT_8BPP         : pszHTOutputFormat = L"HT_FORMAT_8BPP";        break;
  919.         case HT_FORMAT_16BPP        : pszHTOutputFormat = L"HT_FORMAT_16BPP";       break;
  920.         case HT_FORMAT_24BPP        : pszHTOutputFormat = L"HT_FORMAT_24BPP";       break;
  921.         case HT_FORMAT_32BPP        : pszHTOutputFormat = L"HT_FORMAT_32BPP";       break;
  922.     }
  923.     OEMDebugMessage(TEXT("tulHTOutputFormat: %sn"), pszHTOutputFormat);
  924.     OEMDebugMessage(TEXT("tflHTFlags: "));
  925.     vDumpFlags(pGdiInfo->flHTFlags, gafdGDIINFO_flHTFlags);
  926.     OEMDebugMessage(TEXT("tulVRefresh: %ldrn"), pGdiInfo->ulVRefresh);
  927.     OEMDebugMessage(TEXT("tulBltAlignment: %ldrn"), pGdiInfo->ulBltAlignment);
  928.     OEMDebugMessage(TEXT("tulPanningHorzRes: %ldrn"), pGdiInfo->ulPanningHorzRes);
  929.     OEMDebugMessage(TEXT("tulPanningVertRes: %ldrn"), pGdiInfo->ulPanningVertRes);
  930.     OEMDebugMessage(TEXT("txPanningAlignment: %ldrn"), pGdiInfo->xPanningAlignment);
  931.     OEMDebugMessage(TEXT("tyPanningAlignment: %ldrn"), pGdiInfo->yPanningAlignment);
  932.     OEMDebugMessage(TEXT("tcxHTPat: %ldrn"), pGdiInfo->cxHTPat);
  933.     OEMDebugMessage(TEXT("tcyHTPat: %ldrn"), pGdiInfo->cyHTPat);
  934.     OEMDebugMessage(TEXT("tpHTPatA: %#xrn"), pGdiInfo->pHTPatA);
  935.     OEMDebugMessage(TEXT("tpHTPatB: %#xrn"), pGdiInfo->pHTPatB);
  936.     OEMDebugMessage(TEXT("tpHTPatC: %#xrn"), pGdiInfo->pHTPatC);
  937.     OEMDebugMessage(TEXT("tflShadeBlend: %#xrn"), pGdiInfo->flShadeBlend);
  938.     PWSTR pszPhysPixChars = L"???";
  939.     switch(pGdiInfo->ulPhysicalPixelCharacteristics)
  940.     {
  941.         case PPC_DEFAULT: pszPhysPixChars = L"PPC_DEFAULT"; break;
  942.         case PPC_BGR_ORDER_HORIZONTAL_STRIPES: pszPhysPixChars = L"PPC_BGR_ORDER_HORIZONTAL_STRIPES"; break;
  943.         case PPC_BGR_ORDER_VERTICAL_STRIPES: pszPhysPixChars = L"PPC_BGR_ORDER_VERTICAL_STRIPES"; break;
  944.         case PPC_RGB_ORDER_HORIZONTAL_STRIPES: pszPhysPixChars = L"PPC_RGB_ORDER_HORIZONTAL_STRIPES"; break;
  945.         case PPC_RGB_ORDER_VERTICAL_STRIPES: pszPhysPixChars = L"PPC_RGB_ORDER_VERTICAL_STRIPES"; break;
  946.         case PPC_UNDEFINED: pszPhysPixChars = L"PPC_UNDEFINED"; break;
  947.     }
  948.     OEMDebugMessage(TEXT("tulPhysicalPixelCharacteristics: %sn"), pszPhysPixChars);
  949.     PWSTR pszPhysPixGamma = L"???";
  950.     switch(pGdiInfo->ulPhysicalPixelGamma)
  951.     {
  952.         case PPG_DEFAULT: pszPhysPixGamma = L"PPG_DEFAULT"; break;
  953.         case PPG_SRGB   : pszPhysPixGamma = L"PPG_SRGB"; break;
  954.     }
  955.     OEMDebugMessage(TEXT("tulPhysicalPixelGamma: %sn"), pszPhysPixGamma);
  956.     OEMDebugMessage(TEXT("n"));
  957. }
  958. #if DBG
  959.     DBG_FLAGS gafdDEVINFO_flGraphicsCaps[] = {
  960.         { L"GCAPS_BEZIERS",             GCAPS_BEZIERS},
  961.         { L"GCAPS_GEOMETRICWIDE",       GCAPS_GEOMETRICWIDE},
  962.         { L"GCAPS_ALTERNATEFILL",       GCAPS_ALTERNATEFILL},
  963.         { L"GCAPS_WINDINGFILL",         GCAPS_WINDINGFILL},
  964.         { L"GCAPS_HALFTONE",                GCAPS_HALFTONE},
  965.         { L"GCAPS_COLOR_DITHER",        GCAPS_COLOR_DITHER},
  966.         { L"GCAPS_HORIZSTRIKE",         GCAPS_HORIZSTRIKE},
  967.         { L"GCAPS_VERTSTRIKE",          GCAPS_VERTSTRIKE},
  968.         { L"GCAPS_OPAQUERECT",          GCAPS_OPAQUERECT},
  969.         { L"GCAPS_VECTORFONT",          GCAPS_VECTORFONT},
  970.         { L"GCAPS_MONO_DITHER",         GCAPS_MONO_DITHER},
  971.         { L"GCAPS_ASYNCCHANGE",     GCAPS_ASYNCCHANGE},
  972.         { L"GCAPS_ASYNCMOVE",           GCAPS_ASYNCMOVE},
  973.         { L"GCAPS_DONTJOURNAL",         GCAPS_DONTJOURNAL},
  974.         { L"GCAPS_DIRECTDRAW",          GCAPS_DIRECTDRAW},
  975.         { L"GCAPS_ARBRUSHOPAQUE",       GCAPS_ARBRUSHOPAQUE},
  976.         { L"GCAPS_PANNING",             GCAPS_PANNING},
  977.         { L"GCAPS_HIGHRESTEXT",         GCAPS_HIGHRESTEXT},
  978.         { L"GCAPS_PALMANAGED",          GCAPS_PALMANAGED},
  979.         { L"GCAPS_DITHERONREALIZE",     GCAPS_DITHERONREALIZE},
  980.         { L"GCAPS_NO64BITMEMACCESS",    GCAPS_NO64BITMEMACCESS},
  981.         { L"GCAPS_FORCEDITHER",         GCAPS_FORCEDITHER},
  982.         { L"GCAPS_GRAY16",              GCAPS_GRAY16},
  983.         { L"GCAPS_ICM",                 GCAPS_ICM},
  984.         { L"GCAPS_CMYKCOLOR",           GCAPS_CMYKCOLOR},
  985.         { L"GCAPS_LAYERED",             GCAPS_LAYERED},
  986.         { L"GCAPS_ARBRUSHTEXT",         GCAPS_ARBRUSHTEXT},
  987.         { L"GCAPS_SCREENPRECISION",     GCAPS_SCREENPRECISION},
  988.         { L"GCAPS_FONT_RASTERIZER",     GCAPS_FONT_RASTERIZER},
  989.         { L"GCAPS_NUP",                 GCAPS_NUP},
  990.         {NULL, 0}                       // The NULL entry is important
  991.     };
  992.     DBG_FLAGS gafdDEVINFO_flGraphicsCaps2[] = {
  993.         { L"GCAPS2_JPEGSRC",                GCAPS2_JPEGSRC},
  994.         { L"GCAPS2_xxxx",               GCAPS2_xxxx},
  995.         { L"GCAPS2_PNGSRC",             GCAPS2_PNGSRC},
  996.         { L"GCAPS2_CHANGEGAMMARAMP",    GCAPS2_CHANGEGAMMARAMP},
  997.         { L"GCAPS2_ALPHACURSOR",        GCAPS2_ALPHACURSOR},
  998.         { L"GCAPS2_SYNCFLUSH",          GCAPS2_SYNCFLUSH},
  999.         { L"GCAPS2_SYNCTIMER",          GCAPS2_SYNCTIMER},
  1000.         { L"GCAPS2_ICD_MULTIMON",       GCAPS2_ICD_MULTIMON},
  1001.         { L"GCAPS2_MOUSETRAILS",        GCAPS2_MOUSETRAILS},
  1002.         { L"GCAPS2_RESERVED1",          GCAPS2_RESERVED1},
  1003.         {NULL, 0}                       // The NULL entry is important
  1004.     };
  1005. #else
  1006.     DBG_FLAGS gafdDEVINFO_flGraphicsCaps[] = {
  1007.         {NULL, 0}
  1008.     };
  1009.     DBG_FLAGS gafdDEVINFO_flGraphicsCaps2[] = {
  1010.         {NULL, 0}
  1011.     };
  1012. #endif
  1013. void __stdcall
  1014. COemUniDbg::
  1015. vDumpDEVINFO(
  1016.     INT         iDebugLevel,
  1017.     __in PWSTR  pszInLabel,
  1018.     DEVINFO     *pDevInfo
  1019.     )
  1020. /*++
  1021. Routine Description:
  1022.     Dumps the members of a DEVINFO structure.
  1023. Arguments:
  1024.     iDebugLevel - desired output debug level
  1025.     pszInLabel - output label string
  1026.     pDevInfo - pointer to the DEVINFO strct to be dumped
  1027. Return Value:
  1028.     NONE
  1029. --*/
  1030. {
  1031.     // Check if the debug level is appropriate
  1032.     //
  1033.     if (iDebugLevel < giDebugLevel)
  1034.     {
  1035.         // Nothing to output here
  1036.         //
  1037.         return;
  1038.     }
  1039.     // Prepare the label string
  1040.     //
  1041.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pDevInfo");
  1042.     // Return if strct to be dumped is invalid
  1043.     //
  1044.     if (!pDevInfo)
  1045.     {
  1046.         OEMDebugMessage(TEXT("nDEVINFO [%s]: NULLrn"), pszLabel);
  1047.         // Nothing else to output
  1048.         //
  1049.         return;
  1050.     }
  1051.     // Format the data
  1052.     //
  1053.     OEMDebugMessage(TEXT("nDEVINFO [%s]: %#xrn"), pszLabel, pDevInfo);
  1054.     OEMDebugMessage(TEXT("tflGraphicsCaps: "));
  1055.     vDumpFlags(pDevInfo->flGraphicsCaps, gafdDEVINFO_flGraphicsCaps);
  1056.     OEMDebugMessage(TEXT("tcFonts: %ldrn"), pDevInfo->cFonts);
  1057.     PWSTR psziDitherFormat = L"0";
  1058.     switch (pDevInfo->iDitherFormat)
  1059.     {
  1060.         case BMF_1BPP : psziDitherFormat = L"BMF_1BPP" ; break;
  1061.         case BMF_4BPP : psziDitherFormat = L"BMF_4BPP" ; break;
  1062.         case BMF_8BPP : psziDitherFormat = L"BMF_8BPP" ; break;
  1063.         case BMF_16BPP: psziDitherFormat = L"BMF_16BPP"; break;
  1064.         case BMF_24BPP: psziDitherFormat = L"BMF_24BPP"; break;
  1065.         case BMF_32BPP: psziDitherFormat = L"BMF_32BPP"; break;
  1066.         case BMF_4RLE : psziDitherFormat = L"BMF_4RLE" ; break;
  1067.         case BMF_8RLE : psziDitherFormat = L"BMF_8RLE" ; break;
  1068.         case BMF_JPEG : psziDitherFormat = L"BMF_JPEG" ; break;
  1069.         case BMF_PNG  : psziDitherFormat = L"BMF_PNG " ; break;
  1070.     }
  1071.     OEMDebugMessage(TEXT("tiDitherFormat: %srn"), psziDitherFormat);
  1072.     OEMDebugMessage(TEXT("tcxDither: %ldrn"), pDevInfo->cxDither);
  1073.     OEMDebugMessage(TEXT("tcyDither: %ldrn"), pDevInfo->cyDither);
  1074.     OEMDebugMessage(TEXT("thpalDefault: %#xrn"), pDevInfo->hpalDefault);
  1075.     OEMDebugMessage(TEXT("tflGraphicsCaps2: "));
  1076.     vDumpFlags(pDevInfo->flGraphicsCaps2, gafdDEVINFO_flGraphicsCaps2);
  1077.     OEMDebugMessage(TEXT("n"));
  1078. }
  1079. void __stdcall
  1080. COemUniDbg::
  1081. vDumpBitmapInfoHeader(
  1082.     INT                 iDebugLevel,
  1083.     __in PWSTR          pszInLabel,
  1084.     BITMAPINFOHEADER    *pBitmapInfoHeader
  1085.     )
  1086. /*++
  1087. Routine Description:
  1088.     Dumps the members of a BITMAPINFOHEADER structure.
  1089. Arguments:
  1090.     iDebugLevel - desired output debug level
  1091.     pszInLabel - output label string
  1092.     pBitmapInfoHeader - pointer to the BITMAPINFOHEADER strct to be dumped
  1093. Return Value:
  1094.     NONE
  1095. --*/
  1096. {
  1097.     // Check if the debug level is appropriate
  1098.     //
  1099.     if (iDebugLevel < giDebugLevel)
  1100.     {
  1101.         // Nothing to output here
  1102.         //
  1103.         return;
  1104.     }
  1105.     // Prepare the label string
  1106.     //
  1107.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pBitmapInfoHeader");
  1108.     // Return if strct to be dumped is invalid
  1109.     //
  1110.     if (!pBitmapInfoHeader)
  1111.     {
  1112.         OEMDebugMessage(TEXT("nBITMAPINFOHEADER [%s]: NULLrn"), pszLabel);
  1113.         // Nothing else to output
  1114.         //
  1115.         return;
  1116.     }
  1117.     // Format the data
  1118.     //
  1119.     OEMDebugMessage(TEXT("nBITMAPINFOHEADER [%s]: %#xrn"), pszLabel, pBitmapInfoHeader);
  1120.     OEMDebugMessage(TEXT("tbiSize: %ldrn"), pBitmapInfoHeader->biSize);
  1121.     OEMDebugMessage(TEXT("tbiWidth: %ldrn"), pBitmapInfoHeader->biWidth);
  1122.     OEMDebugMessage(TEXT("tbiHeight: %ldrn"), pBitmapInfoHeader->biHeight);
  1123.     OEMDebugMessage(TEXT("tbiPlanes: %ldrn"), pBitmapInfoHeader->biPlanes);
  1124.     OEMDebugMessage(TEXT("tbiBitCount: %ldrn"), pBitmapInfoHeader->biBitCount);
  1125.     PWSTR pszbiCompression = L"0";
  1126.     switch (pBitmapInfoHeader->biCompression)
  1127.     {
  1128.         case BI_RGB : pszbiCompression = L"BI_RGB" ; break;
  1129.         case BI_RLE8 : pszbiCompression = L"BI_RLE8" ; break;
  1130.         case BI_RLE4 : pszbiCompression = L"BI_RLE4" ; break;
  1131.         case BI_BITFIELDS: pszbiCompression = L"BI_BITFIELDS"; break;
  1132.         case BI_JPEG : pszbiCompression = L"BI_JPEG" ; break;
  1133.         case BI_PNG  : pszbiCompression = L"BI_PNG " ; break;
  1134.     }
  1135.     OEMDebugMessage(TEXT("tbiCompression: %srn"), pszbiCompression);
  1136.     OEMDebugMessage(TEXT("tbiSizeImage: %ldrn"), pBitmapInfoHeader->biSizeImage);
  1137.     OEMDebugMessage(TEXT("tbiXPelsPerMeter: %ldrn"), pBitmapInfoHeader->biXPelsPerMeter);
  1138.     OEMDebugMessage(TEXT("tbiYPelsPerMeter: %ldrn"), pBitmapInfoHeader->biYPelsPerMeter);
  1139.     OEMDebugMessage(TEXT("tbiClrUsed: %ldrn"), pBitmapInfoHeader->biClrUsed);
  1140.     OEMDebugMessage(TEXT("tbiClrImportant: %ldrn"), pBitmapInfoHeader->biClrImportant);
  1141.     OEMDebugMessage(TEXT("n"));
  1142. }
  1143. void __stdcall
  1144. COemUniDbg::
  1145. vDumpPOINTL(
  1146.     INT         iDebugLevel,
  1147.     __in PWSTR  pszInLabel,
  1148.     POINTL      *pptl
  1149.     )
  1150. /*++
  1151. Routine Description:
  1152.     Dumps the members of a POINTL structure.
  1153. Arguments:
  1154.     iDebugLevel - desired output debug level
  1155.     pszInLabel - output label string
  1156.     pptl - pointer to the POINTL strct to be dumped
  1157. Return Value:
  1158.     NONE
  1159. --*/
  1160. {
  1161.     // Check if the debug level is appropriate
  1162.     //
  1163.     if (iDebugLevel < giDebugLevel)
  1164.     {
  1165.         // Nothing to output here
  1166.         //
  1167.         return;
  1168.     }
  1169.     // Prepare the label string
  1170.     //
  1171.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pptl");
  1172.     // Return if strct to be dumped is invalid
  1173.     //
  1174.     if (!pptl)
  1175.     {
  1176.         OEMDebugMessage(TEXT("nPOINTL [%s]: NULLrn"), pszLabel);
  1177.         // Nothing else to output
  1178.         //
  1179.         return;
  1180.     }
  1181.     // Format the data
  1182.     //
  1183.     OEMDebugMessage(TEXT("nPOINTL [%s]: %#x (%ld, %ld)rn"), pszLabel, pptl, pptl->x, pptl->y);
  1184.     OEMDebugMessage(TEXT("n"));
  1185. }
  1186. void __stdcall
  1187. COemUniDbg::
  1188. vDumpRECTL(
  1189.     INT         iDebugLevel,
  1190.     __in PWSTR  pszInLabel,
  1191.     RECTL       *prcl
  1192.     )
  1193. /*++
  1194. Routine Description:
  1195.     Dumps the members of a RECTL structure.
  1196. Arguments:
  1197.     iDebugLevel - desired output debug level
  1198.     pszInLabel - output label string
  1199.     prcl - pointer to the RECTL strct to be dumped
  1200. Return Value:
  1201.     NONE
  1202. --*/
  1203. {
  1204.     // Check if the debug level is appropriate
  1205.     //
  1206.     if (iDebugLevel < giDebugLevel)
  1207.     {
  1208.         // Nothing to output here
  1209.         //
  1210.         return;
  1211.     }
  1212.     // Prepare the label string
  1213.     //
  1214.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"prcl");
  1215.     // Return if strct to be dumped is invalid
  1216.     //
  1217.     if (!prcl)
  1218.     {
  1219.         OEMDebugMessage(TEXT("nRECTL [%s]: NULLrn"), pszLabel);
  1220.         // Nothing else to output
  1221.         //
  1222.         return;
  1223.     }
  1224.     // Format the data
  1225.     //
  1226.     OEMDebugMessage(TEXT("nRECTL [%s]: %#x (%ld, %ld) (%ld, %ld)rn"), pszLabel, prcl, prcl->left, prcl->top, prcl->right, prcl->bottom);
  1227.     OEMDebugMessage(TEXT("n"));
  1228. }
  1229. #if DBG
  1230.     DBG_FLAGS gafdXLATEOBJ_flXlate[] = {
  1231.         { L"XO_DEVICE_ICM",     XO_DEVICE_ICM},
  1232.         { L"XO_FROM_CMYK",      XO_FROM_CMYK},
  1233.         { L"XO_HOST_ICM",       XO_HOST_ICM},
  1234.         { L"XO_TABLE",          XO_TABLE},
  1235.         { L"XO_TO_MONO",        XO_TO_MONO},
  1236.         { L"XO_TRIVIAL",            XO_TRIVIAL},
  1237.         {NULL, 0}               // The NULL entry is important
  1238.     };
  1239. #else
  1240.     DBG_FLAGS gafdXLATEOBJ_flXlate[] = {
  1241.         {NULL, 0}
  1242.     };
  1243. #endif
  1244. void __stdcall
  1245. COemUniDbg::
  1246. vDumpXLATEOBJ(
  1247.     INT         iDebugLevel,
  1248.     __in PWSTR  pszInLabel,
  1249.     XLATEOBJ    *pxlo
  1250.     )
  1251. /*++
  1252. Routine Description:
  1253.     Dumps the members of a XLATEOBJ structure.
  1254. Arguments:
  1255.     iDebugLevel - desired output debug level
  1256.     pszInLabel - output label string
  1257.     pxlo - pointer to the XLATEOBJ strct to be dumped
  1258. Return Value:
  1259.     NONE
  1260. --*/
  1261. {
  1262.     // Check if the debug level is appropriate
  1263.     //
  1264.     if (iDebugLevel < giDebugLevel)
  1265.     {
  1266.         // Nothing to output here
  1267.         //
  1268.         return;
  1269.     }
  1270.     // Prepare the label string
  1271.     //
  1272.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pxlo");
  1273.     // Return if strct to be dumped is invalid
  1274.     //
  1275.     if (!pxlo)
  1276.     {
  1277.         OEMDebugMessage(TEXT("nXLATEOBJ [%s]: NULLrn"), pszLabel);
  1278.         // Nothing else to output
  1279.         //
  1280.         return;
  1281.     }
  1282.     // Format the data
  1283.     //
  1284.     OEMDebugMessage(TEXT("nXLATEOBJ [%s]: %#xrn"), pszLabel, pxlo);
  1285.     OEMDebugMessage(TEXT("tiUniq: %ldrn"), pxlo->iUniq);
  1286.     OEMDebugMessage(TEXT("tflXlate: "));
  1287.     vDumpFlags(pxlo->flXlate, gafdXLATEOBJ_flXlate);
  1288.     OEMDebugMessage(TEXT("tiSrcType: %ld [obsolete]rn"), pxlo->iSrcType);
  1289.     OEMDebugMessage(TEXT("tiDstType: %ld [obsolete]rn"), pxlo->iDstType);
  1290.     OEMDebugMessage(TEXT("tcEntries: %ldrn"), pxlo->cEntries);
  1291.     if (pxlo->pulXlate)
  1292.         OEMDebugMessage(TEXT("tpulXlate: %#x [%ld]rn"), pxlo->pulXlate, *pxlo->pulXlate);
  1293.     else
  1294.         OEMDebugMessage(TEXT("tpulXlate: %#xrn"), pxlo->pulXlate);
  1295.     OEMDebugMessage(TEXT("n"));
  1296. }
  1297. #if DBG
  1298.     DBG_FLAGS gafdCOLORADJUSTMENT_caFlags[] = {
  1299.         { L"CA_NEGATIVE",       CA_NEGATIVE},
  1300.         { L"CA_LOG_FILTER",     CA_LOG_FILTER},
  1301.         {NULL, 0}               // The NULL entry is important
  1302.     };
  1303. #else
  1304.     DBG_FLAGS gafdCOLORADJUSTMENT_caFlags[] = {
  1305.         {NULL, 0}
  1306.     };
  1307. #endif
  1308. void __stdcall
  1309. COemUniDbg::
  1310. vDumpCOLORADJUSTMENT(
  1311.     INT                 iDebugLevel,
  1312.     __in PWSTR          pszInLabel,
  1313.     COLORADJUSTMENT     *pca
  1314.     )
  1315. /*++
  1316. Routine Description:
  1317.     Dumps the members of a COLORADJUSTMENT structure.
  1318. Arguments:
  1319.     iDebugLevel - desired output debug level
  1320.     pszInLabel - output label string
  1321.     pca - pointer to the COLORADJUSTMENT strct to be dumped
  1322. Return Value:
  1323.     NONE
  1324. --*/
  1325. {
  1326.     // Check if the debug level is appropriate
  1327.     //
  1328.     if (iDebugLevel < giDebugLevel)
  1329.     {
  1330.         // Nothing to output here
  1331.         //
  1332.         return;
  1333.     }
  1334.     // Prepare the label string
  1335.     //
  1336.     PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pca");
  1337.     // Return if strct to be dumped is invalid
  1338.     //
  1339.     if (!pca)
  1340.     {
  1341.         OEMDebugMessage(TEXT("nCOLORADJUSTMENT [%s]: NULLrn"), pszLabel);
  1342.         // Nothing else to output
  1343.         //
  1344.         return;
  1345.     }
  1346.     // Format the data
  1347.     //
  1348.     OEMDebugMessage(TEXT("nCOLORADJUSTMENT [%s]: %#xrn"), pszLabel, pca);
  1349.     OEMDebugMessage(TEXT("tcaSize: %#xrn"), pca->caSize);
  1350.     OEMDebugMessage(TEXT("tcaFlags: "));
  1351.     if (pca->caFlags)
  1352.         vDumpFlags(pca->caFlags, gafdCOLORADJUSTMENT_caFlags);
  1353.     else
  1354.         OEMDebugMessage(TEXT("NULLrn"));
  1355.     PWSTR pszcaIlluminantIndex = L"0";
  1356.     switch (pca->caIlluminantIndex)
  1357.     {
  1358.         case ILLUMINANT_DEVICE_DEFAULT: pszcaIlluminantIndex = L"ILLUMINANT_DEVICE_DEFAULT" ; break;
  1359.         case ILLUMINANT_A: pszcaIlluminantIndex = L"ILLUMINANT_A [Tungsten lamp]" ; break;
  1360.         case ILLUMINANT_B: pszcaIlluminantIndex = L"ILLUMINANT_B [Noon sunlight]" ; break;
  1361.         case ILLUMINANT_C: pszcaIlluminantIndex = L"ILLUMINANT_C [NTSC daylight]" ; break;
  1362.         case ILLUMINANT_D50: pszcaIlluminantIndex = L"ILLUMINANT_D50 [Normal print]" ; break;
  1363.         case ILLUMINANT_D55: pszcaIlluminantIndex = L"ILLUMINANT_D55 [Bond paper print]" ; break;
  1364.         case ILLUMINANT_D65: pszcaIlluminantIndex = L"ILLUMINANT_D65 [Standard daylight]" ; break;
  1365.         case ILLUMINANT_D75: pszcaIlluminantIndex = L"ILLUMINANT_D75 [Northern daylight]" ; break;
  1366.         case ILLUMINANT_F2: pszcaIlluminantIndex = L"ILLUMINANT_F2 [Cool white lamp]" ; break;
  1367.     }
  1368.     OEMDebugMessage(TEXT("tcaIlluminantIndex: %srn"), pszcaIlluminantIndex);
  1369.     OEMDebugMessage(TEXT("tcaRedGamma: %drn"), (int)pca->caRedGamma);
  1370.     OEMDebugMessage(TEXT("tcaGreenGamma: %drn"), (int)pca->caGreenGamma);
  1371.     OEMDebugMessage(TEXT("tcaBlueGamma: %drn"), (int)pca->caBlueGamma);
  1372.     OEMDebugMessage(TEXT("tcaReferenceBlack: %drn"), (int)pca->caReferenceBlack);
  1373.     OEMDebugMessage(TEXT("tcaReferenceWhite: %drn"), (int)pca->caReferenceWhite);
  1374.     OEMDebugMessage(TEXT("tcaContrast: %drn"), (int)pca->caContrast);
  1375.     OEMDebugMessage(TEXT("tcaBrightness: %drn"), (int)pca->caBrightness);
  1376.     OEMDebugMessage(TEXT("tcaColorfulness: %drn"), (int)pca->caColorfulness);
  1377.     OEMDebugMessage(TEXT("tcaRedGreenTint: %drn"), (int)pca->caRedGreenTint);
  1378.     OEMDebugMessage(TEXT("n"));
  1379. }