You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
474 lines
12 KiB
474 lines
12 KiB
/******************************Module*Header*******************************\
|
|
* Module Name: fontfile.c *
|
|
* *
|
|
* Contains exported font driver entry points and memory allocation/locking *
|
|
* methods from engine's handle manager. Adapted from BodinD's bitmap font *
|
|
* driver. *
|
|
* *
|
|
* Copyright (c) 1993-1995 Microsoft Corporation *
|
|
\**************************************************************************/
|
|
|
|
#include "fd.h"
|
|
|
|
HSEMAPHORE ghsemVTFD;
|
|
|
|
|
|
VOID vVtfdMarkFontGone(FONTFILE *pff, DWORD iExceptionCode)
|
|
{
|
|
|
|
ASSERTDD(pff, "vVtfdMarkFontGone, pff\n");
|
|
|
|
// this font has disappeared, probably net failure or somebody pulled the
|
|
// floppy with vt file out of the floppy drive
|
|
|
|
if (iExceptionCode == STATUS_IN_PAGE_ERROR) // file disappeared
|
|
{
|
|
// prevent any further queries about this font:
|
|
|
|
pff->fl |= FF_EXCEPTION_IN_PAGE_ERROR;
|
|
|
|
if ((pff->iType == TYPE_FNT) || (pff->iType == TYPE_DLL16))
|
|
{
|
|
EngUnmapFontFileFD(pff->iFile);
|
|
}
|
|
}
|
|
|
|
if (iExceptionCode == STATUS_ACCESS_VIOLATION)
|
|
{
|
|
RIP("VTFD!this is probably a buggy vector font file\n");
|
|
}
|
|
}
|
|
|
|
BOOL bvtfdMapFontFileFD(PFONTFILE pff)
|
|
{
|
|
return (pff ? (EngMapFontFileFD(pff->iFile, (PULONG*)&pff->pvView, &pff->cjView))
|
|
: FALSE);
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
*
|
|
* vtfdQueryFontDataTE, try except wrapper
|
|
*
|
|
* Effects:
|
|
*
|
|
* Warnings:
|
|
*
|
|
* History:
|
|
* 04-Apr-1993 -by- Bodin Dresevic [BodinD]
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
LONG vtfdQueryFontDataTE (
|
|
DHPDEV dhpdev,
|
|
FONTOBJ *pfo,
|
|
ULONG iMode,
|
|
HGLYPH hg,
|
|
GLYPHDATA *pgd,
|
|
PVOID pv,
|
|
ULONG cjSize
|
|
)
|
|
{
|
|
LONG lRet = FD_ERROR;
|
|
|
|
if (bvtfdMapFontFileFD((PFONTFILE)pfo->iFile))
|
|
{
|
|
EngAcquireSemaphore(ghsemVTFD);
|
|
|
|
#ifndef VTFD_NO_TRY_EXCEPT
|
|
try
|
|
{
|
|
#endif
|
|
lRet = vtfdQueryFontData (
|
|
pfo,
|
|
iMode,
|
|
hg,
|
|
pgd,
|
|
pv,
|
|
cjSize
|
|
);
|
|
#ifndef VTFD_NO_TRY_EXCEPT
|
|
}
|
|
except (EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
WARNING("exception in vtfdQueryFontDataTE \n");
|
|
vVtfdMarkFontGone((FONTFILE *)pfo->iFile, GetExceptionCode());
|
|
}
|
|
#endif
|
|
|
|
EngReleaseSemaphore(ghsemVTFD);
|
|
|
|
EngUnmapFontFileFD(PFF(pfo->iFile)->iFile);
|
|
}
|
|
|
|
return lRet;
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
*
|
|
* HFF vtfdLoadFontFileTE, try except wrapper
|
|
*
|
|
*
|
|
* History:
|
|
* 05-Apr-1993 -by- Bodin Dresevic [BodinD]
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
ULONG ExceptionFilter_VtfdLoadFontFile(PEXCEPTION_POINTERS ExceptionPointers)
|
|
{
|
|
#if DBG
|
|
const static char Function[] = __FUNCTION__;
|
|
ULONG ExceptionCode;
|
|
|
|
ExceptionCode = ExceptionPointers->ExceptionRecord->ExceptionCode;
|
|
|
|
if (ExceptionCode != STATUS_IN_PAGE_ERROR)
|
|
{
|
|
VtfdDebugPrint(
|
|
"%s: .exr %p\n%s: .cxr %p\n",
|
|
Function,
|
|
ExceptionPointers->ExceptionRecord,
|
|
Function,
|
|
ExceptionPointers->ContextRecord
|
|
);
|
|
|
|
ASSERTDD(ExceptionCode == STATUS_IN_PAGE_ERROR,
|
|
"vtfdLoadFontFile, strange exception code\n");
|
|
}
|
|
#endif
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
}
|
|
|
|
HFF vtfdLoadFontFileTE(
|
|
ULONG cFiles,
|
|
ULONG_PTR *piFile,
|
|
PVOID *ppvView,
|
|
ULONG *pcjView,
|
|
DESIGNVECTOR *pdv,
|
|
ULONG ulLangId,
|
|
ULONG ulFastCheckSum
|
|
)
|
|
{
|
|
HFF hff = (HFF)NULL;
|
|
ULONG_PTR iFile;
|
|
PVOID pvView;
|
|
ULONG cjView;
|
|
BOOL bRet;
|
|
|
|
if ((cFiles != 1) || pdv)
|
|
return hff;
|
|
|
|
iFile = *piFile;
|
|
pvView = *ppvView;
|
|
cjView = *pcjView;
|
|
|
|
EngAcquireSemaphore(ghsemVTFD);
|
|
|
|
#ifndef VTFD_NO_TRY_EXCEPT
|
|
try
|
|
{
|
|
#endif
|
|
|
|
bRet = vtfdLoadFontFile(iFile, pvView, cjView, &hff);
|
|
|
|
if (!bRet)
|
|
{
|
|
ASSERTDD(hff == (HFF)NULL, "vtfdLoadFontFile, hff != NULL\n");
|
|
}
|
|
#ifndef VTFD_NO_TRY_EXCEPT
|
|
}
|
|
except (ExceptionFilter_VtfdLoadFontFile(GetExceptionInformation()))
|
|
{
|
|
WARNING("exception in vtfdLoadFontFile \n");
|
|
|
|
// if the file disappeared after mem was allocated, free the mem
|
|
|
|
if (hff)
|
|
{
|
|
vFree(hff);
|
|
hff = (HFF) NULL;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
EngReleaseSemaphore(ghsemVTFD);
|
|
|
|
return hff;
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
*
|
|
* BOOL vtfdUnloadFontFileTE , try/except wrapper
|
|
*
|
|
*
|
|
* History:
|
|
* 05-Apr-1993 -by- Bodin Dresevic [BodinD]
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
BOOL vtfdUnloadFontFileTE (HFF hff)
|
|
{
|
|
BOOL bRet;
|
|
|
|
EngAcquireSemaphore(ghsemVTFD);
|
|
|
|
#ifndef VTFD_NO_TRY_EXCEPT
|
|
try
|
|
{
|
|
#endif
|
|
bRet = vtfdUnloadFontFile(hff);
|
|
#ifndef VTFD_NO_TRY_EXCEPT
|
|
}
|
|
except (EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
WARNING("exception in vtfdUnloadFontFile\n");
|
|
bRet = FALSE;
|
|
}
|
|
#endif
|
|
|
|
EngReleaseSemaphore(ghsemVTFD);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
*
|
|
* LONG vtfdQueryFontFileTE, try/except wrapper
|
|
*
|
|
* History:
|
|
* 05-Apr-1993 -by- Bodin Dresevic [BodinD]
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
|
|
LONG vtfdQueryFontFileTE (
|
|
HFF hff, // handle to font file
|
|
ULONG ulMode, // type of query
|
|
ULONG cjBuf, // size of buffer (in BYTEs)
|
|
PULONG pulBuf // return buffer (NULL if requesting size of data)
|
|
)
|
|
{
|
|
LONG lRet = FD_ERROR;
|
|
|
|
if ((ulMode != QFF_DESCRIPTION) ||
|
|
bvtfdMapFontFileFD(PFF(hff)))
|
|
{
|
|
EngAcquireSemaphore(ghsemVTFD);
|
|
|
|
#ifndef VTFD_NO_TRY_EXCEPT
|
|
try
|
|
{
|
|
#endif
|
|
lRet = vtfdQueryFontFile (hff,ulMode, cjBuf,pulBuf);
|
|
#ifndef VTFD_NO_TRY_EXCEPT
|
|
}
|
|
except (EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
WARNING("exception in vtfdQueryFontFile\n");
|
|
vVtfdMarkFontGone((FONTFILE *)hff, GetExceptionCode());
|
|
}
|
|
#endif
|
|
|
|
EngReleaseSemaphore(ghsemVTFD);
|
|
|
|
if (ulMode == QFF_DESCRIPTION)
|
|
{
|
|
EngUnmapFontFileFD(PFF(hff)->iFile);
|
|
}
|
|
}
|
|
|
|
return lRet;
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
*
|
|
* BOOL vtfdQueryAdvanceWidthsTE, try/except wrapper
|
|
*
|
|
* History:
|
|
* 05-Apr-1993 -by- Bodin Dresevic [BodinD]
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
|
|
|
|
BOOL vtfdQueryAdvanceWidthsTE
|
|
(
|
|
DHPDEV dhpdev,
|
|
FONTOBJ *pfo,
|
|
ULONG iMode,
|
|
HGLYPH *phg,
|
|
LONG *plWidths,
|
|
ULONG cGlyphs
|
|
)
|
|
{
|
|
BOOL bRet = FD_ERROR;
|
|
|
|
if ((iMode <= QAW_GETEASYWIDTHS) &&
|
|
bvtfdMapFontFileFD((PFONTFILE)pfo->iFile))
|
|
{
|
|
EngAcquireSemaphore(ghsemVTFD);
|
|
|
|
#ifndef VTFD_NO_TRY_EXCEPT
|
|
try
|
|
{
|
|
#endif
|
|
bRet = vtfdQueryAdvanceWidths (pfo,iMode, phg, plWidths, cGlyphs);
|
|
#ifndef VTFD_NO_TRY_EXCEPT
|
|
}
|
|
except (EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
WARNING("exception in vtfdQueryAdvanceWidths \n");
|
|
vVtfdMarkFontGone((FONTFILE *)pfo->iFile, GetExceptionCode());
|
|
}
|
|
#endif
|
|
|
|
EngReleaseSemaphore(ghsemVTFD);
|
|
|
|
EngUnmapFontFileFD(PFF(pfo->iFile)->iFile);
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
* DHPDEV DrvEnablePDEV
|
|
*
|
|
* Initializes a bunch of fields for GDI
|
|
*
|
|
\**************************************************************************/
|
|
|
|
DHPDEV
|
|
vtfdEnablePDEV(
|
|
DEVMODEW* pdm,
|
|
PWSTR pwszLogAddr,
|
|
ULONG cPat,
|
|
HSURF* phsurfPatterns,
|
|
ULONG cjCaps,
|
|
ULONG* pdevcaps,
|
|
ULONG cjDevInfo,
|
|
DEVINFO* pdi,
|
|
HDEV hdev,
|
|
PWSTR pwszDeviceName,
|
|
HANDLE hDriver)
|
|
{
|
|
|
|
PVOID* ppdev;
|
|
|
|
//
|
|
// Allocate a four byte PDEV for now
|
|
// We can grow it if we ever need to put information in it.
|
|
//
|
|
|
|
ppdev = (PVOID*) EngAllocMem(0, sizeof(PVOID), 'dftV');
|
|
|
|
return ((DHPDEV) ppdev);
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
* DrvDisablePDEV
|
|
*
|
|
* Release the resources allocated in DrvEnablePDEV. If a surface has been
|
|
* enabled DrvDisableSurface will have already been called.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID
|
|
vtfdDisablePDEV(
|
|
DHPDEV dhpdev)
|
|
{
|
|
EngFreeMem(dhpdev);
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
* VOID DrvCompletePDEV
|
|
*
|
|
* Store the HPDEV, the engines handle for this PDEV, in the DHPDEV.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID
|
|
vtfdCompletePDEV(
|
|
DHPDEV dhpdev,
|
|
HDEV hdev)
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// The driver function table with all function index/address pairs
|
|
|
|
DRVFN gadrvfnVTFD[] =
|
|
{
|
|
{ INDEX_DrvEnablePDEV, (PFN) vtfdEnablePDEV, },
|
|
{ INDEX_DrvDisablePDEV, (PFN) vtfdDisablePDEV, },
|
|
{ INDEX_DrvCompletePDEV, (PFN) vtfdCompletePDEV, },
|
|
{ INDEX_DrvQueryFont, (PFN) vtfdQueryFont, },
|
|
{ INDEX_DrvQueryFontTree, (PFN) vtfdQueryFontTree, },
|
|
{ INDEX_DrvQueryFontData, (PFN) vtfdQueryFontDataTE, },
|
|
{ INDEX_DrvDestroyFont, (PFN) vtfdDestroyFont, },
|
|
{ INDEX_DrvQueryFontCaps, (PFN) vtfdQueryFontCaps, },
|
|
{ INDEX_DrvLoadFontFile, (PFN) vtfdLoadFontFileTE, },
|
|
{ INDEX_DrvUnloadFontFile, (PFN) vtfdUnloadFontFileTE, },
|
|
{ INDEX_DrvQueryFontFile, (PFN) vtfdQueryFontFileTE, },
|
|
{ INDEX_DrvQueryAdvanceWidths , (PFN) vtfdQueryAdvanceWidthsTE }
|
|
};
|
|
|
|
/******************************Public*Routine******************************\
|
|
* vtfdEnableDriver
|
|
*
|
|
* Enables the driver by retrieving the drivers function table and version.
|
|
*
|
|
* Sun 25-Apr-1993 -by- Patrick Haluptzok [patrickh]
|
|
* Change to be same as DDI Enable.
|
|
*
|
|
* History:
|
|
* 12-Dec-1990 -by- Bodin Dresevic [BodinD]
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
BOOL vtfdEnableDriver(
|
|
ULONG iEngineVersion,
|
|
ULONG cj,
|
|
PDRVENABLEDATA pded)
|
|
{
|
|
// Engine Version is passed down so future drivers can support previous
|
|
// engine versions. A next generation driver can support both the old
|
|
// and new engine conventions if told what version of engine it is
|
|
// working with. For the first version the driver does nothing with it.
|
|
|
|
iEngineVersion;
|
|
|
|
if ((ghsemVTFD = EngCreateSemaphore()) == (HSEMAPHORE) 0)
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
pded->pdrvfn = gadrvfnVTFD;
|
|
pded->c = sizeof(gadrvfnVTFD) / sizeof(DRVFN);
|
|
pded->iDriverVersion = DDI_DRIVER_VERSION_NT5;
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
#if DBG
|
|
|
|
VOID
|
|
VtfdDebugPrint(
|
|
PCHAR DebugMessage,
|
|
...
|
|
)
|
|
{
|
|
|
|
va_list ap;
|
|
|
|
va_start(ap, DebugMessage);
|
|
|
|
EngDebugPrint("VTFD: ", DebugMessage, ap);
|
|
|
|
va_end(ap);
|
|
|
|
}
|
|
#endif
|