316 lines
7.7 KiB
C++
316 lines
7.7 KiB
C++
|
#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;
|
||
|
}
|