DEBUG.C

//THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
//ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
//THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright 1994-1997 Microsoft Corporation. All Rights Reserved.
//
// FILE:
// DEBUG.C
//
// PURPOSE:
// Debugging routines.
//
// PLATFORMS:
// Windows 95, Windows NT
//
// SPECIAL INSTRUCTIONS: N/A
//

// Windows Header Files:
#pragma warning(disable:4001) // Single-line comment warnings
#pragma warning(disable:4115) // Named type definition in parentheses
#pragma warning(disable:4201) // Nameless struct/union warning
#pragma warning(disable:4214) // Bit field types other than int warnings
#pragma warning(disable:4514) // Unreferenced inline function has been removed

// Windows Header Files:
#include <Windows.h>
#include <WindowsX.h>
#include <icm.h>


// Restore the warnings--leave the single-line comment warning OFF
#pragma warning(default:4115) // Named type definition in parentheses
#pragma warning(default:4201) // Nameless struct/union warning
#pragma warning(default:4214) // Bit field types other than int warnings
#pragma warning(default:4514) // Unreferenced inline function has been removed

// C RunTime Header Files
#include <stdio.h>
#include <TCHAR.H>
#include <stdlib.h>

// Local Header Files
#include "icmview.h"
#include "dibinfo.h"
#define I_AM_DEBUG
#include "Debug.h"
#undef I_AM_DEBUG

// local definitions

// default settings

// external functions

// external data

// public data

// private data

// public functions

// private functions




//////////////////////////////////////////////////////////////////////////
// Function: _Assert
//
// Description:
// Replacement assertion function
//
// Parameters:
// LPSTR Name of file
// UINT Line number@@@
//
// Returns:
// void
//
// Comments:
//
//
//////////////////////////////////////////////////////////////////////////
void _Assert(LPSTR strFile, UINT uiLine)
{
// Local variables
char stAssert[255];

// Initialize variables
wsprintfA(stAssert, "Assertion failed %s, line %u\r\n", strFile, uiLine);
OutputDebugStringA(stAssert);
} // End of function _Assert

///////////////////////////////////////////////////////////////////////////
//
// FUNCTION: DebugMsg
//
// PURPOSE:
// To provide a printf type DebugMsg function.
//
// PARAMETERS:
// LPTSTR Format string
// <variable arguments> printf-style arguments
//
// RETURN VALUE:
// void
//
// COMMENTS:
//
///////////////////////////////////////////////////////////////////////////

void DebugMsg (LPTSTR lpszMessage,...)
{
#ifdef _DEBUG
va_list VAList;
TCHAR szMsgBuf[256];

// Pass the variable parameters to wvsprintf to be formated.
va_start(VAList, lpszMessage);
wvsprintf(szMsgBuf, lpszMessage, VAList);
va_end(VAList);

ASSERT(lstrlen((LPTSTR)szMsgBuf) < MAX_DEBUG_STRING);
OutputDebugString(szMsgBuf);
#endif
lpszMessage = lpszMessage; // Eliminates 'unused formal parameter' warning
}

void DebugMsgA (LPSTR lpszMessage,...)
{
#ifdef _DEBUG
va_list VAList;
char szMsgBuf[256];

// Pass the variable parameters to wvsprintf to be formated.
va_start(VAList, lpszMessage);
wvsprintfA(szMsgBuf, lpszMessage, VAList);
va_end(VAList);

ASSERT(strlen((LPSTR)szMsgBuf) < MAX_DEBUG_STRING);
OutputDebugStringA(szMsgBuf);
#endif
lpszMessage = lpszMessage; // Eliminates 'unused formal parameter' warning
}


///////////////////////////////////////////////////////////////////////////
//
// FUNCTION: ErrMsg
//
// PURPOSE:
// To provide a printf type error message box.
//
// PARAMETERS:
// LPTSTR wsprintf-style format string
// ... formatting information
//
// RETURN VALUE:
// Value from MessageBox function; 0 if failure, non-zero
// otherwise. For specific values, see MessageBox.
//
// COMMENTS:
//
///////////////////////////////////////////////////////////////////////////
int ErrMsg (HWND hwndOwner, LPTSTR lpszMessage,...)
{
va_list VAList;
TCHAR szMsgBuf[256];

// Pass the variable parameters to wvsprintf to be formated.
va_start(VAList, lpszMessage);
wvsprintf(szMsgBuf, lpszMessage, VAList);
va_end(VAList);

ASSERT(lstrlen((LPTSTR)szMsgBuf) < MAX_DEBUG_STRING);
return(MessageBox(hwndOwner, (LPCTSTR)szMsgBuf, (LPCTSTR)__TEXT("Error"), MB_ICONSTOP|MB_APPLMODAL));
}

