|
|
#include "headers.hxx"
#pragma hdrstop
//+----------------------------------------------------------------------------
//
// File:
// utils.cpp
//
// Contents:
// Utility functions for the cache unit test
//
// History:
//
// 04-Sep-94 davepl Created
//
//-----------------------------------------------------------------------------
//+----------------------------------------------------------------------------
//
// Member: TestInstance::AddXXXCacheNode
//
// Synopsis: Adds an empty cache node for various formats
//
// Arguments: [inst] -- ptr to test instance
// [pdwCon] -- ptr to connection ID (out)
//
// Returns: HRESULT
//
// Notes:
//
// History: 23-Aug-94 Davepl Created
//
//-----------------------------------------------------------------------------
HRESULT TestInstance::AddMFCacheNode(DWORD *pdwCon) { HRESULT hr; TraceLog Log(this, "TestInstance::AddMFCacheNode", GS_CACHE, VB_MAXIMUM); Log.OnEntry (" ( %p ) \n", pdwCon); Log.OnExit (" ( %X ) [ %p ]\n", &hr, pdwCon); FORMATETC fetcMF = { CF_METAFILEPICT, // Clipformat
NULL, // DVTargetDevice
DVASPECT_CONTENT, // Aspect
-1, // Index
TYMED_MFPICT // TYMED
};
//
// Cache a METAFILE node
//
hr = m_pOleCache->Cache(&fetcMF, ADVF_PRIMEFIRST, pdwCon); return hr; }
HRESULT TestInstance::AddEMFCacheNode(DWORD *pdwCon) { HRESULT hr; TraceLog Log(this, "TestInstance::AddEMFCacheNode", GS_CACHE, VB_MAXIMUM); Log.OnEntry (" ( %p ) \n", pdwCon); Log.OnExit (" ( %X ) [ %p ]\n", &hr, pdwCon); FORMATETC fetcEMF = { CF_ENHMETAFILE, // Clipformat
NULL, // DVTargetDevice
DVASPECT_CONTENT, // Aspect
-1, // Index
TYMED_ENHMF // TYMED
};
//
// Cache an ENH METAFILE node
//
hr = m_pOleCache->Cache(&fetcEMF, ADVF_PRIMEFIRST, pdwCon); return hr; }
HRESULT TestInstance::AddDIBCacheNode(DWORD *pdwCon) { HRESULT hr;
TraceLog Log(this, "TestInstance::AddDIBCacheNode", GS_CACHE, VB_MAXIMUM); Log.OnEntry (" ( %p ) \n", pdwCon); Log.OnExit (" ( %X ) [ %p ]\n", &hr, pdwCon); FORMATETC fetcDIB = { CF_DIB, // Clipformat
NULL, // DVTargetDevice
DVASPECT_CONTENT, // Aspect
-1, // Index
TYMED_HGLOBAL // TYMED
};
//
// Cache a DIB node
//
hr = m_pOleCache->Cache(&fetcDIB, ADVF_PRIMEFIRST, pdwCon); return hr;
}
HRESULT TestInstance::AddBITMAPCacheNode(DWORD *pdwCon) { HRESULT hr;
TraceLog Log(this, "TestInstance::AddMFCacheNode", GS_CACHE, VB_MAXIMUM); Log.OnEntry (" ( %p ) \n", pdwCon); Log.OnExit (" ( %X ) [ %p ]\n", &hr, pdwCon); FORMATETC fetcBITMAP = { CF_BITMAP, // Clipformat
NULL, // DVTargetDevice
DVASPECT_CONTENT, // Aspect
-1, // Index
TYMED_GDI // TYMED
};
//
// Cache a BITMAP node
//
hr = m_pOleCache->Cache(&fetcBITMAP, ADVF_PRIMEFIRST, pdwCon); return hr; }
//+----------------------------------------------------------------------------
//
// Function: EltIsInArray
//
// Synopsis: Checks to see if a STATDATA search item is in
// a STATDATA array. Checks clipformat and connection
// ID only.
//
// Arguments: [sdToFind] STATDATA we are looking for
// [rgStat] Array of STATDATAs to look in
// [cCount] Count of STATDATAs in rgStat
//
// Returns: S_OK if found, S_FALSE if not
//
// Notes:
//
// History: 23-Aug-94 Davepl Created
//
//-----------------------------------------------------------------------------
HRESULT EltIsInArray(STATDATA sdToFind, STATDATA rgStat[], DWORD cCount) { HRESULT hr = S_FALSE;
TraceLog Log(NULL, "EltIsInArray", GS_CACHE, VB_MAXIMUM); Log.OnEntry (" ( %p, %p, %d )\n", &sdToFind, rgStat, cCount); Log.OnExit (" ( %X )\n", &hr); for (DWORD a=0; a<cCount; a++) { if (rgStat[a].formatetc.cfFormat == sdToFind.formatetc.cfFormat && rgStat[a].dwConnection == sdToFind.dwConnection) { hr = S_OK; break; } }
return hr; }
//+----------------------------------------------------------------------------
//
// Function: ConvWidthInPelsToLHM
// ConvHeightInPelsToLHM
//
// Synopsis: Converts a measurement in pixels to LOGICAL HIMETRICS.
// If a reference DC is given, it is used, otherwise
// the screen DC is used as a default.
//
// Arguments: [hDC] The reference DC
// [int] The width or height to convert
//
// Returns: S_OK if found, S_FALSE if not
//
// History: 06-Aug-94 Davepl Copy/Paste/Cleanup
//
//-----------------------------------------------------------------------------
const LONG HIMETRIC_PER_INCH = 2540;
int ConvWidthInPelsToLHM(HDC hDC, int iWidthInPix) { int iXppli; // Pixels per logical inch along width
int iWidthInHiMetric; BOOL fSystemDC = FALSE;
if (NULL == hDC) { hDC = GetDC(NULL); fSystemDC = TRUE; }
iXppli = GetDeviceCaps (hDC, LOGPIXELSX);
// We got pixel units, convert them to logical HIMETRIC along
// the display
iWidthInHiMetric = MulDiv(HIMETRIC_PER_INCH, iWidthInPix, iXppli);
if (fSystemDC) { ReleaseDC(NULL, hDC); }
return iWidthInHiMetric; }
int ConvHeightInPelsToLHM(HDC hDC, int iHeightInPix) { int iYppli; //Pixels per logical inch along height
int iHeightInHiMetric; BOOL fSystemDC = FALSE;
if (NULL == hDC) { hDC = GetDC(NULL); fSystemDC = TRUE; }
iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
// We got pixel units, convert them to logical HIMETRIC along the
// display
iHeightInHiMetric = MulDiv(HIMETRIC_PER_INCH, iHeightInPix, iYppli);
if (fSystemDC) { ReleaseDC(NULL, hDC); } return iHeightInHiMetric; }
//+----------------------------------------------------------------------------
//
// Function: TestInstance::UncacheFormat
//
// Synopsis: Uncaches the first node found in the cache that
// matches the format specified.
//
// Arguments: [cf] Format to look for
//
// Returns: HRESULT
//
// Notes: If there are multiple nodes (ie: various apsects) of
// the same clipformat, only the first one found is
// removed.
//
// History: 23-Aug-94 Davepl Created
//
//-----------------------------------------------------------------------------
HRESULT TestInstance::UncacheFormat(CLIPFORMAT cf) { HRESULT hr;
TraceLog Log(NULL, "TestInstance::UncacheFormat", GS_CACHE, VB_MAXIMUM); Log.OnEntry (" ( %d )\n", cf); Log.OnExit (" ( %X )\n", &hr);
BOOL fFound = FALSE;
//
// Get an enumerator on the cache
//
LPENUMSTATDATA pEsd; hr = m_pOleCache->EnumCache(&pEsd); if (S_OK == hr) { //
// Loop until a failure or until we have removed all of
// the nodes that we thought should exist
//
STATDATA stat;
while (S_OK == hr && FALSE == fFound) { hr = pEsd->Next(1, &stat, NULL); if (S_OK == hr && stat.formatetc.cfFormat == cf) { hr = m_pOleCache->Uncache(stat.dwConnection); if (S_OK == hr) { fFound = TRUE; } } } }
return hr; }
|