Leaked source code of windows server 2003
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

/******************************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);
}