//////////////////////////////////////////////////////////////////////////
// Function: DumpMemory
//
// Description:
// Dumps values at specified memory.
//
// Parameters:
// LPVOID Pointer to memory
// UINT Size of each element, i.e. 8 or 16
// UINT Number of elements to dump.
//
// Returns:
// void
//
// Comments:
// -Need to add validation of uiElementSize.
// -uiElementSize * uiNumElements should not exceed the size
// of the buffer; otherwise, wacky and wonderful events will
// take place.
//
//////////////////////////////////////////////////////////////////////////
void DumpMemory(LPBYTE lpbMem, UINT uiElementSize, UINT uiNumElements)
{
// Local variables
UINT uiIdx;

uiElementSize = uiElementSize; // Eliminates 'unused formal parameters'

// Initialize variables
for (uiIdx = 0; uiIdx < uiNumElements; uiIdx++)
{
if (uiIdx == 0 || ((uiIdx % 16) == 0))
{
DebugMsg(__TEXT("\r\n0x%08X\t"), (DWORD)(lpbMem + (uiIdx)));
}
DebugMsg(__TEXT("%02x "), (WORD)*(lpbMem + uiIdx));
}
} // End of function DumpMemory

//////////////////////////////////////////////////////////////////////////
// Function: DumpProfile
//
// Description:
// Dumps the PROFILE structure provided.
//
// Parameters:
// PPROFILE Pointer to the profile.
//
// Returns:
// void
//
// Comments:
//////////////////////////////////////////////////////////////////////////
void DumpProfile(PPROFILE pProfile)
{
// Local variables
TCHAR stProfileType[MAX_PATH];

// Initialize variables
if (pProfile == NULL)
{
DebugMsg(__TEXT("DEBUG.C : DumpProfile : NULL pProfile\r\n"));
return;
}

// Set type string
_tcscpy(stProfileType, __TEXT("UNKNOWN"));
if (PROFILE_FILENAME == pProfile->dwType)
{
_tcscpy(stProfileType, __TEXT("FILE"));
}
if (PROFILE_MEMBUFFER == pProfile->dwType)
{
_tcscpy(stProfileType, __TEXT("MEMBUFFER"));
}

DebugMsg(__TEXT("***** PROFILE *****\r\n"));
DebugMsg(__TEXT("pProfile 0x%08lX\r\n"), pProfile);
DebugMsg(__TEXT("dwType %s\r\n"), stProfileType);
DebugMsg(__TEXT("pProfileData 0x%08lX\r\n"), pProfile->pProfileData);
if (PROFILE_FILENAME == pProfile->dwType)
{
DebugMsg(__TEXT("Filename %s\r\n"), pProfile->pProfileData);
}
DebugMsg(__TEXT("cbDataSize %ld\r\n\r\n"), pProfile->cbDataSize);
} // End of function DumpMemory


//////////////////////////////////////////////////////////////////////////
// Function: DumpRectangle
//
// Description:
// Dumps the coordinates of a rectangle structure
//
// Parameters:
// LPTSTR Comment
// LPRECT Rectangle to dump
//
// Returns:
// void
//
// Comments:
//
//
//////////////////////////////////////////////////////////////////////////
void DumpRectangle(LPTSTR lpszDesc, LPRECT lpRect)
{
DebugMsg(__TEXT("%s: %ld, %ld, %ld, %ld\r\n"), lpszDesc, lpRect->left, lpRect->top, lpRect->right,
lpRect->bottom);
} // End of function DumpRectangle


