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.
427 lines
10 KiB
427 lines
10 KiB
/******************************Module*Header*******************************\
|
|
* Module Name: fontfile.c
|
|
*
|
|
* "methods" for operating on FONTCONTEXT and FONTFILE objects
|
|
*
|
|
* Created: 18-Nov-1990 15:23:10
|
|
* Author: Bodin Dresevic [BodinD]
|
|
*
|
|
* Copyright (c) 1990 Microsoft Corporation
|
|
\**************************************************************************/
|
|
|
|
#include "fd.h"
|
|
|
|
HSEMAPHORE ghsemBMFD;
|
|
|
|
/******************************Public*Routine******************************\
|
|
*
|
|
* VOID vBmfdMarkFontGone(FONTFILE *pff, DWORD iExceptionCode)
|
|
*
|
|
*
|
|
* Effects:
|
|
*
|
|
* Warnings:
|
|
*
|
|
* History:
|
|
* 07-Apr-1993 -by- Bodin Dresevic [BodinD]
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
VOID vBmfdMarkFontGone(FONTFILE *pff, DWORD iExceptionCode)
|
|
{
|
|
|
|
ASSERTGDI(pff, "bmfd!vBmfdMarkFontGone, pff\n");
|
|
|
|
EngAcquireSemaphore(ghsemBMFD);
|
|
|
|
// 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;
|
|
EngUnmapFontFileFD(pff->iFile);
|
|
}
|
|
|
|
EngReleaseSemaphore(ghsemBMFD);
|
|
|
|
if (iExceptionCode == STATUS_ACCESS_VIOLATION)
|
|
{
|
|
RIP("BMFD!this is probably a buggy BITMAP font file\n");
|
|
}
|
|
}
|
|
|
|
BOOL bBmfdMapFontFileFD(FONTFILE *pff)
|
|
{
|
|
PVOID pvView;
|
|
COUNT cjView;
|
|
|
|
return (pff ? (EngMapFontFileFD(pff->iFile, (PULONG *)&pvView, &cjView))
|
|
: FALSE);
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
*
|
|
* try/except wrappers:
|
|
*
|
|
* BmfdQueryFontData,
|
|
* BmfdLoadFontFile,
|
|
* BmfdUnloadFontFile,
|
|
* BmfdQueryAdvanceWidths
|
|
*
|
|
* History:
|
|
* 29-Mar-1993 -by- Bodin Dresevic [BodinD]
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
LONG
|
|
BmfdQueryFontDataTE (
|
|
DHPDEV dhpdev,
|
|
FONTOBJ *pfo,
|
|
ULONG iMode,
|
|
HGLYPH hg,
|
|
GLYPHDATA *pgd,
|
|
PVOID pv,
|
|
ULONG cjSize
|
|
)
|
|
{
|
|
LONG lRet = FD_ERROR;
|
|
|
|
DONTUSE(dhpdev);
|
|
|
|
if (bBmfdMapFontFileFD((FONTFILE *)pfo->iFile))
|
|
{
|
|
#ifndef BMFD_NO_TRY_EXCEPT
|
|
try
|
|
{
|
|
#endif
|
|
lRet = BmfdQueryFontData (pfo, iMode, hg, pgd, pv, cjSize);
|
|
#ifndef BMFD_NO_TRY_EXCEPT
|
|
}
|
|
except (EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
WARNING("bmfd, exception in BmfdQueryFontData\n");
|
|
vBmfdMarkFontGone((FONTFILE *)pfo->iFile, GetExceptionCode());
|
|
}
|
|
#endif
|
|
|
|
EngUnmapFontFileFD(PFF(pfo->iFile)->iFile);
|
|
}
|
|
return lRet;
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
*
|
|
* BmfdLoadFontFileTE
|
|
*
|
|
*
|
|
* History:
|
|
* 07-Apr-1993 -by- Bodin Dresevic [BodinD]
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
ULONG ExceptionFilter_BmfdLoadFontFile(PEXCEPTION_POINTERS ExceptionPointers)
|
|
{
|
|
#if DBG
|
|
const static char Function[] = __FUNCTION__;
|
|
ULONG ExceptionCode;
|
|
|
|
ExceptionCode = ExceptionPointers->ExceptionRecord->ExceptionCode;
|
|
|
|
if (ExceptionCode != STATUS_IN_PAGE_ERROR)
|
|
{
|
|
DbgPrint(
|
|
"%s: .exr %p\n%s: .cxr %p\n",
|
|
Function,
|
|
ExceptionPointers->ExceptionRecord,
|
|
Function,
|
|
ExceptionPointers->ContextRecord
|
|
);
|
|
|
|
ASSERTGDI(ExceptionCode == STATUS_IN_PAGE_ERROR,
|
|
"bmfd!bBmfdLoadFontFile, strange exception code\n");
|
|
}
|
|
#endif
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
}
|
|
|
|
HFF
|
|
BmfdLoadFontFileTE (
|
|
ULONG cFiles,
|
|
HFF *piFile,
|
|
PVOID *ppvView,
|
|
ULONG *pcjView,
|
|
DESIGNVECTOR *pdv,
|
|
ULONG ulLangId,
|
|
ULONG ulFastCheckSum
|
|
)
|
|
{
|
|
HFF hff = (HFF) NULL;
|
|
HFF iFile;
|
|
PVOID pvView;
|
|
ULONG cjView;
|
|
BOOL bRet;
|
|
|
|
DONTUSE(ulLangId); // avoid W4 level compiler warning
|
|
DONTUSE(ulFastCheckSum); // avoid W4 level compiler warning
|
|
|
|
if ((cFiles != 1) || pdv)
|
|
return hff;
|
|
|
|
iFile = *piFile;
|
|
pvView = *ppvView;
|
|
cjView = *pcjView;
|
|
|
|
#ifndef BMFD_NO_TRY_EXCEPT
|
|
try
|
|
{
|
|
#endif
|
|
|
|
// try loading it as an fon file, if it does not work, try as
|
|
// fnt file
|
|
|
|
if (!(bRet = bBmfdLoadFont(iFile, pvView, cjView,TYPE_DLL16, &hff)))
|
|
{
|
|
// try as an *.fnt file
|
|
|
|
bRet = bBmfdLoadFont(iFile, pvView, cjView,TYPE_FNT,&hff);
|
|
}
|
|
|
|
//
|
|
// if this did not work try to load it as a 32 bit dll
|
|
//
|
|
|
|
if (!bRet)
|
|
{
|
|
bRet = bLoadNtFon(iFile,pvView,&hff);
|
|
}
|
|
|
|
if (!bRet)
|
|
{
|
|
ASSERTGDI(hff == (HFF)NULL, "BMFD!bBmfdLoadFontFile, hff\n");
|
|
}
|
|
#ifndef BMFD_NO_TRY_EXCEPT
|
|
}
|
|
except (ExceptionFilter_BmfdLoadFontFile(GetExceptionInformation()))
|
|
{
|
|
WARNING("bmfd, exception in BmfdLoadFontFile\n");
|
|
|
|
// if the file disappeared after mem was allocated, free the mem
|
|
|
|
if (hff)
|
|
{
|
|
VFREEMEM(hff);
|
|
}
|
|
|
|
hff = (HFF)NULL;
|
|
}
|
|
#endif
|
|
|
|
return hff;
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
*
|
|
* BmfdUnloadFontFileTE (
|
|
*
|
|
* History:
|
|
* 07-Apr-1993 -by- Bodin Dresevic [BodinD]
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
|
|
|
|
|
|
BOOL
|
|
BmfdUnloadFontFileTE (
|
|
HFF hff
|
|
)
|
|
{
|
|
BOOL bRet;
|
|
|
|
#ifndef BMFD_NO_TRY_EXCEPT
|
|
try
|
|
{
|
|
#endif
|
|
bRet = BmfdUnloadFontFile(hff);
|
|
#ifndef BMFD_NO_TRY_EXCEPT
|
|
}
|
|
except (EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
WARNING("bmfd, exception in BmfdUnloadFontFile\n");
|
|
bRet = FALSE;
|
|
}
|
|
#endif
|
|
return bRet;
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
*
|
|
* BOOL BmfdQueryAdvanceWidthsTE
|
|
*
|
|
* Effects:
|
|
*
|
|
* Warnings:
|
|
*
|
|
* History:
|
|
* 07-Apr-1993 -by- Bodin Dresevic [BodinD]
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
BOOL BmfdQueryAdvanceWidthsTE
|
|
(
|
|
DHPDEV dhpdev,
|
|
FONTOBJ *pfo,
|
|
ULONG iMode,
|
|
HGLYPH *phg,
|
|
LONG *plWidths,
|
|
ULONG cGlyphs
|
|
)
|
|
{
|
|
BOOL bRet = FD_ERROR; // tri bool according to chuckwh
|
|
DONTUSE(dhpdev);
|
|
|
|
if (bBmfdMapFontFileFD((FONTFILE *)pfo->iFile))
|
|
{
|
|
#ifndef BMFD_NO_TRY_EXCEPT
|
|
try
|
|
{
|
|
#endif
|
|
bRet = BmfdQueryAdvanceWidths(pfo,iMode,phg,plWidths,cGlyphs);
|
|
#ifndef BMFD_NO_TRY_EXCEPT
|
|
}
|
|
except (EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
WARNING("bmfd, exception in BmfdQueryAdvanceWidths\n");
|
|
vBmfdMarkFontGone((FONTFILE *)pfo->iFile, GetExceptionCode());
|
|
}
|
|
#endif
|
|
|
|
EngUnmapFontFileFD(PFF(pfo->iFile)->iFile);
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* DHPDEV DrvEnablePDEV
|
|
*
|
|
* Initializes a bunch of fields for GDI
|
|
*
|
|
\**************************************************************************/
|
|
|
|
DHPDEV
|
|
BmfdEnablePDEV(
|
|
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), 'dfmB');
|
|
|
|
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
|
|
BmfdDisablePDEV(
|
|
DHPDEV dhpdev)
|
|
{
|
|
EngFreeMem(dhpdev);
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
* VOID DrvCompletePDEV
|
|
*
|
|
* Store the HPDEV, the engines handle for this PDEV, in the DHPDEV.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID
|
|
BmfdCompletePDEV(
|
|
DHPDEV dhpdev,
|
|
HDEV hdev)
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
// The driver function table with all function index/address pairs
|
|
|
|
DRVFN gadrvfnBMFD[] =
|
|
{
|
|
{ INDEX_DrvEnablePDEV, (PFN) BmfdEnablePDEV, },
|
|
{ INDEX_DrvDisablePDEV, (PFN) BmfdDisablePDEV, },
|
|
{ INDEX_DrvCompletePDEV, (PFN) BmfdCompletePDEV, },
|
|
{ INDEX_DrvQueryFont, (PFN) BmfdQueryFont, },
|
|
{ INDEX_DrvQueryFontTree, (PFN) BmfdQueryFontTree, },
|
|
{ INDEX_DrvQueryFontData, (PFN) BmfdQueryFontDataTE, },
|
|
{ INDEX_DrvDestroyFont, (PFN) BmfdDestroyFont, },
|
|
{ INDEX_DrvQueryFontCaps, (PFN) BmfdQueryFontCaps, },
|
|
{ INDEX_DrvLoadFontFile, (PFN) BmfdLoadFontFileTE, },
|
|
{ INDEX_DrvUnloadFontFile, (PFN) BmfdUnloadFontFileTE, },
|
|
{ INDEX_DrvQueryFontFile, (PFN) BmfdQueryFontFile, },
|
|
{ INDEX_DrvQueryAdvanceWidths, (PFN) BmfdQueryAdvanceWidthsTE }
|
|
};
|
|
|
|
/******************************Public*Routine******************************\
|
|
* BmfdEnableDriver
|
|
*
|
|
* 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 BmfdEnableDriver(
|
|
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 ((ghsemBMFD = EngCreateSemaphore()) == (HSEMAPHORE) 0)
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
pded->pdrvfn = gadrvfnBMFD;
|
|
pded->c = sizeof(gadrvfnBMFD) / sizeof(DRVFN);
|
|
pded->iDriverVersion = DDI_DRIVER_VERSION_NT5;
|
|
return(TRUE);
|
|
}
|