|
|
/******************************Module*Header*******************************\
* Module Name: atmstub.c * * Copyright (c) 1998-1999 Microsoft Corporation \**************************************************************************/
#include "engine.h"
#include "atmstub.h"
#define ARRAYSIZE(a) (sizeof(a) / sizeof(*(a)))
#define ESC_NOT_SUPPORTED 0
#define ESC_IS_SUPPORTED 1
#define BEG_OF_ATM_ESCAPE_LIST 0x2500
#define END_OF_ATM_ESCAPE_LIST 0x2600 //Allocated 256 escapes to ATM.
DRVFN atmfdCallBlock[] = { {INDEX_DrvEnablePDEV, (PFN)atmfdEnablePDEV}, {INDEX_DrvDisablePDEV, (PFN)atmfdDisablePDEV}, {INDEX_DrvCompletePDEV, (PFN)atmfdCompletePDEV}, {INDEX_DrvLoadFontFile, (PFN)atmfdLoadFontFile}, {INDEX_DrvQueryFontCaps, (PFN)atmfdQueryFontCaps}, {INDEX_DrvUnloadFontFile, (PFN)atmfdUnloadFontFile}, {INDEX_DrvQueryFontFile, (PFN)atmfdQueryFontFile}, {INDEX_DrvQueryFont, (PFN)atmfdQueryFont}, {INDEX_DrvFree, (PFN)atmfdFree}, {INDEX_DrvQueryFontTree, (PFN)atmfdQueryFontTree}, {INDEX_DrvQueryFontData, (PFN)atmfdQueryFontData}, {INDEX_DrvDestroyFont, (PFN)atmfdDestroyFont}, {INDEX_DrvQueryAdvanceWidths, (PFN)atmfdQueryAdvanceWidths}, {INDEX_DrvQueryTrueTypeOutline, (PFN)atmfdQueryTrueTypeOutline}, {INDEX_DrvQueryTrueTypeTable, (PFN)atmfdQueryTrueTypeTable}, {INDEX_DrvEscape, (PFN)atmfdEscape}, {INDEX_DrvFontManagement, (PFN)atmfdFontManagement}, {INDEX_DrvGetTrueTypeFile, (PFN)atmfdGetTrueTypeFile}, {INDEX_DrvQueryGlyphAttrs, (PFN)atmfdQueryGlyphAttrs}, }; UINT ARRAYSIZE_atmfdCallBlock = ARRAYSIZE(atmfdCallBlock);
//Typedefs for functions pointers...
typedef BOOL (APIENTRY *DRV_ENABLE_DRIVER)(ULONG, ULONG, PDRVENABLEDATA); typedef LONG (APIENTRY *DRV_QUERY_FONT_CAPS)(ULONG, PULONG); typedef BOOL (APIENTRY *DRV_UNLOAD_FONT_FILE)(ULONG_PTR); typedef LONG (APIENTRY *DRV_QUERY_FONT_FILE)(ULONG_PTR, ULONG, ULONG, PULONG); typedef PIFIMETRICS (APIENTRY *DRV_QUERY_FONT)(DHPDEV, ULONG_PTR, ULONG, ULONG_PTR*); typedef VOID (APIENTRY *DRV_FREE)(PVOID, ULONG_PTR); typedef PVOID (APIENTRY *DRV_QUERY_FONT_TREE)(DHPDEV, ULONG_PTR, ULONG, ULONG, ULONG_PTR*); typedef LONG (APIENTRY *DRV_QUERY_FONT_DATA)(DHPDEV, FONTOBJ*, ULONG, HGLYPH, GLYPHDATA*, PVOID, ULONG); typedef VOID (APIENTRY *DRV_DESTROY_FONT)(FONTOBJ*); typedef BOOL (APIENTRY *DRV_QUERY_ADVANCE_WIDTHS)(DHPDEV, FONTOBJ*, ULONG, PHGLYPH, PVOID, ULONG); typedef LONG (APIENTRY *DRV_QUERY_TRUE_TYPE_OUTLINE)(DHPDEV, FONTOBJ*, HGLYPH, BOOL, GLYPHDATA*, ULONG, TTPOLYGONHEADER*); typedef ULONG (APIENTRY *DRV_ESCAPE)(SURFOBJ*, ULONG, ULONG, PVOID, ULONG, PVOID); typedef ULONG (APIENTRY *DRV_FONT_MANAGEMENT)(SURFOBJ*, FONTOBJ*, ULONG, ULONG, PVOID, ULONG, PVOID); typedef PVOID (APIENTRY *DRV_GET_TRUE_TYPE_FILE)(ULONG_PTR, PULONG); typedef ULONG_PTR (APIENTRY *DRV_LOAD_FONT_FILE)(ULONG, PULONG_PTR, PVOID*, PULONG, PDESIGNVECTOR, ULONG, ULONG); typedef LONG (APIENTRY *DRV_QUERY_TRUE_TYPE_TABLE)(ULONG_PTR, ULONG, ULONG, PTRDIFF, ULONG, PBYTE, PBYTE*, PULONG); typedef PFD_GLYPHATTR (APIENTRY *DRV_QUERY_GLYPH_ATTRS)(FONTOBJ*, ULONG);
//Globals...
//Function pointers....
DRV_ENABLE_DRIVER pAtmfdEnableDriver = NULL; DRV_LOAD_FONT_FILE pAtmfdLoadFontFile = NULL; DRV_UNLOAD_FONT_FILE pAtmfdUnloadFontFile = NULL; DRV_QUERY_FONT_FILE pAtmfdQueryFontFile = NULL; DRV_QUERY_FONT pAtmfdQueryFont = NULL; DRV_FREE pAtmfdFree = NULL; DRV_QUERY_FONT_TREE pAtmfdQueryFontTree = NULL; DRV_QUERY_FONT_DATA pAtmfdQueryFontData = NULL; DRV_DESTROY_FONT pAtmfdDestroyFont = NULL; DRV_QUERY_ADVANCE_WIDTHS pAtmfdQueryAdvanceWidths = NULL; DRV_QUERY_TRUE_TYPE_OUTLINE pAtmfdQueryTrueTypeOutline = NULL; DRV_QUERY_TRUE_TYPE_TABLE pAtmfdQueryTrueTypeTable = NULL; DRV_ESCAPE pAtmfdEscape = NULL; DRV_FONT_MANAGEMENT pAtmfdFontManagement = NULL; DRV_GET_TRUE_TYPE_FILE pAtmfdGetTrueTypeFile = NULL; DRV_QUERY_GLYPH_ATTRS pAtmfdQueryGlyphAttrs = NULL;
HANDLE atmfdHandle = NULL; BOOL driverFailedLoad = FALSE; ULONG engineVersion = 0; DRVENABLEDATA atmfdFuncData = {0};
//------------------------------------------------------------------------------
static PVOID FindFunc( ULONG funcIndex) { PVOID result = NULL; UINT i;
for (i = 0; i < ARRAYSIZE_atmfdCallBlock; i++) { if (atmfdFuncData.pdrvfn[i].iFunc == funcIndex) { result = (PVOID)atmfdFuncData.pdrvfn[i].pfn; break; } } return result; }
//------------------------------------------------------------------------------
static BOOL InitializeDriver(void) { BOOL result = FALSE;
GreAcquireSemaphore(ghsemAtmfdInit);
//Has the driver already been loaded?
if (atmfdHandle != NULL) { result = TRUE; goto ExitPoint; }
//Have we attempted to load the driver previously but failed?
if (driverFailedLoad == TRUE) goto ExitPoint;
//Load an image of the ATM font driver...
if ((atmfdHandle = EngLoadImage(L"ATMFD.DLL")) == NULL) goto ExitPoint;
//Get a pointer to the DrvEnableDriver function...
if ((pAtmfdEnableDriver = EngFindImageProcAddress(atmfdHandle, "DrvEnableDriver")) == NULL) goto ExitPoint;
//Initialize the ATMFD driver...
if ((*pAtmfdEnableDriver)(engineVersion, sizeof(atmfdFuncData), &atmfdFuncData) == FALSE) goto ExitPoint;
//Check driver version number...
if (atmfdFuncData.iDriverVersion != DDI_DRIVER_VERSION_NT5) goto ExitPoint;
//Now get the rest of the function pointers...
if ((pAtmfdLoadFontFile = FindFunc(INDEX_DrvLoadFontFile)) == NULL) goto ExitPoint; if ((pAtmfdUnloadFontFile = FindFunc(INDEX_DrvUnloadFontFile)) == NULL) goto ExitPoint; if ((pAtmfdQueryFontFile = FindFunc(INDEX_DrvQueryFontFile)) == NULL) goto ExitPoint; if ((pAtmfdQueryFont = FindFunc(INDEX_DrvQueryFont)) == NULL) goto ExitPoint; if ((pAtmfdFree = FindFunc(INDEX_DrvFree)) == NULL) goto ExitPoint; if ((pAtmfdQueryFontTree = FindFunc(INDEX_DrvQueryFontTree)) == NULL) goto ExitPoint; if ((pAtmfdQueryFontData = FindFunc(INDEX_DrvQueryFontData)) == NULL) goto ExitPoint; if ((pAtmfdDestroyFont = FindFunc(INDEX_DrvDestroyFont)) == NULL) goto ExitPoint; if ((pAtmfdQueryAdvanceWidths = FindFunc(INDEX_DrvQueryAdvanceWidths)) == NULL) goto ExitPoint; if ((pAtmfdQueryTrueTypeOutline = FindFunc(INDEX_DrvQueryTrueTypeOutline)) == NULL) goto ExitPoint; if ((pAtmfdQueryTrueTypeTable = FindFunc(INDEX_DrvQueryTrueTypeTable)) == NULL) goto ExitPoint; if ((pAtmfdEscape = FindFunc(INDEX_DrvEscape)) == NULL) goto ExitPoint; if ((pAtmfdFontManagement = FindFunc(INDEX_DrvFontManagement)) == NULL) goto ExitPoint; if ((pAtmfdGetTrueTypeFile = FindFunc(INDEX_DrvGetTrueTypeFile)) == NULL) goto ExitPoint; if ((pAtmfdQueryGlyphAttrs = FindFunc(INDEX_DrvQueryGlyphAttrs)) == NULL) goto ExitPoint;
result = TRUE; ExitPoint: if (result == FALSE) { driverFailedLoad = TRUE; if (atmfdHandle != NULL) { EngUnloadImage(atmfdHandle); atmfdHandle = NULL; } }
GreReleaseSemaphore(ghsemAtmfdInit);
return result; }
//------------------------------------------------------------------------------
BOOL APIENTRY atmfdEnableDriver( ULONG iEngineVersion, ULONG cj, PDRVENABLEDATA pded) // Requests that the driver fill a structure with pointers to supported
// functions and other control information. The function returns TRUE if
// the driver is enabled FALSE otherwise.
{ engineVersion = iEngineVersion; if (cj >= sizeof(DRVENABLEDATA)) { pded->pdrvfn = atmfdCallBlock; pded->c = ARRAYSIZE_atmfdCallBlock; pded->iDriverVersion = DDI_DRIVER_VERSION_NT5; return TRUE; } return FALSE; }
//------------------------------------------------------------------------------
VOID APIENTRY atmfdDisableDriver(void) { if (atmfdHandle) { EngUnloadImage(atmfdHandle); atmfdHandle = NULL; } }
//------------------------------------------------------------------------------
DHPDEV APIENTRY atmfdEnablePDEV( DEVMODEW* pdm, PWSTR pwszLogAddr, ULONG cPat, HSURF* phsurfPatterns, ULONG cjCaps, ULONG* pdevcaps, ULONG cjDevInfo, DEVINFO* pdi, HDEV hdev, PWSTR pwszDeviceName, HANDLE hDriver) { return ((DHPDEV) EngAllocMem(FL_ZERO_MEMORY, 4, 'AerG')); }
//------------------------------------------------------------------------------
VOID APIENTRY atmfdDisablePDEV( DHPDEV dhpdev) { EngFreeMem(dhpdev); }
//------------------------------------------------------------------------------
VOID APIENTRY atmfdCompletePDEV( DHPDEV dhpdev, HDEV hdev) { return; }
//------------------------------------------------------------------------------
ULONG_PTR APIENTRY atmfdLoadFontFile( //Returns IFILE value
ULONG cFiles, // number of font files associated with this font
PULONG_PTR piFile, // handles for individual files, cFiles of them
PVOID *ppvView, // array of cFiles views
PULONG pcjView, // array of their sizes
PDESIGNVECTOR pdv, ULONG ulLangID, ULONG ulFastCheckSum) { if (InitializeDriver()) return (*pAtmfdLoadFontFile)(cFiles, piFile, ppvView, pcjView, pdv, ulLangID, ulFastCheckSum); else return 0; }
//------------------------------------------------------------------------------
LONG APIENTRY atmfdQueryFontCaps( ULONG culCaps, PULONG pulCaps) { if (culCaps >= 2) { pulCaps[0] = 2L; pulCaps[1] = QC_OUTLINES | QC_1BIT | QC_4BIT; return 2; } else return FD_ERROR; }
//------------------------------------------------------------------------------
BOOL APIENTRY atmfdUnloadFontFile( ULONG_PTR iFile) { return (*pAtmfdUnloadFontFile)(iFile); }
//------------------------------------------------------------------------------
LONG APIENTRY atmfdQueryFontFile( ULONG_PTR iFile, ULONG ulMode, ULONG cjBuf, PULONG pulBuf) { return (*pAtmfdQueryFontFile)(iFile, ulMode, cjBuf, pulBuf); }
//------------------------------------------------------------------------------
PIFIMETRICS APIENTRY atmfdQueryFont( DHPDEV dhpdev, ULONG_PTR iFile, ULONG iFace, ULONG_PTR *pid) { return (*pAtmfdQueryFont)(dhpdev, iFile, iFace, pid); }
//------------------------------------------------------------------------------
VOID APIENTRY atmfdFree( PVOID pv, ULONG_PTR id) { (*pAtmfdFree)(pv, id); }
//------------------------------------------------------------------------------
PVOID APIENTRY atmfdQueryFontTree( DHPDEV dhpdev, ULONG_PTR iFile, ULONG iFace, ULONG iMode, ULONG_PTR *pid) { return (*pAtmfdQueryFontTree)(dhpdev, iFile, iFace, iMode, pid); }
//------------------------------------------------------------------------------
LONG APIENTRY atmfdQueryFontData( DHPDEV dhpdev, FONTOBJ *pfo, ULONG iMode, HGLYPH hg, GLYPHDATA *pgd, PVOID pv, ULONG cjSize) { return (*pAtmfdQueryFontData)(dhpdev, pfo, iMode, hg, pgd, pv, cjSize); }
//------------------------------------------------------------------------------
VOID APIENTRY atmfdDestroyFont( FONTOBJ *pfo) { (*pAtmfdDestroyFont)(pfo); }
//------------------------------------------------------------------------------
BOOL APIENTRY atmfdQueryAdvanceWidths( DHPDEV dhpdev, FONTOBJ *pfo, ULONG iMode, PHGLYPH pGlyphHandle, PVOID widths, ULONG numOfGlyphs) { return (*pAtmfdQueryAdvanceWidths)(dhpdev, pfo, iMode, pGlyphHandle, widths, numOfGlyphs); }
//------------------------------------------------------------------------------
LONG APIENTRY atmfdQueryTrueTypeOutline( DHPDEV dhpdev, FONTOBJ *pfo, HGLYPH hg, BOOL metricsOnly, GLYPHDATA *pgd, ULONG cjSize, TTPOLYGONHEADER *pgHead) { return (*pAtmfdQueryTrueTypeOutline)(dhpdev, pfo, hg, metricsOnly, pgd, cjSize, pgHead); }
//------------------------------------------------------------------------------
LONG APIENTRY atmfdQueryTrueTypeTable( ULONG_PTR iFile, ULONG ulFont, ULONG ulTag, PTRDIFF dpStart, ULONG cjBuf, PBYTE pjBuf, PBYTE *ppjTable, PULONG pcjTable) { return (*pAtmfdQueryTrueTypeTable)(iFile, ulFont, ulTag, dpStart, cjBuf, pjBuf, ppjTable, pcjTable); }
//------------------------------------------------------------------------------
PFD_GLYPHATTR APIENTRY atmfdQueryGlyphAttrs( FONTOBJ *pfo, ULONG iMode) { return (*pAtmfdQueryGlyphAttrs)(pfo, iMode); }
//------------------------------------------------------------------------------
ULONG APIENTRY atmfdEscape( SURFOBJ *pso, ULONG iEsc, ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut) { return atmfdFontManagement(pso, NULL, iEsc, cjIn, pvIn, cjOut, pvOut); }
//------------------------------------------------------------------------------
ULONG APIENTRY atmfdFontManagement( SURFOBJ *pso, FONTOBJ *pfo, ULONG iEsc, ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut) { ULONG result = ESC_NOT_SUPPORTED; BOOL callDriver = FALSE;
switch(iEsc) { case QUERYESCSUPPORT: { switch (*((PULONG)pvIn)) { case QUERYESCSUPPORT: case GETEXTENDEDTEXTMETRICS: result = ESC_IS_SUPPORTED; break; default: if ((*((PULONG)pvIn) > BEG_OF_ATM_ESCAPE_LIST) && (*((PULONG)pvIn) < END_OF_ATM_ESCAPE_LIST)) result = ESC_IS_SUPPORTED; } break; } case GETEXTENDEDTEXTMETRICS: { callDriver = TRUE; break; } default: { if ((iEsc <= BEG_OF_ATM_ESCAPE_LIST) || (iEsc >= END_OF_ATM_ESCAPE_LIST)) break;
callDriver = TRUE; break; } } if (callDriver) { if (InitializeDriver() == TRUE) { return (*pAtmfdFontManagement)(pso, pfo, iEsc, cjIn, pvIn, cjOut, pvOut); } } return result; }
//------------------------------------------------------------------------------
PVOID APIENTRY atmfdGetTrueTypeFile( ULONG_PTR iFile, PULONG pcj) { return (*pAtmfdGetTrueTypeFile)(iFile, pcj); }
|