//////////////////////////////////////////////////////////////////////////
// Function: SafeFree
//
// Description:
// Debug Free routine which checks lock counts and return codes.
//
// Parameters:
// @@@
//
// Returns:
// HGLOBAL
//
// Comments:
// This function assumes that the HGLOBAL object has been unlocked;
// if not, the item will still be freed, but a warning message will
// be displayed. This is useful for tracking down items which have
// been locked without being unlocked.
//
// The last error value will be preserved if no error occurs in this
// function. If an error does occur, it will be passed to the calling
// function.
//
//////////////////////////////////////////////////////////////////////////
HGLOBAL SafeFree(LPTSTR lpszFile, UINT uiLine, HGLOBAL hMemory)
{
// Local variables
UINT uiLockCount, uiFlags;
DWORD dwLastError;
HGLOBAL hFreed; // Return from GlobalFree
TCHAR szName[MAX_PATH], szExt[MAX_PATH];

// Initialize variables
_tsplitpath(lpszFile, NULL, NULL, szName, szExt);
wsprintf(lpszFile,__TEXT("%s%s"), szName, szExt);
if (NULL == hMemory)
{
DebugMsg(__TEXT("%s(%lu) : SafeFree: NULL hMem!!! This will cause an exception!!!! Fix it!!!\r\n"), lpszFile, uiLine);
DebugBreak();
return(NULL);
}
SetLastError(0);

hFreed = GlobalFree(hMemory);
if (NULL != hFreed) // unsuccessful free
{
dwLastError = GetLastError();
uiFlags = GlobalFlags(hMemory);
uiLockCount = uiFlags & GMEM_LOCKCOUNT;
uiFlags = HIBYTE(LOWORD(uiFlags));
DebugMsg(__TEXT("SafeFree : <%s(%lu)> failed\tLastError = %ld, Flags = %lu, Lock Count = %lu\r\n"),
lpszFile, uiLine, dwLastError, uiFlags, uiLockCount);
}
return(hFreed);
} // End of function SafeFree

//////////////////////////////////////////////////////////////////////////
// Function: SafeUnlock
//
// Description:
// Unlocks handle and displays the lock count and flags information.
//
// Parameters:
// @@@
//
// Returns:
// BOOL
//
// Comments:
//
//
//////////////////////////////////////////////////////////////////////////
BOOL SafeUnlock(LPTSTR lpszFile, UINT uiLine, HGLOBAL hMemory)
{
// Local variables
BOOL bUnlocked;
UINT uiLockCount, uiFlags;
DWORD dwLastError;
TCHAR szName[MAX_PATH], szExt[MAX_PATH];

// Initialize variables
_tsplitpath(lpszFile, NULL, NULL, szName, szExt);
wsprintf(lpszFile, __TEXT("%s%s"), szName, szExt);

if (NULL == hMemory)
{
DebugMsg(__TEXT("%s(%lu) : SafeUnlock: NULL hMem\r\n"), lpszFile, uiLine);
return(0);
}
SetLastError(0);

bUnlocked = GlobalUnlock(hMemory);
dwLastError = GetLastError();
uiFlags = GlobalFlags(hMemory);
uiLockCount = uiFlags & GMEM_LOCKCOUNT;
if (0 != dwLastError)
{
uiFlags = HIBYTE(LOWORD(uiFlags));
}
DebugMsg(__TEXT("SafeUnlock : <%s(%lu)>\tGlobalUnlock(0x%08lX) returned %4d w/LastError = %4ld, Lock Count = %4lu, Flags = %4lu\r\n"),
lpszFile, uiLine, hMemory, bUnlocked, dwLastError, uiLockCount, uiFlags);
return(bUnlocked);
} // End of function SafeUnlock



