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

462 lines
12 KiB
C++

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
unifont.c
Abstract:
Dump UNIDRV font module's device data structure
Environment:
Windows NT printer drivers
Revision History:
03/31/97 -eigos-
Created it.
--*/
#include "precomp.hxx"
#include "unidrv2\inc\pdev.h"
#include "winnls.h"
#include "unilib.h"
//
// UNIDRV resource ID
//
#include "unirc.h"
//
// Font resource format
//
#include <prntfont.h>
#include "unidrv2\inc\fmoldrle.h"
//
// GPC and GPD header
//
#include "unidrv2\inc\uni16res.h"
//
// Internal resource data format
//
#include "unidrv2\inc\palette.h"
#include "unidrv2\inc\fontif.h"
#include "unidrv2\font\fmcallbk.h"
#include "unidrv2\font\fmtxtout.h"
#include "unidrv2\font\fontmap.h"
#include "unidrv2\font\fontpdev.h"
#include "unidrv2\font\download.h"
#include "unidrv2\font\posnsort.h"
#include "unidrv2\font\sfinst.h"
#include "unidrv2\font\fmfnprot.h"
#include "unidrv2\font\fmdevice.h"
#include "unidrv2\font\sfttpcl.h"
//
// Misc
//
#include "unidrv2\font\fmmacro.h"
#include "unidrv2\font\fmdebug.h"
//
//
// UNIDRV FONTPDEV
//
//
DEBUG_FLAGS gafdPDEVflFlags[] = {
{ "FDV_ROTATE_FONT_ABLE", FDV_ROTATE_FONT_ABLE},
{ "FDV_ALIGN_BASELINE", FDV_ALIGN_BASELINE},
{ "FDV_TT_FS_ENABLED", FDV_TT_FS_ENABLED},
{ "FDV_DL_INCREMENTAL", FDV_DL_INCREMENTAL},
{ "FDV_TRACK_FONT_MEM", FDV_TRACK_FONT_MEM},
{ "FDV_WHITE_TEXT", FDV_WHITE_TEXT},
{ "FDV_DLTT", FDV_DLTT},
{ "FDV_DLTT_ASTT_PREF", FDV_DLTT_ASTT_PREF},
{ "FDV_DLTT_BITM_PR EF", FDV_DLTT_BITM_PREF},
{ "FDV_DLTT_OEMCALLBACK", FDV_DLTT_OEMCALLBACK},
{ "FDV_MD_SERIAL", FDV_MD_SERIAL},
{ "FDV_GRX_ON_TXT_BAND", FDV_GRX_ON_TXT_BAND},
{ "FDV_GRX_UNDER_TEXT", FDV_GRX_UNDER_TEXT},
{ "FDV_BKSP_OK", FDV_BKSP_OK},
{ "FDV_90DEG_ROTATION", FDV_90DEG_ROTATION},
{ "FDV_ANYDEG_ROTATION", FDV_ANYDEG_ROTATION},
{ "FDV_SUPPORTS_FGCOLOR", FDV_SUPPORTS_FGCOLOR},
{ "FDV_SUBSTITUTE_TT", FDV_SUBSTITUTE_TT},
{ "FDV_SINGLE_BYTE", FDV_SINGLE_BYTE},
{ "FDV_DOUBLE_BYTE", FDV_DOUBLE_BYTE},
{ NULL,0}
};
DEBUG_FLAGS gafdFONTMAPflFlags[] = {
{"FM_SCALABLE", FM_SCALABLE},
{"FM_DEFAULT", FM_DEFAULT},
{"FM_EXTCART", FM_EXTCART},
{"FM_FREE_GLYDATA", FM_FREE_GLYDATA},
{"FM_FONTCMD", FM_FONTCMD},
{"FM_WIDTHRES", FM_WIDTHRES},
{"FM_IFIRES", FM_IFIRES},
{"FM_KERNRES", FM_KERNRES},
{"FM_IFIVER40", FM_IFIVER40},
{"FM_GLYVER40", FM_GLYVER40},
{"FM_FINVOC", FM_FINVOC},
{"FM_SOFTFONT", FM_SOFTFONT},
{"FM_GEN_SFONT", FM_GEN_SFONT},
{"FM_SENT", FM_SENT},
{"FM_TT_BOUND", FM_TT_BOUND},
{"FM_TO_PROP", FM_TO_PROP},
{"FM_EXTERNAL", FM_EXTERNAL},
{ NULL, 0}
};
DEBUG_FLAGS gafdPDEVflText[] = {
{"TC_OP_CHARACTER", TC_OP_CHARACTER},
{"TC_OP_STROKE", TC_OP_STROKE },
{"TC_CP_STROKE", TC_CP_STROKE },
{"TC_CR_90", TC_CR_90 },
{"TC_CR_ANY", TC_CR_ANY },
{"TC_SF_X_YINDEP", TC_SF_X_YINDEP},
{"TC_SA_DOUBLE", TC_SA_DOUBLE},
{"TC_SA_INTEGER", TC_SA_INTEGER},
{"TC_SA_CONTIN", TC_SA_CONTIN},
{"TC_EA_DOUBLE", TC_EA_DOUBLE},
{"TC_IA_ABLE", TC_IA_ABLE},
{"TC_UA_ABLE", TC_UA_ABLE},
{"TC_SO_ABLE", TC_SO_ABLE},
{"TC_RA_ABLE", TC_RA_ABLE},
{"TC_VA_ABLE", TC_VA_ABLE},
{"TC_RESERVED", TC_RESERVED},
{"TC_SCROLLBLT", TC_SCROLLBLT},
{ NULL, 0}
};
DEBUG_FLAGS gafdSTROflAccel[] = {
{ "SO_FLAG_DEFAULT_PLACEMENT", SO_FLAG_DEFAULT_PLACEMENT},
{ "SO_HORIZONTAL", SO_HORIZONTAL},
{ "SO_VERTICAL", SO_VERTICAL},
{ "SO_REVERSED", SO_REVERSED},
{ "SO_ZERO_BEARINGS", SO_ZERO_BEARINGS},
{ "SO_MAXEXT_EQUAL_BM_SIDE", SO_MAXEXT_EQUAL_BM_SIDE},
{ NULL,0}
};
DEBUG_FLAGS gafdFontAttr[] = {
{ "FONTATTR_BOLD", FONTATTR_BOLD},
{ "FONTATTR_ITALIC", FONTATTR_ITALIC},
{ "FONTATTR_UNDERLINE",FONTATTR_UNDERLINE},
{ "FONTATTR_STRIKEOUT",FONTATTR_STRIKEOUT},
{ "FONTATTR_SUBSTFONT",FONTATTR_SUBSTFONT},
{ NULL,0}
};
BOOL
TDebugExt::
bDumpFONTPDev(
PVOID pFontPDev_,
DWORD dwAttr)
{
DEBUG_FLAGS *pfd;
PFONTPDEV pFontPDev = (PFONTPDEV)pFontPDev_;
Print("\nUNIDRV font pdev data (%x):\n", pFontPDev);
if (pFontPDev->dwSignature != FONTPDEV_ID)
{
Print("*** invalid unidrv font device data\n");
return FALSE;
}
DumpHex(pFontPDev, dwSignature);
DumpHex(pFontPDev, dwSize);
DumpHex(pFontPDev, pPDev);
DumpHex(pFontPDev, flFlags);
vDumpFlags(pFontPDev->flFlags, gafdPDEVflFlags);
DumpHex(pFontPDev, flText);
vDumpFlags(pFontPDev->flText, gafdPDEVflText);
DumpInt(pFontPDev, dwFontMem);
DumpInt(pFontPDev, dwFontMemUsed);
DumpInt(pFontPDev, dwSelBits);
DumpInt(pFontPDev, ptTextScale.x);
DumpInt(pFontPDev, ptTextScale.y);
DumpInt(pFontPDev, iUsedSoftFonts);
DumpInt(pFontPDev, iNextSFIndex);
DumpInt(pFontPDev, iFirstSFIndex);
DumpInt(pFontPDev, iLastSFIndex);
DumpInt(pFontPDev, iMaxSoftFonts);
DumpInt(pFontPDev, iDevResFontsCt);
DumpInt(pFontPDev, iSoftFontsCt);
DumpInt(pFontPDev, iCurXFont);
DumpInt(pFontPDev, iWhiteIndex);
DumpInt(pFontPDev, iBlackIndex);
DumpInt(pFontPDev, dwDefaultFont);
DumpInt(pFontPDev, sDefCTT);
DumpHex(pFontPDev, pso);
DumpHex(pFontPDev, pPSHeader);
DumpHex(pFontPDev, pvWhiteTextFirst);
DumpHex(pFontPDev, pvWhiteTextLast);
DumpHex(pFontPDev, pTTFile);
DumpHex(pFontPDev, ptod);
DumpHex(pFontPDev, pFontMap);
DumpHex(pFontPDev, pFMDefault);
DumpHex(pFontPDev, pvDLMap);
DumpRec(pFontPDev, FontList);
DumpRec(pFontPDev, FontCartInfo);
DumpRec(pFontPDev, ctl);
DumpHex(pFontPDev, pIFI);
DumpHex(pFontPDev, hUFFFile);
DumpHex(pFontPDev, pTTFontSubReg);
DumpHex(pFontPDev, pUFObj);
return TRUE;
}
DEBUG_EXT_ENTRY(fpdev, FONTPDEV, bDumpFONTPDev, NULL, FALSE );
//*******************************************************************************
BOOL
TDebugExt::
bDumpFONTMAP(
PVOID pFontMap_,
DWORD dwAttr)
{
PFONTMAP pFontMap = (PFONTMAP)pFontMap_;
WCHAR *pwstrFontType[4] = { L"FMTYPE_DEVICE",
L"FMTYPE_TTBITMAP",
L"FMTYPE_TTOUTLINE",
L"FMTYPE_TTOEM"};
Print("\nFONTMAP(%x):\n", pFontMap);
if (pFontMap->dwSignature != FONTMAP_ID)
{
Print("\nBroken fontmap\n");
return FALSE;
}
DumpInt(pFontMap, dwSize);
DumpInt(pFontMap, dwFontType);
Print(" FontType: %ws\n", pwstrFontType[pFontMap->dwFontType - 1]);
DumpInt(pFontMap, flFlags);
vDumpFlags(pFontMap->flFlags, gafdFONTMAPflFlags);
DumpHex(pFontMap, pIFIMet);
DumpHex(pFontMap, wFirstChar);
DumpHex(pFontMap, wLastChar);
DumpInt(pFontMap, ulDLIndex);
DumpInt(pFontMap, wXRes);
DumpInt(pFontMap, wYRes);
DumpInt(pFontMap, syAdj);
DumpHex(pFontMap, pSubFM);
DumpHex(pFontMap, pfnGlyphOut);
DumpHex(pFontMap, pfnSelectFont);
DumpHex(pFontMap, pfnDeSelectFont);
DumpHex(pFontMap, pfnDownloadFontHeader);
DumpHex(pFontMap, pfnDownloadGlyph);
DumpHex(pFontMap, pfnCheckCondition);
DumpHex(pFontMap, pfnFreePFM);
return TRUE;
}
DEBUG_EXT_ENTRY(fm, FONTMAP, bDumpFONTMAP, NULL, FALSE );
//*******************************************************************************
WCHAR *pwstrDevFontType[] = {
L"DF_TYPE_HPINTELLIFONT",
L"DF_TYPE_TRUETYPE",
L"DF_TYPE_PST1",
L"DF_TYPE_CAPSL",
L"DF_TYPE_OEM1",
L"DF_TYPE_OEM2" };
BOOL
TDebugExt::
bDumpDEVFM(
PVOID pDevFM_,
DWORD dwAttr)
{
PFONTMAP_DEV pDevFM = (PFONTMAP_DEV)pDevFM_;
Print("\nFONTMAP_DEV(%x):\n", pDevFM);
DumpInt(pDevFM, wDevFontType);
Print(" Device Font Type: %ws\n", pwstrDevFontType[pDevFM->wDevFontType]);
DumpInt(pDevFM, dwResID);
DumpInt(pDevFM, sCTTid);
DumpInt(pDevFM, sYAdjust);
DumpInt(pDevFM, sYMoved);
DumpHex(pDevFM, pETM);
DumpInt(pDevFM, fwdFOAveCharWidth);
DumpInt(pDevFM, fwdFOUnitsPerEm);
DumpInt(pDevFM, ulCodepage);
DumpInt(pDevFM, ulCodepageID);
DumpHex(pDevFM, pUCTree);
DumpHex(pDevFM, pUCKernTree);
DumpHex(pDevFM, pvMapTable);
DumpHex(pDevFM, pFontDir);
DumpHex(pDevFM, pfnDevSelFont);
DumpHex(pDevFM, pvNTGlyph);
DumpHex(pDevFM, pvFontRes);
DumpHex(pDevFM, pvPredefGTT);
DumpOffset(pDevFM, W);
DumpOffset(pDevFM, cmdFontSel);
DumpOffset(pDevFM, cmdFontDesel);
return TRUE;
}
DEBUG_EXT_ENTRY(devfm, FONTMAP_DEV, bDumpDEVFM, NULL, FALSE );
//*******************************************************************************
BOOL
TDebugExt::
bDumpTOD(
PVOID pTod_,
DWORD dwAttr)
{
PTO_DATA pTod = (PTO_DATA)pTod_;
Print("\nTO_DATA(%x):\n", pTod);
DumpHex(pTod, pPDev);
DumpHex(pTod, pfm);
DumpHex(pTod, pfo);
DumpHex(pTod, flAccel);
vDumpFlags(pTod->flAccel, gafdSTROflAccel);
DumpHex(pTod, pgp);
DumpHex(pTod, apdlGlyph);
DumpHex(pTod, phGlyph);
DumpHex(pTod, pwt);
DumpHex(pTod, pvColor);
DumpInt(pTod, cGlyphsToPrint);
DumpInt(pTod, dwCurrGlyph);
DumpInt(pTod, iFace);
DumpInt(pTod, iSubstFace);
DumpHex(pTod, dwAttrFlags);
DumpHex(pTod, flFlags);
DumpHex(pTod, ptlFirstGlyph);
return TRUE;
}
DEBUG_EXT_ENTRY(tod, TO_DATA, bDumpTOD, NULL, FALSE );
//*******************************************************************************
BOOL
TDebugExt::
bDumpWT(
PVOID pWT_,
DWORD dwAttr)
{
PWHITETEXT pWT = (PWHITETEXT)pWT_;
Print("\n WHITETEXT(%x):\n", pWT);
DumpHex(pWT, next);
DumpInt(pWT, sCount);
DumpHex(pWT, pvColor);
DumpInt(pWT, iFontId);
DumpHex(pWT, dwAttrFlags);
DumpHex(pWT, flAccel);
vDumpFlags(pWT->flAccel, gafdSTROflAccel);
DumpHex(pWT, pgp);
DumpInt(pWT, iRot);
DumpOffset(pWT, eXScale);
DumpOffset(pWT, eYScale);
DumpRectl(pWT, rcClipRgn);
return TRUE;
}
DEBUG_EXT_ENTRY(wt, WHITETEXT, bDumpWT, NULL, FALSE );
//*******************************************************************************
DEBUG_FLAGS gafdUFOdwFlags[] = {
{"UFOFLAG_TTFONT",UFOFLAG_TTFONT},
{"UFOFLAG_TTDOWNLOAD_BITMAP",UFOFLAG_TTDOWNLOAD_BITMAP},
{"UFOFLAG_TTDOWNLOAD_TTOUTLINE",UFOFLAG_TTDOWNLOAD_TTOUTLINE},
{ NULL, 0}
};
BOOL
TDebugExt::
bDumpUFO(
PVOID pUFObj_,
DWORD dwAttr)
{
PI_UNIFONTOBJ pUFObj = (PI_UNIFONTOBJ)pUFObj_;
Print("\nUNIFONTOBJ (%x):\n", pUFObj);
DumpInt(pUFObj, ulFontID);
DumpHex(pUFObj, dwFlags);
vDumpFlags(pUFObj->dwFlags, gafdUFOdwFlags);
DumpHex(pUFObj, pIFIMetrics);
DumpHex(pUFObj, pfnGetInfo);
DumpHex(pUFObj, pFontObj);
DumpHex(pUFObj, pStrObj);
DumpHex(pUFObj, pFontMap);
DumpHex(pUFObj, pPDev);
DumpHex(pUFObj, ptGrxRes);
DumpHex(pUFObj, pGlyph);
DumpHex(pUFObj, apdlGlyph);
DumpHex(pUFObj, dwNumInGlyphTbl);
return TRUE;
}
DEBUG_EXT_ENTRY(ufo, I_UNIFONTOBJ, bDumpUFO, NULL, FALSE );
//*******************************************************************************
DEBUG_FLAGS gafdDLMwFlags[] = {
{"DLM_BOUNDED", DLM_BOUNDED},
{"DLM_UNBOUNDED",DLM_UNBOUNDED},
{ NULL, 0}
};
BOOL
TDebugExt::
bDumpDLMap(
PVOID pDLM_,
DWORD dwAttr)
{
PDL_MAP pDLM = (PDL_MAP)pDLM_;
Print("\nDL_MAP (%x):\n", pDLM);
DumpInt(pDLM, iUniq);
DumpInt(pDLM, iTTUniq);
DumpInt(pDLM, cGlyphs);
DumpInt(pDLM, cTotalGlyphs);
DumpInt(pDLM, wMaxGlyphSize);
DumpInt(pDLM, cHashTableEntries);
DumpInt(pDLM, wFirstDLGId);
DumpInt(pDLM, wLastDLGId);
DumpInt(pDLM, wNextDLGId);
DumpInt(pDLM, wBaseDLFontid);
DumpInt(pDLM, wCurrFontId);
DumpInt(pDLM, wFlags);
vDumpFlags(pDLM->wFlags, gafdDLMwFlags);
DumpHex(pDLM, pfm);
DumpHex(pDLM, GlyphTab.pGLTNext);
DumpHex(pDLM, GlyphTab.pGlyph);
DumpInt(pDLM, GlyphTab.cEntries);
return TRUE;
}
DEBUG_EXT_ENTRY(dlm, DL_MAP, bDumpDLMap, NULL, FALSE );