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.
190 lines
5.0 KiB
190 lines
5.0 KiB
/******************************Module*Header*******************************\
|
|
* Module Name: fon32.c
|
|
*
|
|
* support for 32 bit fon files
|
|
*
|
|
* Created: 03-Mar-1992 15:48:53
|
|
* Author: Bodin Dresevic [BodinD]
|
|
*
|
|
* Copyright (c) 1990 Microsoft Corporation
|
|
*
|
|
\**************************************************************************/
|
|
|
|
#include "fd.h"
|
|
|
|
/******************************Public*Routine******************************\
|
|
* bLoadntFon()
|
|
*
|
|
* History:
|
|
* 07-Jul-1995 -by- Gerrit van Wingerden [gerritv]
|
|
* Rewrote for kernel mode.
|
|
* 02-Mar-1992 -by- Bodin Dresevic [BodinD]
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
BOOL
|
|
bLoadNtFon(
|
|
HFF iFile,
|
|
PVOID pvView,
|
|
HFF *phff
|
|
)
|
|
{
|
|
PFONTFILE pff;
|
|
IFIMETRICS* pifi;
|
|
INT cFonts,i;
|
|
BOOL bRet = FALSE;
|
|
PVOID *ppvBases = NULL;
|
|
ULONG cjIFI,cVerified;
|
|
ULONG dpIFI;
|
|
ULONG dpszFileName;
|
|
ULONG cjff;
|
|
#ifdef FE_SB
|
|
ULONG cVerticalFaces = 0;
|
|
USHORT CharSet;
|
|
#endif
|
|
PBYTE pjViewBase;
|
|
SIZE_T cjViewSize;
|
|
|
|
// first find the number of font resource in the executeable
|
|
|
|
cFonts = cParseFontResources( (HANDLE) iFile, &ppvBases );
|
|
|
|
if (cFonts == 0)
|
|
{
|
|
return bRet;
|
|
}
|
|
cVerified = cjIFI = 0;
|
|
|
|
// next loop through all the FNT resources to get the size of each fonts
|
|
// IFIMETRICS
|
|
|
|
pjViewBase = (PBYTE)((PFONTFILEVIEW)iFile)->fv.pvViewFD;
|
|
cjViewSize = ((PFONTFILEVIEW)iFile)->fv.cjView;
|
|
|
|
for( i = 0; i < cFonts; i++ )
|
|
{
|
|
RES_ELEM re;
|
|
ULONG cjBMFDIFIMETRICS;
|
|
|
|
re.pvResData = ppvBases[i];
|
|
re.cjResData = ulMakeULONG((PBYTE) ppvBases[i] + OFF_Size );
|
|
re.pjFaceName = NULL;
|
|
|
|
if( !bVerifyFNTQuick( &re ) )
|
|
{
|
|
goto exit_freemem;
|
|
}
|
|
|
|
if (!bBMFDIFIMETRICS(pjViewBase, cjViewSize, NULL, &re, &cjBMFDIFIMETRICS))
|
|
{
|
|
goto exit_freemem;
|
|
}
|
|
|
|
cVerified += 1;
|
|
cjIFI += cjBMFDIFIMETRICS;
|
|
}
|
|
|
|
*phff = (HFF)NULL;
|
|
|
|
#ifdef FE_SB
|
|
// extra space for possible vertical face
|
|
cjIFI *= 2;
|
|
dpIFI = offsetof(FONTFILE,afai[0]) + cVerified * 2 * sizeof(FACEINFO);
|
|
#else
|
|
dpIFI = offsetof(FONTFILE,afai[0]) + cVerified * sizeof(FACEINFO);
|
|
#endif
|
|
dpszFileName = dpIFI + cjIFI;
|
|
cjff = dpszFileName;
|
|
|
|
if ((*phff = hffAlloc(cjff)) == (HFF)NULL)
|
|
{
|
|
SAVE_ERROR_CODE(ERROR_NOT_ENOUGH_MEMORY);
|
|
RETURN("BMFD! bLoadDll32: memory allocation error\n", FALSE);
|
|
}
|
|
pff = PFF(*phff);
|
|
|
|
// init fields of pff structure
|
|
|
|
pff->ident = ID_FONTFILE;
|
|
pff->fl = 0;
|
|
pff->iType = TYPE_DLL32;
|
|
pff->cFntRes = cVerified;
|
|
pff->iFile = iFile;
|
|
|
|
//!!! we could do better here, we could try to get a description string from
|
|
//!!! the version stamp of the file, if there is one, if not we can still use
|
|
//!!! this default mechanism [bodind]
|
|
|
|
pff->dpwszDescription = 0; // no description string, use Facename later
|
|
pff->cjDescription = 0;
|
|
|
|
// finally convert all the resources
|
|
|
|
pifi = (IFIMETRICS*)((PBYTE) pff + dpIFI);
|
|
|
|
|
|
|
|
for( i = 0; i < cFonts; i++ )
|
|
{
|
|
RES_ELEM re;
|
|
re.pvResData = ppvBases[i];
|
|
re.cjResData = ulMakeULONG((PBYTE) ppvBases[i] + OFF_Size );
|
|
re.dpResData = (PTRDIFF)((PBYTE) re.pvResData - (PBYTE) pvView );
|
|
re.pjFaceName = NULL;
|
|
|
|
pff->afai[i].re = re;
|
|
pff->afai[i].pifi = pifi;
|
|
#if FE_SB
|
|
pff->afai[i].bVertical = FALSE;
|
|
#endif
|
|
if( !bConvertFontRes( pjViewBase, cjViewSize, &re, &pff->afai[i] ) )
|
|
{
|
|
goto exit_freemem;
|
|
}
|
|
|
|
pifi = (IFIMETRICS*)((PBYTE)pifi + pff->afai[i].pifi->cjThis);
|
|
|
|
#ifdef FE_SB
|
|
CharSet = pff->afai[i].pifi->jWinCharSet;
|
|
|
|
if( IS_ANY_DBCS_CHARSET(CharSet) )
|
|
{
|
|
re.pvResData = ppvBases[i];
|
|
re.cjResData = ulMakeULONG((PBYTE) ppvBases[i] + OFF_Size );
|
|
re.dpResData = (PTRDIFF)((PBYTE) re.pvResData - (PBYTE) pvView );
|
|
re.pjFaceName = NULL;
|
|
|
|
pff->afai[cFonts+cVerticalFaces].re = re;
|
|
pff->afai[cFonts+cVerticalFaces].pifi = pifi;
|
|
pff->afai[cFonts+cVerticalFaces].bVertical = TRUE;
|
|
|
|
if( !bConvertFontRes( pjViewBase, cjViewSize, &re, &pff->afai[cFonts+cVerticalFaces] ) )
|
|
{
|
|
goto exit_freemem;
|
|
}
|
|
|
|
pifi = (IFIMETRICS*)((PBYTE)pifi + pff->afai[i].pifi->cjThis);
|
|
cVerticalFaces += 1;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#ifdef FE_SB
|
|
pff->cFntRes += cVerticalFaces;
|
|
#endif
|
|
|
|
bRet = TRUE;
|
|
pff->cRef = 0L;
|
|
|
|
exit_freemem:
|
|
|
|
EngFreeMem( (PVOID*) ppvBases );
|
|
|
|
if( !bRet && *phff )
|
|
{
|
|
EngFreeMem( (PVOID) *phff );
|
|
*phff = (HFF)NULL;
|
|
}
|
|
|
|
return(bRet);
|
|
}
|