//////////////////////////////////////////////////////////////////////////
// Function: SafeLock
//
// Description:
// Locks memory and reports lock count.
//
// Parameters:
// @@@
//
// Returns:
// LPVOID
//
// Comments:
//
//
//////////////////////////////////////////////////////////////////////////
LPVOID SafeLock(LPTSTR lpszFile, UINT uiLine, HGLOBAL hMemory)
{
// Local variables
LPVOID lpMem;
UINT uiLockCount, uiFlags;
DWORD dwLastError;
TCHAR szName[MAX_PATH], szExt[MAX_PATH];

// Initialize variables
_tsplitpath(lpszFile, NULL, NULL, szName, szExt);
wsprintf(lpszFile, __TEXT("%s%s"), szName, szExt);
if (NULL == hMemory)
{
DebugMsg(__TEXT("%s(%lu) : SafeLock: NULL hMem\r\n"), lpszFile, uiLine);
return((LPVOID)NULL);
}
SetLastError(0);

lpMem = GlobalLock(hMemory);
dwLastError = GetLastError();
uiFlags = GlobalFlags(hMemory);
uiLockCount = uiFlags & GMEM_LOCKCOUNT;
uiFlags = HIBYTE(LOWORD(uiFlags));

DebugMsg(__TEXT("SafeLock : <%s(%lu)>\tGlobalLock(0x%08lX) returned 0x%08lX w/LastError = %ld, Lock Count = %lu, Flags = %lu\r\n"),
lpszFile, uiLine, hMemory, lpMem, dwLastError, uiLockCount, uiFlags);
return(lpMem);
} // End of function SafeLock

//////////////////////////////////////////////////////////////////////////
// Function: FormatLastError
//
// Description:
// Allocates and formats a string of LastError's text-equivalent message.
// If the caller requests, the message will be displayed and the memory
// will be deallocated.
//
// Parameters:
// LPTSTR Name of file where error occured
// UINT Line of file at which point error occured
// DWORD Numeric value of LastError
// UINT Display and free indicator
// LASTERROR_NOALLOC Display via DebugMsg and deallocate
// LASTERROR_ALLOC Return pointer to allocated string
//
// Returns:
// BOOL
//
// Comments:
// Caller must free memory returned by this function.
//
//////////////////////////////////////////////////////////////////////////
LPTSTR FormatLastError(LPTSTR lpszFile, UINT uiLine, UINT uiOutput, DWORD dwLastError)
{
// Local variables
LPTSTR lpszLastErrorMsg;
LPTSTR lpszDebugMsg;
DWORD cbBytes;

// Initialize variables
lpszLastErrorMsg = NULL;
cbBytes = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwLastError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //The user default language
(LPTSTR) &lpszLastErrorMsg,
0,
NULL );

if (0 == cbBytes) // Error occured in FormatMessage
{
SetLastError(dwLastError); // restore the last error to time of call
}

// Create the error message
lpszDebugMsg = GlobalAlloc(GPTR, ((cbBytes + 512) * sizeof(TCHAR)));
ASSERT(NULL != lpszDebugMsg);
wsprintf(lpszDebugMsg, __TEXT("<%s(%lu)>:\r\n\tLastError(ld, lu) = (%ld, %lu)\r\n\t\t%s\r\n"),
lpszFile,
uiLine,
dwLastError,
dwLastError,
NULL != lpszLastErrorMsg ? lpszLastErrorMsg : __TEXT("UNKNOWN LASTERROR"));

// Free the buffer memory if requested
if (LASTERROR_NOALLOC == uiOutput)
{
DebugMsg(lpszDebugMsg);
GlobalFree(lpszDebugMsg);
}

// Always free the string created by FormatMessage
if (NULL != lpszLastErrorMsg)
{
GlobalFree(lpszLastErrorMsg);
}
return(lpszDebugMsg);
} // End of function FormatLastError


//////////////////////////////////////////////////////////////////////////
// Function: DumpBITMAPFILEHEADER
//
// Description:
// Dumps the contents of a BITMAPFILEHEADER.
//
// Parameters:
// @@@
//
// Returns:
// void
//
// Comments:
//
//
//////////////////////////////////////////////////////////////////////////
void DumpBITMAPFILEHEADER(LPBITMAPFILEHEADER lpBmpFileHeader)
{
// Local variables
DebugMsg(__TEXT("////////////////// BITMAPFILEHEADER ///////////////////\r\n"));
DebugMsg(__TEXT("sizeof(BITMAPFILEHEADER) %ld\r\n"), sizeof(BITMAPFILEHEADER));
DebugMsg(__TEXT("bfType 0x%04x\r\n"), lpBmpFileHeader->bfType);
DebugMsg(__TEXT("bfSize %ld\r\n"), lpBmpFileHeader->bfSize);
DebugMsg(__TEXT("bfReserved1 %d\r\n"), lpBmpFileHeader->bfReserved1);
DebugMsg(__TEXT("bfReserved2 %d\r\n"), lpBmpFileHeader->bfReserved1);
DebugMsg(__TEXT("bfOffBits %ld\r\n"), lpBmpFileHeader->bfOffBits);
DebugMsg(__TEXT("///////////////////////////////////////////////////////\r\n"));

// Initialize variables

} // End of function DumpBITMAPFILEHEADER


