DEBUG.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:25k
源码类别:

Windows编程

开发平台:

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  1994-1997  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  FILE:
  9. //    DEBUG.C
  10. //
  11. //  PURPOSE:
  12. //    Debugging routines.
  13. //
  14. //  PLATFORMS:
  15. //    Windows 95, Windows NT
  16. //
  17. //  SPECIAL INSTRUCTIONS: N/A
  18. //
  19. // Windows Header Files:
  20. #pragma warning(disable:4001)   // Single-line comment warnings
  21. #pragma warning(disable:4115)   // Named type definition in parentheses
  22. #pragma warning(disable:4201)   // Nameless struct/union warning
  23. #pragma warning(disable:4214)   // Bit field types other than int warnings
  24. #pragma warning(disable:4514)   // Unreferenced inline function has been removed
  25. // Windows Header Files:
  26. #include <Windows.h>
  27. #include <WindowsX.h>
  28. #include <icm.h>
  29. // Restore the warnings--leave the single-line comment warning OFF
  30. #pragma warning(default:4115)   // Named type definition in parentheses
  31. #pragma warning(default:4201)   // Nameless struct/union warning
  32. #pragma warning(default:4214)   // Bit field types other than int warnings
  33. #pragma warning(default:4514)   // Unreferenced inline function has been removed
  34. // C RunTime Header Files
  35. #include <stdio.h>
  36. #include <TCHAR.H>
  37. #include <stdlib.h>
  38. // Local Header Files
  39. #include "icmview.h"
  40. #include "dibinfo.h"
  41. #define I_AM_DEBUG
  42. #include "Debug.h"
  43. #undef I_AM_DEBUG
  44. // local definitions
  45. // default settings
  46. // external functions
  47. // external data
  48. // public data
  49. // private data
  50. // public functions
  51. // private functions
  52. //////////////////////////////////////////////////////////////////////////
  53. //  Function:  _Assert
  54. //
  55. //  Description:
  56. //    Replacement assertion function
  57. //
  58. //  Parameters:
  59. //    LPSTR    Name of file
  60. //    UINT      Line number@@@
  61. //
  62. //  Returns:
  63. //    void
  64. //
  65. //  Comments:
  66. //
  67. //
  68. //////////////////////////////////////////////////////////////////////////
  69. void _Assert(LPSTR strFile, UINT uiLine)
  70. {
  71.     // Local variables
  72.     char  stAssert[255];
  73.     //  Initialize variables
  74.     wsprintfA(stAssert, "Assertion failed %s, line %urn", strFile, uiLine);
  75.     OutputDebugStringA(stAssert);
  76. } // End of function _Assert
  77. ///////////////////////////////////////////////////////////////////////////
  78. //
  79. //  FUNCTION: DebugMsg
  80. //
  81. //  PURPOSE:
  82. //    To provide a printf type DebugMsg function.
  83. //
  84. //  PARAMETERS:
  85. //    LPTSTR  Format string
  86. //    <variable arguments>  printf-style arguments
  87. //
  88. //  RETURN VALUE:
  89. //    void
  90. //
  91. //  COMMENTS:
  92. //
  93. ///////////////////////////////////////////////////////////////////////////
  94. void DebugMsg (LPTSTR lpszMessage,...)
  95. {
  96. #ifdef _DEBUG
  97.     va_list VAList;
  98.     TCHAR   szMsgBuf[256];
  99.     // Pass the variable parameters to wvsprintf to be formated.
  100.     va_start(VAList, lpszMessage);
  101.     wvsprintf(szMsgBuf, lpszMessage, VAList);
  102.     va_end(VAList);
  103.     ASSERT(lstrlen((LPTSTR)szMsgBuf) < MAX_DEBUG_STRING);
  104.     OutputDebugString(szMsgBuf);
  105. #endif
  106.     lpszMessage = lpszMessage;  // Eliminates 'unused formal parameter' warning
  107. }
  108. void DebugMsgA (LPSTR lpszMessage,...)
  109. {
  110. #ifdef _DEBUG
  111.     va_list VAList;
  112.     char    szMsgBuf[256];
  113.     // Pass the variable parameters to wvsprintf to be formated.
  114.     va_start(VAList, lpszMessage);
  115.     wvsprintfA(szMsgBuf, lpszMessage, VAList);
  116.     va_end(VAList);
  117.     ASSERT(strlen((LPSTR)szMsgBuf) < MAX_DEBUG_STRING);
  118.     OutputDebugStringA(szMsgBuf);
  119. #endif
  120.     lpszMessage = lpszMessage;  // Eliminates 'unused formal parameter' warning
  121. }
  122. ///////////////////////////////////////////////////////////////////////////
  123. //
  124. //  FUNCTION: ErrMsg
  125. //
  126. //  PURPOSE:
  127. //    To provide a printf type error message box.
  128. //
  129. //  PARAMETERS:
  130. //    LPTSTR  wsprintf-style format string
  131. //    ...     formatting information
  132. //
  133. //  RETURN VALUE:
  134. //    Value from MessageBox function; 0 if failure, non-zero
  135. //    otherwise.  For specific values, see MessageBox.
  136. //
  137. //  COMMENTS:
  138. //
  139. ///////////////////////////////////////////////////////////////////////////
  140. int ErrMsg (HWND hwndOwner, LPTSTR lpszMessage,...)
  141. {
  142.     va_list VAList;
  143.     TCHAR   szMsgBuf[256];
  144.     // Pass the variable parameters to wvsprintf to be formated.
  145.     va_start(VAList, lpszMessage);
  146.     wvsprintf(szMsgBuf, lpszMessage, VAList);
  147.     va_end(VAList);
  148.     ASSERT(lstrlen((LPTSTR)szMsgBuf) < MAX_DEBUG_STRING);
  149.     return(MessageBox(hwndOwner, (LPCTSTR)szMsgBuf, (LPCTSTR)__TEXT("Error"), MB_ICONSTOP|MB_APPLMODAL));
  150. }
  151. //////////////////////////////////////////////////////////////////////////
  152. //  Function:  DumpMemory
  153. //
  154. //  Description:
  155. //    Dumps values at specified memory.
  156. //
  157. //  Parameters:
  158. //    LPVOID    Pointer to memory
  159. //    UINT      Size of each element, i.e. 8 or 16
  160. //    UINT      Number of elements to dump.
  161. //
  162. //  Returns:
  163. //    void
  164. //
  165. //  Comments:
  166. //    -Need to add validation of uiElementSize.
  167. //    -uiElementSize * uiNumElements should not exceed the size
  168. //     of the buffer; otherwise, wacky and wonderful events will
  169. //     take place.
  170. //
  171. //////////////////////////////////////////////////////////////////////////
  172. void DumpMemory(LPBYTE lpbMem, UINT uiElementSize, UINT uiNumElements)
  173. {
  174.     // Local variables
  175.     UINT  uiIdx;
  176.     uiElementSize = uiElementSize; // Eliminates 'unused formal parameters'
  177.     // Initialize variables
  178.     for (uiIdx = 0; uiIdx < uiNumElements; uiIdx++)
  179.     {
  180.         if (uiIdx == 0 || ((uiIdx % 16) == 0))
  181.         {
  182.             DebugMsg(__TEXT("rn0x%08Xt"), (DWORD)(lpbMem + (uiIdx)));
  183.         }
  184.         DebugMsg(__TEXT("%02x "), (WORD)*(lpbMem + uiIdx));
  185.     }
  186. } // End of function DumpMemory
  187. //////////////////////////////////////////////////////////////////////////
  188. //  Function:  DumpProfile
  189. //
  190. //  Description:
  191. //    Dumps the PROFILE structure provided.
  192. //
  193. //  Parameters:
  194. //    PPROFILE  Pointer to the profile.
  195. //
  196. //  Returns:
  197. //    void
  198. //
  199. //  Comments:
  200. //////////////////////////////////////////////////////////////////////////
  201. void DumpProfile(PPROFILE pProfile)
  202. {
  203.     // Local variables
  204.     TCHAR   stProfileType[MAX_PATH];
  205.     // Initialize variables
  206.     if (pProfile == NULL)
  207.     {
  208.         DebugMsg(__TEXT("DEBUG.C : DumpProfile : NULL pProfilern"));
  209.         return;
  210.     }
  211.     // Set type string
  212.     _tcscpy(stProfileType, __TEXT("UNKNOWN"));
  213.     if (PROFILE_FILENAME == pProfile->dwType)
  214.     {
  215.         _tcscpy(stProfileType, __TEXT("FILE"));
  216.     }
  217.     if (PROFILE_MEMBUFFER == pProfile->dwType)
  218.     {
  219.         _tcscpy(stProfileType, __TEXT("MEMBUFFER"));
  220.     }
  221.     DebugMsg(__TEXT("***** PROFILE *****rn"));
  222.     DebugMsg(__TEXT("pProfile        0x%08lXrn"), pProfile);
  223.     DebugMsg(__TEXT("dwType          %srn"), stProfileType);
  224.     DebugMsg(__TEXT("pProfileData    0x%08lXrn"), pProfile->pProfileData);
  225.     if (PROFILE_FILENAME == pProfile->dwType)
  226.     {
  227.         DebugMsg(__TEXT("Filename        %srn"), pProfile->pProfileData);
  228.     }
  229.     DebugMsg(__TEXT("cbDataSize      %ldrnrn"), pProfile->cbDataSize);
  230. } // End of function DumpMemory
  231. //////////////////////////////////////////////////////////////////////////
  232. //  Function:  DumpRectangle
  233. //
  234. //  Description:
  235. //    Dumps the coordinates of a rectangle structure
  236. //
  237. //  Parameters:
  238. //    LPTSTR    Comment
  239. //    LPRECT    Rectangle to dump
  240. //
  241. //  Returns:
  242. //    void
  243. //
  244. //  Comments:
  245. //
  246. //
  247. //////////////////////////////////////////////////////////////////////////
  248. void DumpRectangle(LPTSTR lpszDesc, LPRECT lpRect)
  249. {
  250.     DebugMsg(__TEXT("%s:  %ld, %ld, %ld, %ldrn"), lpszDesc, lpRect->left, lpRect->top, lpRect->right,
  251.              lpRect->bottom);
  252. }   // End of function DumpRectangle
  253. //////////////////////////////////////////////////////////////////////////
  254. //  Function:  SafeFree
  255. //
  256. //  Description:
  257. //    Debug Free routine which checks lock counts and return codes.
  258. //
  259. //  Parameters:
  260. //    @@@
  261. //
  262. //  Returns:
  263. //    HGLOBAL
  264. //
  265. //  Comments:
  266. //    This function assumes that the HGLOBAL object has been unlocked;
  267. //    if not, the item will still be freed, but a warning message will
  268. //    be displayed.  This is useful for tracking down items which have
  269. //    been locked without being unlocked.
  270. //
  271. //    The last error value will be preserved if no error occurs in this
  272. //    function.  If an error does occur, it will be passed to the calling
  273. //    function.
  274. //
  275. //////////////////////////////////////////////////////////////////////////
  276. HGLOBAL SafeFree(LPTSTR lpszFile, UINT uiLine, HGLOBAL hMemory)
  277. {
  278.     // Local variables
  279.     UINT      uiLockCount, uiFlags;
  280.     DWORD     dwLastError;
  281.     HGLOBAL   hFreed;                         // Return from GlobalFree
  282.     TCHAR   szName[MAX_PATH], szExt[MAX_PATH];
  283.     //  Initialize variables
  284.     _tsplitpath(lpszFile, NULL, NULL, szName, szExt);
  285.     wsprintf(lpszFile,__TEXT("%s%s"), szName, szExt);
  286.     if (NULL == hMemory)
  287.     {
  288.         DebugMsg(__TEXT("%s(%lu) : SafeFree:  NULL hMem!!!  This will cause an exception!!!!   Fix it!!!rn"), lpszFile, uiLine);
  289.         DebugBreak();
  290.         return(NULL);
  291.     }
  292.     SetLastError(0);
  293.     hFreed = GlobalFree(hMemory);
  294.     if (NULL != hFreed) // unsuccessful free
  295.     {
  296.         dwLastError = GetLastError();
  297.         uiFlags = GlobalFlags(hMemory);
  298.         uiLockCount = uiFlags & GMEM_LOCKCOUNT;
  299.         uiFlags = HIBYTE(LOWORD(uiFlags));
  300.         DebugMsg(__TEXT("SafeFree : <%s(%lu)> failedtLastError = %ld, Flags = %lu, Lock Count = %lurn"),
  301.                  lpszFile, uiLine, dwLastError, uiFlags, uiLockCount);
  302.     }
  303.     return(hFreed);
  304. }   // End of function SafeFree
  305. //////////////////////////////////////////////////////////////////////////
  306. //  Function:  SafeUnlock
  307. //
  308. //  Description:
  309. //    Unlocks handle and displays the lock count and flags information.
  310. //
  311. //  Parameters:
  312. //    @@@
  313. //
  314. //  Returns:
  315. //    BOOL
  316. //
  317. //  Comments:
  318. //
  319. //
  320. //////////////////////////////////////////////////////////////////////////
  321. BOOL SafeUnlock(LPTSTR lpszFile, UINT uiLine, HGLOBAL hMemory)
  322. {
  323.     // Local variables
  324.     BOOL    bUnlocked;
  325.     UINT    uiLockCount,   uiFlags;
  326.     DWORD   dwLastError;
  327.     TCHAR   szName[MAX_PATH], szExt[MAX_PATH];
  328.     //  Initialize variables
  329.     _tsplitpath(lpszFile, NULL, NULL, szName, szExt);
  330.     wsprintf(lpszFile, __TEXT("%s%s"), szName, szExt);
  331.     if (NULL == hMemory)
  332.     {
  333.         DebugMsg(__TEXT("%s(%lu) : SafeUnlock:  NULL hMemrn"), lpszFile, uiLine);
  334.         return(0);
  335.     }
  336.     SetLastError(0);
  337.     bUnlocked = GlobalUnlock(hMemory);
  338.     dwLastError = GetLastError();
  339.     uiFlags = GlobalFlags(hMemory);
  340.     uiLockCount = uiFlags & GMEM_LOCKCOUNT;
  341.     if (0 != dwLastError)
  342.     {
  343.         uiFlags = HIBYTE(LOWORD(uiFlags));
  344.     }
  345.     DebugMsg(__TEXT("SafeUnlock : <%s(%lu)>tGlobalUnlock(0x%08lX) returned %4d w/LastError = %4ld, Lock Count = %4lu, Flags = %4lurn"),
  346.              lpszFile, uiLine, hMemory, bUnlocked, dwLastError, uiLockCount, uiFlags);
  347.     return(bUnlocked);
  348. }   // End of function SafeUnlock
  349. //////////////////////////////////////////////////////////////////////////
  350. //  Function:  SafeLock
  351. //
  352. //  Description:
  353. //    Locks memory and reports lock count.
  354. //
  355. //  Parameters:
  356. //    @@@
  357. //
  358. //  Returns:
  359. //    LPVOID
  360. //
  361. //  Comments:
  362. //
  363. //
  364. //////////////////////////////////////////////////////////////////////////
  365. LPVOID SafeLock(LPTSTR lpszFile, UINT uiLine, HGLOBAL hMemory)
  366. {
  367.     // Local variables
  368.     LPVOID  lpMem;
  369.     UINT    uiLockCount, uiFlags;
  370.     DWORD   dwLastError;
  371.     TCHAR   szName[MAX_PATH], szExt[MAX_PATH];
  372.     //  Initialize variables
  373.     _tsplitpath(lpszFile, NULL, NULL, szName, szExt);
  374.     wsprintf(lpszFile, __TEXT("%s%s"), szName, szExt);
  375.     if (NULL == hMemory)
  376.     {
  377.         DebugMsg(__TEXT("%s(%lu) : SafeLock:  NULL hMemrn"), lpszFile, uiLine);
  378.         return((LPVOID)NULL);
  379.     }
  380.     SetLastError(0);
  381.     lpMem = GlobalLock(hMemory);
  382.     dwLastError = GetLastError();
  383.     uiFlags = GlobalFlags(hMemory);
  384.     uiLockCount = uiFlags & GMEM_LOCKCOUNT;
  385.     uiFlags = HIBYTE(LOWORD(uiFlags));
  386.     DebugMsg(__TEXT("SafeLock : <%s(%lu)>tGlobalLock(0x%08lX) returned 0x%08lX w/LastError = %ld, Lock Count = %lu, Flags = %lurn"),
  387.              lpszFile, uiLine, hMemory, lpMem, dwLastError, uiLockCount, uiFlags);
  388.     return(lpMem);
  389. }   // End of function SafeLock
  390. //////////////////////////////////////////////////////////////////////////
  391. //  Function:  FormatLastError
  392. //
  393. //  Description:
  394. //    Allocates and formats a string of LastError's text-equivalent message.
  395. //    If the caller requests, the message will be displayed and the memory
  396. //    will be deallocated.
  397. //
  398. //  Parameters:
  399. //    LPTSTR  Name of file where error occured
  400. //    UINT    Line of file at which point error occured
  401. //    DWORD Numeric value of LastError
  402. //    UINT  Display and free indicator
  403. //            LASTERROR_NOALLOC  Display via DebugMsg and deallocate
  404. //            LASTERROR_ALLOC    Return pointer to allocated string
  405. //
  406. //  Returns:
  407. //    BOOL
  408. //
  409. //  Comments:
  410. //    Caller must free memory returned by this function.
  411. //
  412. //////////////////////////////////////////////////////////////////////////
  413. LPTSTR FormatLastError(LPTSTR lpszFile, UINT uiLine, UINT uiOutput, DWORD dwLastError)
  414. {
  415.     // Local variables
  416.     LPTSTR  lpszLastErrorMsg;
  417.     LPTSTR  lpszDebugMsg;
  418.     DWORD   cbBytes;
  419.     //  Initialize variables
  420.     lpszLastErrorMsg = NULL;
  421.     cbBytes = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
  422.                             | FORMAT_MESSAGE_FROM_SYSTEM,
  423.                             NULL,
  424.                             dwLastError,
  425.                             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //The user default language
  426.                             (LPTSTR) &lpszLastErrorMsg,
  427.                             0,
  428.                             NULL );
  429.     if (0 == cbBytes) // Error occured in FormatMessage
  430.     {
  431.         SetLastError(dwLastError); // restore the last error to time of call
  432.     }
  433.     // Create the error message
  434.     lpszDebugMsg = GlobalAlloc(GPTR, ((cbBytes + 512) * sizeof(TCHAR)));
  435.     ASSERT(NULL != lpszDebugMsg);
  436.     wsprintf(lpszDebugMsg, __TEXT("<%s(%lu)>:rntLastError(ld, lu) = (%ld, %lu)rntt%srn"),
  437.              lpszFile,
  438.              uiLine,
  439.              dwLastError,
  440.              dwLastError,
  441.              NULL != lpszLastErrorMsg ? lpszLastErrorMsg : __TEXT("UNKNOWN LASTERROR"));
  442.     // Free the buffer memory if requested
  443.     if (LASTERROR_NOALLOC == uiOutput)
  444.     {
  445.         DebugMsg(lpszDebugMsg);
  446.         GlobalFree(lpszDebugMsg);
  447.     }
  448.     // Always free the string created by FormatMessage
  449.     if (NULL != lpszLastErrorMsg)
  450.     {
  451.         GlobalFree(lpszLastErrorMsg);
  452.     }
  453.     return(lpszDebugMsg);
  454. }   // End of function FormatLastError
  455. //////////////////////////////////////////////////////////////////////////
  456. //  Function:  DumpBITMAPFILEHEADER
  457. //
  458. //  Description:
  459. //    Dumps the contents of a BITMAPFILEHEADER.
  460. //
  461. //  Parameters:
  462. //    @@@
  463. //
  464. //  Returns:
  465. //    void
  466. //
  467. //  Comments:
  468. //
  469. //
  470. //////////////////////////////////////////////////////////////////////////
  471. void DumpBITMAPFILEHEADER(LPBITMAPFILEHEADER lpBmpFileHeader)
  472. {
  473.     // Local variables
  474.     DebugMsg(__TEXT("////////////////// BITMAPFILEHEADER ///////////////////rn"));
  475.     DebugMsg(__TEXT("sizeof(BITMAPFILEHEADER)    %ldrn"), sizeof(BITMAPFILEHEADER));
  476.     DebugMsg(__TEXT("bfType                      0x%04xrn"), lpBmpFileHeader->bfType);
  477.     DebugMsg(__TEXT("bfSize                      %ldrn"), lpBmpFileHeader->bfSize);
  478.     DebugMsg(__TEXT("bfReserved1                 %drn"), lpBmpFileHeader->bfReserved1);
  479.     DebugMsg(__TEXT("bfReserved2                 %drn"), lpBmpFileHeader->bfReserved1);
  480.     DebugMsg(__TEXT("bfOffBits                   %ldrn"), lpBmpFileHeader->bfOffBits);
  481.     DebugMsg(__TEXT("///////////////////////////////////////////////////////rn"));
  482.     //  Initialize variables
  483. }   // End of function DumpBITMAPFILEHEADER
  484. //////////////////////////////////////////////////////////////////////////
  485. //  Function:  DumpBITMAPINFOHEADER
  486. //
  487. //  Description:
  488. //    Dumps a BITMAPINFO header structure.
  489. //
  490. //  Parameters:
  491. //    @@@
  492. //
  493. //  Returns:
  494. //    void
  495. //
  496. //  Comments:
  497. //
  498. //
  499. //////////////////////////////////////////////////////////////////////////
  500. void DumpBmpHeader(LPVOID lpvBmpHeader)
  501. {
  502.     // Local variables
  503.     LPBITMAPV5HEADER  lpBmpV5Header;
  504.     TCHAR             stNumText[MAX_PATH];
  505.     //  Initialize variables
  506.     lpBmpV5Header = (LPBITMAPV5HEADER)lpvBmpHeader;
  507.     switch (lpBmpV5Header->bV5Size)
  508.     {
  509.         case sizeof(BITMAPCOREHEADER):
  510.             _tcscpy(stNumText,__TEXT("BITMAPCOREHEADER"));
  511.             break;
  512.         case sizeof(BITMAPINFOHEADER):
  513.             _tcscpy(stNumText, __TEXT("BITMAPINFOHEADER"));
  514.             break;
  515.         case sizeof(BITMAPV4HEADER):
  516.             _tcscpy(stNumText, __TEXT("BITMAPV4HEADER"));
  517.             break;
  518.         case sizeof(BITMAPV5HEADER):
  519.             _tcscpy(stNumText,__TEXT("BITMAPV5HEADER"));
  520.             break;
  521.         default:
  522.             _tcscpy(stNumText, __TEXT("UNKNOWN HEADER SIZE"));
  523.             break;
  524.     }
  525.     DebugMsg(__TEXT("/////////////////// %s /////////////////////rn"), stNumText);
  526.     DebugMsg(__TEXT("HeaderSize        %ldrn"), lpBmpV5Header->bV5Size);
  527.     DebugMsg(__TEXT("Width             %lurn"), lpBmpV5Header->bV5Width);
  528.     DebugMsg(__TEXT("Height            %lurn"), lpBmpV5Header->bV5Height);
  529.     DebugMsg(__TEXT("Planes            %drn"), lpBmpV5Header->bV5Planes);
  530.     DebugMsg(__TEXT("BitCount          %drn"), lpBmpV5Header->bV5BitCount);
  531.     if ( sizeof(BITMAPCOREHEADER)== lpBmpV5Header->bV5Size) goto End;
  532.     switch (lpBmpV5Header->bV5Compression)
  533.     {
  534.         case BI_RGB:
  535.             _tcscpy(stNumText, __TEXT("BI_RGB"));
  536.             break;
  537.         case BI_RLE8:
  538.             _tcscpy(stNumText, __TEXT("BI_RLE8"));
  539.             break;
  540.         case BI_RLE4:
  541.             _tcscpy(stNumText,__TEXT("BI_RLE4"));
  542.             break;
  543.         case BI_BITFIELDS:
  544.             _tcscpy(stNumText, __TEXT("BI_BITFIELDS"));
  545.             break;
  546.         default:
  547.             _tcscpy(stNumText,__TEXT("Unknown Compression"));
  548.             break;
  549.     }
  550.     DebugMsg(__TEXT("Compression       %srn"), stNumText);
  551.     DebugMsg(__TEXT("SizeImage         %ldrn"), lpBmpV5Header->bV5SizeImage);
  552.     DebugMsg(__TEXT("XPelsPerMeter     %ldrn"), lpBmpV5Header->bV5XPelsPerMeter);
  553.     DebugMsg(__TEXT("YPelsPerMeter     %ldrn"), lpBmpV5Header->bV5YPelsPerMeter);
  554.     DebugMsg(__TEXT("ClrUsed           %ldrn"), lpBmpV5Header->bV5ClrUsed);
  555.     DebugMsg(__TEXT("ClrImportant      %ldrn"), lpBmpV5Header->bV5ClrImportant);
  556.     if (sizeof(BITMAPINFOHEADER) == lpBmpV5Header->bV5Size) goto End;
  557.     DebugMsg(__TEXT("Red Mask          0x%08lxrn"), lpBmpV5Header->bV5RedMask);
  558.     DebugMsg(__TEXT("Green Mask        0x%08lxrn"), lpBmpV5Header->bV5GreenMask);
  559.     DebugMsg(__TEXT("Blue Mask         0x%08lxrn"), lpBmpV5Header->bV5BlueMask);
  560.     DebugMsg(__TEXT("Alpha Mask        0x%08lxrn"), lpBmpV5Header->bV5AlphaMask);
  561.     DebugMsg(__TEXT("CS Type           "));
  562.     switch (lpBmpV5Header->bV5CSType)
  563.     {
  564.         case PROFILE_LINKED:
  565.             DebugMsg(__TEXT("LINKEDrn"));
  566.             break;
  567.         case PROFILE_EMBEDDED:
  568.             DebugMsg(__TEXT("EMBEDDEDrn"));
  569.             break;
  570.         default:
  571.             DebugMsg(__TEXT("0x%08lxrn"), lpBmpV5Header->bV5CSType);
  572.             break;
  573.     }
  574.     DebugMsg(__TEXT("Gamma Red         %ldrn"), lpBmpV5Header->bV5GammaRed);
  575.     DebugMsg(__TEXT("Gamma Green       %ldrn"), lpBmpV5Header->bV5GammaGreen);
  576.     DebugMsg(__TEXT("Gamma Blue        %ldrn"), lpBmpV5Header->bV5GammaBlue);
  577.     if (sizeof(BITMAPV4HEADER) == lpBmpV5Header->bV5Size) goto End;
  578.     DebugMsg(__TEXT("Intent            %ldrn"), lpBmpV5Header->bV5Intent);
  579.     DebugMsg(__TEXT("ProfileData       %ldrn"), lpBmpV5Header->bV5ProfileData);
  580.     DebugMsg(__TEXT("ProfileSize       %ldrn"), lpBmpV5Header->bV5ProfileSize);
  581.     DebugMsg(__TEXT("Reserved          %ldrn"), lpBmpV5Header->bV5Reserved);
  582.     End:
  583.     DebugMsg(__TEXT("///////////////////////////////////////////////////////rn"));
  584. }   // End of function DumpBITMAPINFOHEADER
  585. //////////////////////////////////////////////////////////////////////////
  586. //  Function:  DumpLogColorSpace
  587. //
  588. //  Description:
  589. //    Dumps a LOGCOLORSPACE structure.
  590. //
  591. //  Parameters:
  592. //    @@@
  593. //
  594. //  Returns:
  595. //    void
  596. //
  597. //  Comments:
  598. //
  599. //
  600. //////////////////////////////////////////////////////////////////////////
  601. void DumpLogColorSpace(LPLOGCOLORSPACE pColorSpace)
  602. {
  603.     DebugMsg(__TEXT("/////////////////// LOGCOLORSPACE /////////////////////rn"));
  604.     DebugMsg(__TEXT("lcsSignature                       %#lxrn"), pColorSpace->lcsSignature);
  605.     DebugMsg(__TEXT("lcsVersion                         %#lxrn"), pColorSpace->lcsVersion);
  606.     DebugMsg(__TEXT("lcsSize                            %#lxrn"), pColorSpace->lcsSize);
  607.     DebugMsg(__TEXT("lcsCSType                          %#lxrn"), pColorSpace->lcsCSType);
  608.     DebugMsg(__TEXT("lcsIntent                          %#lxrn"), pColorSpace->lcsIntent);
  609.     DebugMsg(__TEXT("lcsEndpoints.ciexyzRed.ciexyzX      %#lxrn"), pColorSpace->lcsEndpoints.ciexyzRed.ciexyzX);
  610.     DebugMsg(__TEXT("lcsEndpoints.ciexyzRed.ciexyzY      %#lxrn"), pColorSpace->lcsEndpoints.ciexyzRed.ciexyzY);
  611.     DebugMsg(__TEXT("lcsEndpoints.ciexyzRed.ciexyzZ      %#lxrn"), pColorSpace->lcsEndpoints.ciexyzRed.ciexyzZ);
  612.     DebugMsg(__TEXT("lcsEndpoints.ciexyzGreen.ciexyzX    %#lxrn"), pColorSpace->lcsEndpoints.ciexyzGreen.ciexyzX);
  613.     DebugMsg(__TEXT("lcsEndpoints.ciexyzGreen.ciexyzY    %#lxrn"), pColorSpace->lcsEndpoints.ciexyzGreen.ciexyzY);
  614.     DebugMsg(__TEXT("lcsEndpoints.ciexyzGreen.ciexyzZ    %#lxrn"), pColorSpace->lcsEndpoints.ciexyzGreen.ciexyzZ);
  615.     DebugMsg(__TEXT("lcsEndpoints.ciexyzBlue.ciexyzX     %#lxrn"), pColorSpace->lcsEndpoints.ciexyzBlue.ciexyzX);
  616.     DebugMsg(__TEXT("lcsEndpoints.ciexyzBlue.ciexyzY     %#lxrn"), pColorSpace->lcsEndpoints.ciexyzBlue.ciexyzY);
  617.     DebugMsg(__TEXT("lcsEndpoints.ciexyzBlue.ciexyzZ     %#lxrn"), pColorSpace->lcsEndpoints.ciexyzBlue.ciexyzZ);
  618.     DebugMsg(__TEXT("lcsGammaRed                        %#lxrn"), pColorSpace->lcsGammaRed);
  619.     DebugMsg(__TEXT("lcsGammaGreen                      %#lxrn"), pColorSpace->lcsGammaGreen);
  620.     DebugMsg(__TEXT("lcsGammaBlue                       %#lxrn"), pColorSpace->lcsGammaBlue);
  621.     DebugMsg(__TEXT("lcsFilename                        %srn"), pColorSpace->lcsFilename);
  622.     DebugMsg(__TEXT("///////////////////////////////////////////////////////rn"));
  623. }
  624. //////////////////////////////////////////////////////////////////////////
  625. //  Function:  DumpCOLORMATCHSETUP
  626. //
  627. //  Description:
  628. //    Dumps COLORMATCHSETUP structure
  629. //
  630. //  Parameters:
  631. //    @@@
  632. //
  633. //  Returns:
  634. //    void
  635. //
  636. //  Comments:
  637. //
  638. //
  639. //////////////////////////////////////////////////////////////////////////
  640. void DumpCOLORMATCHSETUP(LPCOLORMATCHSETUP lpCM)
  641. {
  642.     // Local variables
  643.     //  ASSERTs and parameter validations
  644.     DebugMsg(__TEXT("***** COLORMATCHSETUP 0x%08lxrn"), lpCM);
  645.     DebugMsg(__TEXT("dwSize                        %ldrn"),     lpCM->dwSize);
  646.     DebugMsg(__TEXT("dwVersion                     0x%08lxrn"), lpCM->dwVersion);
  647.     DebugMsg(__TEXT("dwFlags                       0x%08lxrn"), lpCM->dwFlags);
  648.     DebugMsg(__TEXT("hwndOwner                     0x%08lxrn"), lpCM->hwndOwner);
  649.     DebugMsg(__TEXT("pSourceName                   0x%08lX <%s>rn"), lpCM->pSourceName   , lpCM->pSourceName    ? lpCM->pSourceName    : __TEXT("NULL PTR"));
  650.     DebugMsg(__TEXT("pDisplayName                  0x%08lX <%s>rn"), lpCM->pDisplayName   , lpCM->pDisplayName    ? lpCM->pDisplayName    : __TEXT("NULL PTR"));
  651.     DebugMsg(__TEXT("pPrinterName                  0x%08lX <%s>rn"), lpCM->pPrinterName   , lpCM->pPrinterName    ? lpCM->pPrinterName    : __TEXT("NULL PTR"));
  652.     DebugMsg(__TEXT("dwRenderIntent                %ldrn"),     lpCM->dwRenderIntent);
  653.     DebugMsg(__TEXT("dwProofingIntent              %ldrn"),     lpCM->dwProofingIntent);
  654.     DebugMsg(__TEXT("pMonitorProfile               0x%08lX <%s>rn"), lpCM->pMonitorProfile   , lpCM->pMonitorProfile    ? lpCM->pMonitorProfile    : __TEXT("NULL PTR"));
  655.     DebugMsg(__TEXT("ccMonitorProfile              %ldrn"),     lpCM->ccMonitorProfile);
  656.     DebugMsg(__TEXT("pPrinterProfile               0x%08lX <%s>rn"), lpCM->pPrinterProfile   , lpCM->pPrinterProfile    ? lpCM->pPrinterProfile    : __TEXT("NULL PTR"));
  657.     DebugMsg(__TEXT("ccPrinterProfile              %ldrn"),     lpCM->ccPrinterProfile);
  658.     DebugMsg(__TEXT("pTargetProfile                0x%08lX <%s>rn"), lpCM->pTargetProfile   , lpCM->pTargetProfile    ? lpCM->pTargetProfile    : __TEXT("NULL PTR"));
  659.     DebugMsg(__TEXT("ccTargetProfile               %ldrn"),     lpCM->ccTargetProfile);
  660.     DebugMsg(__TEXT("lpfnHook                      0x%08lxrn"), lpCM->lpfnHook);
  661.     DebugMsg(__TEXT("lParam                        0x%08lxrn"), lpCM->lParam);
  662.     DebugMsg(__TEXT("***** COLORMATCHSETUP 0x%08lxrn"), lpCM);
  663. } // End of function DumpCOLORMATCHSETUP