2025-04-27 07:49:33 -04:00

483 lines
21 KiB
C

/*++
Copyright (c) 1996-1997 Microsoft Corporation
Module Name:
dumpufm.c
Abstract:
UFM dump tool
Environment:
Windows NT PostScript driver
Revision History:
12/20/96 -eigos-
Created it.
--*/
#include "precomp.h"
//
// Macros
//
#define FILENAME_SIZE 256
//
// Globals
//
BYTE gcstrError1[] = "Usage: dumpufm *.ufm\n";
BYTE gcstrError2[] = "Cannot open file \"%ws\".\n";
BYTE *gcstrflInfo[] = {"FM_INFO_TECH_TRUETYPE",
"FM_INFO_TECH_BITMAP",
"FM_INFO_TECH_STROKE",
"FM_INFO_TECH_OUTLINE_NOT_TRUETYPE",
"FM_INFO_ARB_XFORMS",
"FM_INFO_1BPP",
"FM_INFO_4BPP",
"FM_INFO_8BPP",
"FM_INFO_16BPP",
"FM_INFO_24BPP",
"FM_INFO_32BPP",
"FM_INFO_INTEGER_WIDTH",
"FM_INFO_CONSTANT_WIDTH",
"FM_INFO_NOT_CONTIGUOUS",
"FM_INFO_TECH_MM",
"FM_INFO_RETURNS_OUTLINES",
"FM_INFO_RETURNS_STROKES",
"FM_INFO_RETURNS_BITMAPS",
"FM_INFO_UNICODE_COMPLIANT",
"FM_INFO_RIGHT_HANDED",
"FM_INFO_INTEGRAL_SCALING",
"FM_INFO_90DEGREE_ROTATIONS",
"FM_INFO_OPTICALLY_FIXED_PITCH",
"FM_INFO_DO_NOT_ENUMERATE",
"FM_INFO_ISOTROPIC_SCALING_ONLY",
"FM_INFO_ANISOTROPIC_SCALING_ONLY",
"FM_INFO_MM_INSTANCE",
"FM_INFO_FAMILY_EQUIV",
"FM_INFO_DBCS_FIXED_PITCH",
"FM_INFO_NONNEGATIVE_AC",
"FM_INFO_IGNORE_TC_RA_ABLE",
"FM_INFO_TECH_TYPE1"};
//
// Internal prototype
//
BOOL BDumpUFM(IN PUNIFM_HDR);
int __cdecl
main(
IN int argc,
IN char **argv)
/*++
Routine Description:
main
Arguments:
argc - Number of parameters in the following
argv - The parameters, starting with our name
Return Value:
Return error code
Note:
--*/
{
HFILEMAP hUFMData;
DWORD dwUFMSize;
WORD wSize;
WCHAR awchFile[FILENAME_SIZE];
PUNIFM_HDR pUFM;
//RIP(("Start dumpufm.exe\n"));
if (argc != 2)
{
fprintf( stderr, gcstrError1);
return -1;
}
argv++;
MultiByteToWideChar(CP_ACP,
0,
*argv,
strlen(*argv)+1,
awchFile,
FILENAME_SIZE);
hUFMData = MapFileIntoMemory( awchFile,
(PVOID)&pUFM,
&dwUFMSize );
if (!hUFMData)
{
fprintf( stderr, gcstrError2, *argv);
return -2;
}
printf(" File = %ws\n", awchFile);
BDumpUFM(pUFM);
UnmapFileFromMemory(hUFMData);
return 0;
}
BOOL
BDumpUFM(
IN PUNIFM_HDR pUFM)
{
PUNIDRVINFO pUnidrvInfo;
PIFIMETRICS pIFI;
PIFIEXTRA pIFIExtra;
FONTSIM *pFontSim;
FONTDIFF *pFontDiff;
EXTTEXTMETRIC *pExtTextMetric;
PWIDTHTABLE pWidthTable;
PKERNDATA pKerningData;
FD_KERNINGPAIR *pKernPair;
PANOSE *ppan;
PTRDIFF dpTmp;
PWSTR pwszFamilyName;
PWSTR pwszStyleName;
PWSTR pwszFaceName;
PWSTR pwszUniqueName;
DWORD dwI, dwJ;
PSHORT psWidth;
PCHAR pCommand;
BYTE ubCommand[256];
pUnidrvInfo = (PUNIDRVINFO) ((PBYTE)pUFM + pUFM->loUnidrvInfo);
pIFI = (PIFIMETRICS) ((PBYTE)pUFM + pUFM->loIFIMetrics);
if (pIFI->cjIfiExtra)
pIFIExtra = (PIFIEXTRA) (pIFI + 1);
else
pIFIExtra = (PIFIEXTRA) NULL;
if (pIFI->dpFontSim)
pFontSim = (FONTSIM*) ((PBYTE)pIFI + pIFI->dpFontSim);
else
pFontSim = (FONTSIM*) NULL;
if (pUFM->loExtTextMetric)
pExtTextMetric = (EXTTEXTMETRIC*) ((PBYTE)pUFM + pUFM->loExtTextMetric);
else
pExtTextMetric = NULL;
pWidthTable = (PWIDTHTABLE) ((PBYTE)pUFM + pUFM->loWidthTable);
pKerningData = (PKERNDATA) ((PBYTE)pUFM + pUFM->loKernPair);
ppan = &pIFI->panose;
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf(" Universal Printer Driver Font Metrics Data (UFM)\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("UNIFM_HDR.dwSize = %d\n", pUFM->dwSize);
printf("UNIFM_HDR.dwVersion = %d.%d\n", pUFM->dwVersion >> 16,
pUFM->dwVersion & 0xFFFF);
printf("UNIFM_HDR.ulDefaultCodepage = %d\n", pUFM->ulDefaultCodepage);
printf("UNIFM_HDR.lGlyphSetDataRCID = %d\n", pUFM->lGlyphSetDataRCID);
printf("UNIFM_HDR.loUnidrvInfo = 0x%x\n", pUFM->loUnidrvInfo);
printf("UNIFM_HDR.loIFIMetrics = 0x%x\n", pUFM->loIFIMetrics);
printf("UNIFM_HDR.loExtTextMetric = 0x%x\n", pUFM->loExtTextMetric);
printf("UNIFM_HDR.loWidthTable = 0x%x\n", pUFM->loWidthTable);
printf("UNIFM_HDR.loKernPair = 0x%x\n", pUFM->loKernPair);
printf("\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("UNIDRVINFO\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("UNIDRVINFO.dwSize = %d\n", pUnidrvInfo->dwSize);
printf("UNIDRVINFO.flGenFlags = %d\n", pUnidrvInfo->flGenFlags);
printf("UNIDRVINFO.wType = %d\n", pUnidrvInfo->wType);
printf("UNIDRVINFO.fCaps = %d\n", pUnidrvInfo->fCaps);
printf("UNIDRVINFO.wXRes = %d\n", pUnidrvInfo->wXRes);
printf("UNIDRVINFO.wYRes = %d\n", pUnidrvInfo->wYRes);
printf("UNIDRVINFO.sYAdjust = %d\n", pUnidrvInfo->sYAdjust);
printf("UNIDRVINFO.sYMoved = %d\n", pUnidrvInfo->sYMoved);
printf("UNIDRVINFO.wPrivateData = %d\n", pUnidrvInfo->wPrivateData);
if (pUnidrvInfo->SelectFont.dwCount && pUnidrvInfo->SelectFont.loOffset)
{
pCommand = (PCHAR)pUnidrvInfo + pUnidrvInfo->SelectFont.loOffset;
printf("UNIDRVINFO.SelectFont = ");
for (dwI = 0; dwI < pUnidrvInfo->SelectFont.dwCount; dwI ++, pCommand++)
{
if (*pCommand < 0x20 || 0x7e < *pCommand )
{
printf("\\x%X",*pCommand);
}
else
{
printf("%c",*pCommand);
}
}
}
if (pUnidrvInfo->UnSelectFont.dwCount && pUnidrvInfo->UnSelectFont.loOffset)
{
pCommand = (PCHAR)pUnidrvInfo + pUnidrvInfo->UnSelectFont.loOffset;
printf("\nUNIDRVINFO.UnSelectFont = ");
for (dwI = 0; dwI < pUnidrvInfo->UnSelectFont.dwCount; dwI ++, pCommand++)
{
if (*pCommand < 0x32 || 0x7e < *pCommand )
{
printf("\\x%X",*pCommand);
}
else
{
printf("%c",*pCommand);
}
}
}
printf("\n");
pwszFamilyName = (PWSTR)(((BYTE*) pIFI) + pIFI->dpwszFamilyName);
pwszStyleName = (PWSTR)(((BYTE*) pIFI) + pIFI->dpwszStyleName) ;
pwszFaceName = (PWSTR)(((BYTE*) pIFI) + pIFI->dpwszFaceName) ;
pwszUniqueName = (PWSTR)(((BYTE*) pIFI) + pIFI->dpwszUniqueName);
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("IFIMETRICS\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("IFIMETIRCS.cjThis = %-#8lx\n" , pIFI->cjThis );
printf("IFIMETIRCS.cjIfiExtra = %-#8lx\n" , pIFI->cjIfiExtra);
printf("IFIMETIRCS.pwszFamilyName = \"%ws\"\n", pwszFamilyName );
printf(" = %02x%02x%02x%02x%02x\n", *(PWCHAR)pwszFamilyName,*((PWCHAR)pwszFamilyName+1),*((PWCHAR)pwszFamilyName+2),*((PWCHAR)pwszFamilyName+3),*((PWCHAR)pwszFamilyName+4));
if( pIFI->flInfo & FM_INFO_FAMILY_EQUIV )
{
while( *(pwszFamilyName += wcslen( pwszFamilyName ) + 1) )
printf(" \"%ws\"\n", pwszFamilyName );
}
printf("IFIMETRICS.pwszStyleName = \"%ws\"\n", pwszStyleName );
printf("IFIMETRICS.pwszFaceName = \"%ws\"\n", pwszFaceName );
printf("IFIMETRICS.pwszUniqueName = \"%ws\"\n", pwszUniqueName );
printf("IFIMETRICS.dpFontSim = %-#8lx\n" , pIFI->dpFontSim );
printf("IFIMETRICS.lEmbedId = %d\n", pIFI->lEmbedId );
printf("IFIMETRICS.lItalicAngle = %d\n", pIFI->lItalicAngle);
printf("IFIMETRICS.lCharBias = %d\n", pIFI->lCharBias );
printf("IFIMETRICS.dpCharSets = %d\n", pIFI->dpCharSets );
printf("IFIMETRICS.jWinCharSet = %04x\n" , pIFI->jWinCharSet );
printf("IFIMETRICS.jWinPitchAndFamily = %04x\n" , pIFI->jWinPitchAndFamily );
printf("IFIMETRICS.usWinWeight = %d\n" , pIFI->usWinWeight );
printf("IFIMETRICS.flInfo = %-#8lx\n" , pIFI->flInfo );
for( dwI = 0; dwI < 32; dwI ++ )
{
if (pIFI->flInfo & (0x00000001 << dwI))
{
printf(" %s\n", gcstrflInfo[dwI]);
}
}
printf("IFIMETRICS.fsSelection = %-#6lx\n" , pIFI->fsSelection );
printf("IFIMETRICS.fsType = %-#6lx\n" , pIFI->fsType );
printf("IFIMETRICS.fwdUnitsPerEm = %d\n" , pIFI->fwdUnitsPerEm );
printf("IFIMETRICS.fwdLowestPPEm = %d\n" , pIFI->fwdLowestPPEm );
printf("IFIMETRICS.fwdWinAscender = %d\n" , pIFI->fwdWinAscender );
printf("IFIMETRICS.fwdWinDescender = %d\n" , pIFI->fwdWinDescender );
printf("IFIMETRICS.fwdMacAscender = %d\n" , pIFI->fwdMacAscender );
printf("IFIMETRICS.fwdMacDescender = %d\n" , pIFI->fwdMacDescender );
printf("IFIMETRICS.fwdMacLineGap = %d\n" , pIFI->fwdMacLineGap );
printf("IFIMETRICS.fwdTypoAscender = %d\n" , pIFI->fwdTypoAscender );
printf("IFIMETRICS.fwdTypoDescender = %d\n" , pIFI->fwdTypoDescender );
printf("IFIMETRICS.fwdTypoLineGap = %d\n" , pIFI->fwdTypoLineGap );
printf("IFIMETRICS.fwdAveCharWidth = %d\n" , pIFI->fwdAveCharWidth );
printf("IFIMETRICS.fwdMaxCharInc = %d\n" , pIFI->fwdMaxCharInc );
printf("IFIMETRICS.fwdCapHeight = %d\n" , pIFI->fwdCapHeight );
printf("IFIMETRICS.fwdXHeight = %d\n" , pIFI->fwdXHeight );
printf("IFIMETRICS.fwdSubscriptXSize = %d\n" , pIFI->fwdSubscriptXSize );
printf("IFIMETRICS.fwdSubscriptYSize = %d\n" , pIFI->fwdSubscriptYSize );
printf("IFIMETRICS.fwdSubscriptXOffset = %d\n" , pIFI->fwdSubscriptXOffset );
printf("IFIMETRICS.fwdSubscriptYOffset = %d\n" , pIFI->fwdSubscriptYOffset );
printf("IFIMETRICS.fwdSuperscriptXSize = %d\n" , pIFI->fwdSuperscriptXSize );
printf("IFIMETRICS.fwdSuperscriptYSize = %d\n" , pIFI->fwdSuperscriptYSize );
printf("IFIMETRICS.fwdSuperscriptXOffset= %d\n" , pIFI->fwdSuperscriptXOffset);
printf("IFIMETRICS.fwdSuperscriptYOffset= %d\n" , pIFI->fwdSuperscriptYOffset);
printf("IFIMETRICS.fwdUnderscoreSize = %d\n" , pIFI->fwdUnderscoreSize );
printf("IFIMETRICS.fwdUnderscorePosition= %d\n" , pIFI->fwdUnderscorePosition);
printf("IFIMETRICS.fwdStrikeoutSize = %d\n" , pIFI->fwdStrikeoutSize );
printf("IFIMETRICS.fwdStrikeoutPosition = %d\n" , pIFI->fwdStrikeoutPosition );
printf("IFIMETRICS.chFirstChar = %-#4x\n" , (int) (BYTE) pIFI->chFirstChar );
printf("IFIMETRICS.chLastChar = %-#4x\n" , (int) (BYTE) pIFI->chLastChar );
printf("IFIMETRICS.chDefaultChar = %-#4x\n" , (int) (BYTE) pIFI->chDefaultChar );
printf("IFIMETRICS.chBreakChar = %-#4x\n" , (int) (BYTE) pIFI->chBreakChar );
printf("IFIMETRICS.wcFirsChar = %-#6x\n" , pIFI->wcFirstChar );
printf("IFIMETRICS.wcLastChar = %-#6x\n" , pIFI->wcLastChar );
printf("IFIMETRICS.wcDefaultChar = %-#6x\n" , pIFI->wcDefaultChar );
printf("IFIMETRICS.wcBreakChar = %-#6x\n" , pIFI->wcBreakChar );
printf("IFIMETRICS.ptlBaseline = {%d,%d}\n" , pIFI->ptlBaseline.x,
pIFI->ptlBaseline.y);
printf("IFIMETRICS.ptlAspect = {%d,%d}\n" , pIFI->ptlAspect.x,
pIFI->ptlAspect.y );
printf("IFIMETRICS.ptlCaret = {%d,%d}\n" , pIFI->ptlCaret.x,
pIFI->ptlCaret.y );
printf("IFIMETRICS.rclFontBox = {%d,%d,%d,%d}\n",pIFI->rclFontBox.left,
pIFI->rclFontBox.top,
pIFI->rclFontBox.right,
pIFI->rclFontBox.bottom );
printf("IFIMETRICS.achVendId = \"%c%c%c%c\"\n",pIFI->achVendId[0],
pIFI->achVendId[1],
pIFI->achVendId[2],
pIFI->achVendId[3] );
printf("IFIMETRICS.cKerningPairs = %d\n" , pIFI->cKerningPairs );
printf("IFIMETRICS.ulPanoseCulture = %-#8lx\n" , pIFI->ulPanoseCulture);
printf(
"IFIMETRICS.panose = {%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x}\n"
, ppan->bFamilyType
, ppan->bSerifStyle
, ppan->bWeight
, ppan->bProportion
, ppan->bContrast
, ppan->bStrokeVariation
, ppan->bArmStyle
, ppan->bLetterform
, ppan->bMidline
, ppan->bXHeight);
printf("\n");
if (pIFIExtra)
{
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("IFIEXTRA\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("IFIEXTRA.ulIdentifier = %d\n", pIFIExtra->ulIdentifier);
printf("IFIEXTRA.dpFontSig = %d\n", pIFIExtra->dpFontSig);
printf("IFIEXTRA.cig = %d\n", pIFIExtra->cig);
printf("IFIEXTRA.dpDesignVector = %d\n", pIFIExtra->dpDesignVector);
printf("IFIEXTRA.dpAxesInfoW = %d\n", pIFIExtra->dpAxesInfoW);
printf("\n");
}
if (pFontSim)
{
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("FONTSIM\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("FONTSIM.dpBold = %d\n", pFontSim->dpBold);
printf("FONTSIM.dpItalic = %d\n", pFontSim->dpItalic);
printf("FONTSIM.dpBoldItalic = %d\n", pFontSim->dpBoldItalic);
for (dwI = 0; dwI < 3; dwI ++)
{
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
switch(dwI)
{
case 0:
printf("dpBold\n");
dpTmp = pFontSim->dpBold;
break;
case 1:
printf("dpItalic\n");
dpTmp = pFontSim->dpItalic;
break;
case 2:
printf("dpBoldItalic\n");
dpTmp = pFontSim->dpBoldItalic;
break;
}
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
if (dpTmp)
{
pFontDiff = (FONTDIFF*)((PBYTE)pFontSim + dpTmp);
printf("FONTDIFF.bWeight = %d\n",pFontDiff->bWeight);
printf("FONTDIFF.usWinWeight = %d\n",pFontDiff->usWinWeight);
printf("FONTDIFF.fsSelection = %d\n",pFontDiff->fsSelection);
printf("FONTDIFF.fwdAveCharWidth = %d\n",pFontDiff->fwdAveCharWidth);
printf("FONTDIFF.fwdMaxCharInc = %d\n",pFontDiff->fwdMaxCharInc);
printf("FONTDIFF.ptlCaret = %d\n",pFontDiff->ptlCaret);
}
}
printf("\n");
}
if (pExtTextMetric)
{
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("EXTTEXTMETRIC\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("EXTTEXTMETRIC.emSize = %d\n",pExtTextMetric->emSize);
printf("EXTTEXTMETRIC.emPointSize = %d\n",pExtTextMetric->emPointSize);
printf("EXTTEXTMETRIC.emOrientation = %d\n",pExtTextMetric->emOrientation);
printf("EXTTEXTMETRIC.emMinScale = %d\n",pExtTextMetric->emMinScale);
printf("EXTTEXTMETRIC.emMaxScale = %d\n",pExtTextMetric->emMaxScale);
printf("EXTTEXTMETRIC.emMasterUnits = %d\n",pExtTextMetric->emMasterUnits);
printf("EXTTEXTMETRIC.emCapHeight = %d\n",pExtTextMetric->emCapHeight);
printf("EXTTEXTMETRIC.emXHeight = %d\n",pExtTextMetric->emXHeight);
printf("EXTTEXTMETRIC.emLowerCaseAscent = %d\n",pExtTextMetric->emLowerCaseAscent);
printf("EXTTEXTMETRIC.emLowerCaseDescent = %d\n",pExtTextMetric->emLowerCaseDescent);
printf("EXTTEXTMETRIC.emSlant = %d\n",pExtTextMetric->emSlant);
printf("EXTTEXTMETRIC.emSuperScript = %d\n",pExtTextMetric->emSuperScript);
printf("EXTTEXTMETRIC.emSubScript = %d\n",pExtTextMetric->emSubScript);
printf("EXTTEXTMETRIC.emSuperScriptSize = %d\n",pExtTextMetric->emSuperScriptSize);
printf("EXTTEXTMETRIC.emSubScriptSize = %d\n",pExtTextMetric->emSubScriptSize);
printf("EXTTEXTMETRIC.emUnderlineOffset = %d\n",pExtTextMetric->emUnderlineOffset);
printf("EXTTEXTMETRIC.emUnderlineWidth = %d\n",pExtTextMetric->emUnderlineWidth);
printf("EXTTEXTMETRIC.emDoubleUpperUnderlineOffset = %d\n",pExtTextMetric->emDoubleUpperUnderlineOffset);
printf("EXTTEXTMETRIC.emDoubleLowerUnderlineOffset = %d\n",pExtTextMetric->emDoubleLowerUnderlineOffset);
printf("EXTTEXTMETRIC.emDoubleUpperUnderlineWidth = %d\n",pExtTextMetric->emDoubleUpperUnderlineWidth);
printf("EXTTEXTMETRIC.emDoubleLowerUnderlineWidth = %d\n",pExtTextMetric->emDoubleLowerUnderlineWidth);
printf("EXTTEXTMETRIC.emStrikeOutOffset = %d\n",pExtTextMetric->emStrikeOutOffset);
printf("EXTTEXTMETRIC.emStrikeOutWidth = %d\n",pExtTextMetric->emStrikeOutWidth);
printf("EXTTEXTMETRIC.emKernPairs = %d\n",pExtTextMetric->emKernPairs);
printf("EXTTEXTMETRIC.emKernTracks = %d\n",pExtTextMetric->emKernTracks);
}
if (pUFM->loWidthTable)
{
printf("\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("WIDTHTABLE\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("WIDTHTABLE.dwSize = %d\n", pWidthTable->dwSize);
printf("WIDTHTABLE.dwRunNum = %d\n", pWidthTable->dwRunNum);
for (dwI = 0; dwI < pWidthTable->dwRunNum; dwI ++)
{
printf("WidthRun[%d].wStartGlyph = %x\n",
dwI+1, pWidthTable->WidthRun[dwI].wStartGlyph);
printf("WidthRun[%d].wGlyphCount = %d\n",
dwI+1, pWidthTable->WidthRun[dwI].wGlyphCount);
psWidth = (PSHORT)((PBYTE)pWidthTable +
pWidthTable->WidthRun[dwI].loCharWidthOffset);
for (dwJ = 0; dwJ < pWidthTable->WidthRun[dwI].wGlyphCount; dwJ ++, psWidth++)
{
printf("Width[%d] = %d\n", dwJ, *psWidth);
}
}
}
if (pUFM->loKernPair)
{
printf("\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("KERNDATA\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("KERNDATA.dwSize = %d\n", pKerningData->dwSize);
pKernPair = pKerningData->KernPair;
for (dwI = 0; dwI < pKerningData->dwKernPairNum; dwI++, pKernPair++)
{
printf("KERNDATA.KernPair[%d].wcFirst = %x\n", dwI+1, pKernPair->wcFirst);
printf("KERNDATA.KernPair[%d].wcSecond = %x\n", dwI+1, pKernPair->wcSecond);
printf("KERNDATA.KernPair[%d].fwdKern = %d\n", dwI+1, pKernPair->fwdKern);
}
}
return TRUE;
}