//////////////////////////////////////////////////////////////////////////
// Function: DumpBITMAPINFOHEADER
//
// Description:
// Dumps a BITMAPINFO header structure.
//
// Parameters:
// @@@
//
// Returns:
// void
//
// Comments:
//
//
//////////////////////////////////////////////////////////////////////////
void DumpBmpHeader(LPVOID lpvBmpHeader)
{
// Local variables
LPBITMAPV5HEADER lpBmpV5Header;
TCHAR stNumText[MAX_PATH];

// Initialize variables
lpBmpV5Header = (LPBITMAPV5HEADER)lpvBmpHeader;

switch (lpBmpV5Header->bV5Size)
{
case sizeof(BITMAPCOREHEADER):
_tcscpy(stNumText,__TEXT("BITMAPCOREHEADER"));
break;

case sizeof(BITMAPINFOHEADER):
_tcscpy(stNumText, __TEXT("BITMAPINFOHEADER"));
break;

case sizeof(BITMAPV4HEADER):
_tcscpy(stNumText, __TEXT("BITMAPV4HEADER"));
break;

case sizeof(BITMAPV5HEADER):
_tcscpy(stNumText,__TEXT("BITMAPV5HEADER"));
break;

default:
_tcscpy(stNumText, __TEXT("UNKNOWN HEADER SIZE"));
break;
}
DebugMsg(__TEXT("/////////////////// %s /////////////////////\r\n"), stNumText);
DebugMsg(__TEXT("HeaderSize %ld\r\n"), lpBmpV5Header->bV5Size);
DebugMsg(__TEXT("Width %lu\r\n"), lpBmpV5Header->bV5Width);
DebugMsg(__TEXT("Height %lu\r\n"), lpBmpV5Header->bV5Height);
DebugMsg(__TEXT("Planes %d\r\n"), lpBmpV5Header->bV5Planes);
DebugMsg(__TEXT("BitCount %d\r\n"), lpBmpV5Header->bV5BitCount);
if ( sizeof(BITMAPCOREHEADER)== lpBmpV5Header->bV5Size) goto End;

switch (lpBmpV5Header->bV5Compression)
{
case BI_RGB:
_tcscpy(stNumText, __TEXT("BI_RGB"));
break;

case BI_RLE8:
_tcscpy(stNumText, __TEXT("BI_RLE8"));
break;

case BI_RLE4:
_tcscpy(stNumText,__TEXT("BI_RLE4"));
break;

case BI_BITFIELDS:
_tcscpy(stNumText, __TEXT("BI_BITFIELDS"));
break;

default:
_tcscpy(stNumText,__TEXT("Unknown Compression"));
break;
}
DebugMsg(__TEXT("Compression %s\r\n"), stNumText);
DebugMsg(__TEXT("SizeImage %ld\r\n"), lpBmpV5Header->bV5SizeImage);
DebugMsg(__TEXT("XPelsPerMeter %ld\r\n"), lpBmpV5Header->bV5XPelsPerMeter);
DebugMsg(__TEXT("YPelsPerMeter %ld\r\n"), lpBmpV5Header->bV5YPelsPerMeter);
DebugMsg(__TEXT("ClrUsed %ld\r\n"), lpBmpV5Header->bV5ClrUsed);
DebugMsg(__TEXT("ClrImportant %ld\r\n"), lpBmpV5Header->bV5ClrImportant);
if (sizeof(BITMAPINFOHEADER) == lpBmpV5Header->bV5Size) goto End;

DebugMsg(__TEXT("Red Mask 0x%08lx\r\n"), lpBmpV5Header->bV5RedMask);
DebugMsg(__TEXT("Green Mask 0x%08lx\r\n"), lpBmpV5Header->bV5GreenMask);
DebugMsg(__TEXT("Blue Mask 0x%08lx\r\n"), lpBmpV5Header->bV5BlueMask);
DebugMsg(__TEXT("Alpha Mask 0x%08lx\r\n"), lpBmpV5Header->bV5AlphaMask);

DebugMsg(__TEXT("CS Type "));
switch (lpBmpV5Header->bV5CSType)
{
case PROFILE_LINKED:
DebugMsg(__TEXT("LINKED\r\n"));
break;

case PROFILE_EMBEDDED:
DebugMsg(__TEXT("EMBEDDED\r\n"));
break;

default:
DebugMsg(__TEXT("0x%08lx\r\n"), lpBmpV5Header->bV5CSType);
break;
}


DebugMsg(__TEXT("Gamma Red %ld\r\n"), lpBmpV5Header->bV5GammaRed);
DebugMsg(__TEXT("Gamma Green %ld\r\n"), lpBmpV5Header->bV5GammaGreen);
DebugMsg(__TEXT("Gamma Blue %ld\r\n"), lpBmpV5Header->bV5GammaBlue);
if (sizeof(BITMAPV4HEADER) == lpBmpV5Header->bV5Size) goto End;

DebugMsg(__TEXT("Intent %ld\r\n"), lpBmpV5Header->bV5Intent);
DebugMsg(__TEXT("ProfileData %ld\r\n"), lpBmpV5Header->bV5ProfileData);
DebugMsg(__TEXT("ProfileSize %ld\r\n"), lpBmpV5Header->bV5ProfileSize);
DebugMsg(__TEXT("Reserved %ld\r\n"), lpBmpV5Header->bV5Reserved);

End:
DebugMsg(__TEXT("///////////////////////////////////////////////////////\r\n"));
} // End of function DumpBITMAPINFOHEADER


//////////////////////////////////////////////////////////////////////////
// Function: DumpLogColorSpace
//
// Description:
// Dumps a LOGCOLORSPACE structure.
//
// Parameters:
// @@@
//
// Returns:
// void
//
// Comments:
//
//
//////////////////////////////////////////////////////////////////////////

void DumpLogColorSpace(LPLOGCOLORSPACE pColorSpace)
{
DebugMsg(__TEXT("/////////////////// LOGCOLORSPACE /////////////////////\r\n"));
DebugMsg(__TEXT("lcsSignature %#lx\r\n"), pColorSpace->lcsSignature);
DebugMsg(__TEXT("lcsVersion %#lx\r\n"), pColorSpace->lcsVersion);
DebugMsg(__TEXT("lcsSize %#lx\r\n"), pColorSpace->lcsSize);
DebugMsg(__TEXT("lcsCSType %#lx\r\n"), pColorSpace->lcsCSType);
DebugMsg(__TEXT("lcsIntent %#lx\r\n"), pColorSpace->lcsIntent);
DebugMsg(__TEXT("lcsEndpoints.ciexyzRed.ciexyzX %#lx\r\n"), pColorSpace->lcsEndpoints.ciexyzRed.ciexyzX);
DebugMsg(__TEXT("lcsEndpoints.ciexyzRed.ciexyzY %#lx\r\n"), pColorSpace->lcsEndpoints.ciexyzRed.ciexyzY);
DebugMsg(__TEXT("lcsEndpoints.ciexyzRed.ciexyzZ %#lx\r\n"), pColorSpace->lcsEndpoints.ciexyzRed.ciexyzZ);
DebugMsg(__TEXT("lcsEndpoints.ciexyzGreen.ciexyzX %#lx\r\n"), pColorSpace->lcsEndpoints.ciexyzGreen.ciexyzX);
DebugMsg(__TEXT("lcsEndpoints.ciexyzGreen.ciexyzY %#lx\r\n"), pColorSpace->lcsEndpoints.ciexyzGreen.ciexyzY);
DebugMsg(__TEXT("lcsEndpoints.ciexyzGreen.ciexyzZ %#lx\r\n"), pColorSpace->lcsEndpoints.ciexyzGreen.ciexyzZ);
DebugMsg(__TEXT("lcsEndpoints.ciexyzBlue.ciexyzX %#lx\r\n"), pColorSpace->lcsEndpoints.ciexyzBlue.ciexyzX);
DebugMsg(__TEXT("lcsEndpoints.ciexyzBlue.ciexyzY %#lx\r\n"), pColorSpace->lcsEndpoints.ciexyzBlue.ciexyzY);
DebugMsg(__TEXT("lcsEndpoints.ciexyzBlue.ciexyzZ %#lx\r\n"), pColorSpace->lcsEndpoints.ciexyzBlue.ciexyzZ);
DebugMsg(__TEXT("lcsGammaRed %#lx\r\n"), pColorSpace->lcsGammaRed);
DebugMsg(__TEXT("lcsGammaGreen %#lx\r\n"), pColorSpace->lcsGammaGreen);
DebugMsg(__TEXT("lcsGammaBlue %#lx\r\n"), pColorSpace->lcsGammaBlue);
DebugMsg(__TEXT("lcsFilename %s\r\n"), pColorSpace->lcsFilename);
DebugMsg(__TEXT("///////////////////////////////////////////////////////\r\n"));
}

//////////////////////////////////////////////////////////////////////////
// Function: DumpCOLORMATCHSETUP
//
// Description:
// Dumps COLORMATCHSETUP structure
//
// Parameters:
// @@@
//
// Returns:
// void
//
// Comments:
//
//
//////////////////////////////////////////////////////////////////////////
void DumpCOLORMATCHSETUP(LPCOLORMATCHSETUP lpCM)
{
// Local variables

// ASSERTs and parameter validations
DebugMsg(__TEXT("***** COLORMATCHSETUP 0x%08lx\r\n"), lpCM);
DebugMsg(__TEXT("dwSize %ld\r\n"), lpCM->dwSize);
DebugMsg(__TEXT("dwVersion 0x%08lx\r\n"), lpCM->dwVersion);
DebugMsg(__TEXT("dwFlags 0x%08lx\r\n"), lpCM->dwFlags);
DebugMsg(__TEXT("hwndOwner 0x%08lx\r\n"), lpCM->hwndOwner);

DebugMsg(__TEXT("pSourceName 0x%08lX <%s>\r\n"), lpCM->pSourceName , lpCM->pSourceName ? lpCM->pSourceName : __TEXT("NULL PTR"));
DebugMsg(__TEXT("pDisplayName 0x%08lX <%s>\r\n"), lpCM->pDisplayName , lpCM->pDisplayName ? lpCM->pDisplayName : __TEXT("NULL PTR"));
DebugMsg(__TEXT("pPrinterName 0x%08lX <%s>\r\n"), lpCM->pPrinterName , lpCM->pPrinterName ? lpCM->pPrinterName : __TEXT("NULL PTR"));

DebugMsg(__TEXT("dwRenderIntent %ld\r\n"), lpCM->dwRenderIntent);
DebugMsg(__TEXT("dwProofingIntent %ld\r\n"), lpCM->dwProofingIntent);

DebugMsg(__TEXT("pMonitorProfile 0x%08lX <%s>\r\n"), lpCM->pMonitorProfile , lpCM->pMonitorProfile ? lpCM->pMonitorProfile : __TEXT("NULL PTR"));
DebugMsg(__TEXT("ccMonitorProfile %ld\r\n"), lpCM->ccMonitorProfile);

DebugMsg(__TEXT("pPrinterProfile 0x%08lX <%s>\r\n"), lpCM->pPrinterProfile , lpCM->pPrinterProfile ? lpCM->pPrinterProfile : __TEXT("NULL PTR"));
DebugMsg(__TEXT("ccPrinterProfile %ld\r\n"), lpCM->ccPrinterProfile);

DebugMsg(__TEXT("pTargetProfile 0x%08lX <%s>\r\n"), lpCM->pTargetProfile , lpCM->pTargetProfile ? lpCM->pTargetProfile : __TEXT("NULL PTR"));
DebugMsg(__TEXT("ccTargetProfile %ld\r\n"), lpCM->ccTargetProfile);

DebugMsg(__TEXT("lpfnHook 0x%08lx\r\n"), lpCM->lpfnHook);
DebugMsg(__TEXT("lParam 0x%08lx\r\n"), lpCM->lParam);
DebugMsg(__TEXT("***** COLORMATCHSETUP 0x%08lx\r\n"), lpCM);
} // End of function DumpCOLORMATCHSETUP