windows-nt/Source/XPSP1/NT/printscan/print/drivers/usermode/inc/afm2ntm.h
2020-09-26 16:20:57 +08:00

738 lines
19 KiB
C

/*++
Copyright (c) 1996 Adobe Systems Incorporated
Copyright (c) 1996-1999 Microsoft Corporation
Module Name:
afm2ntm.h
Abstract:
Header file for converting AFM to NTM.
Environment:
Windows NT PostScript driver.
Revision History:
02/16/1998 -ksuzuki-
Added CS_SHIFTJIS83 and others for OCF font support.
10/17/1997 -ksuzuki-
Added CJK CMap names, fixed typos, and did clean-up.
10/24/1996 rkiesler@adobe.com
Implemented.
09/16/1996 -slam-
Created.
--*/
#ifndef _AFM2NTM_H_
#define _AFM2NTM_H_
//
// Parsing Macros.
//
#define EOL(a) \
(*a == '\r' || *a == '\n')
#define IS_EOF(a) \
(*a == -1)
#define IS_WHTSPACE(a) \
(*(a) <= ' ')
#define IS_ALPHA(a) \
((*a > 'A' && *a < 'Z') || (*a > 'a' && *a < 'z'))
#define IS_NUM(a) \
(*(a) >= '0' && *(a) <= '9')
#define IS_HEX_ALPHA(a) \
((*(a) >= 'a' && *(a) <= 'f') || (*(a) >= 'A' && *(a) <= 'F'))
#define IS_HEX_DIGIT(a) \
(IS_NUM(a) || IS_HEX_ALPHA(a))
#define SKIP_WHTSPACE(a) \
while ((IS_WHTSPACE(a)) && (!IS_EOF(a))) \
{ \
((ULONG_PTR) a)++; \
}
#define NEXT_LINE(a) \
while ((!EOL(a)) && (!IS_EOF(a))) \
{ \
((ULONG_PTR) a)++; \
} \
SKIP_WHTSPACE(a)
#define PARSE_TOKEN(a, Tok) \
SKIP_WHTSPACE(a); \
Tok = a; \
do \
{ \
if (!IS_EOF(a)) \
((ULONG_PTR) a)++; \
} while (!IS_WHTSPACE(a) && !IS_EOF(a)); \
while (!EOL(a) && !IS_EOF(a) && IS_WHTSPACE(a)) \
{ \
((ULONG_PTR) a)++; \
}
#define NEXT_TOKEN(a) \
while(!EOL(a) && *(a) != ';') \
((ULONG_PTR) a)++; \
while ((*(a) == ';' || IS_WHTSPACE(a))) \
{ \
((ULONG_PTR) (a))++; \
}
#define PARSE_RECT(ptr, rect) \
rect.left = atoi(ptr); \
while (!IS_WHTSPACE(ptr)) \
ptr++; \
SKIP_WHTSPACE(ptr); \
rect.bottom = atoi(ptr); \
while (!IS_WHTSPACE(ptr)) \
ptr++; \
SKIP_WHTSPACE(ptr); \
rect.right = atoi(ptr); \
while (!IS_WHTSPACE(ptr)) \
ptr++; \
SKIP_WHTSPACE(ptr); \
rect.top = atoi(ptr); \
while (!IS_WHTSPACE(ptr)) \
ptr++; \
SKIP_WHTSPACE(ptr)
//
// Macro to detect comments in font .DAT files. This macro is NOT for use
// with AFMs.
//
#define IS_COMMENT(a) \
(*(a) == '#')
//
// Token structure.
//
typedef struct _AFM_TOKEN
{
PSZ psTokName; // ASCII Key Name
PFN pfnTokHndlr; // Ptr to token handler fct
} AFM_TOKEN;
#define PS_CH_METRICS_TOK "StartCharMetrics"
#define PS_CH_NAME_TOK "N"
#define PS_CH_CODE_TOK "C"
#define PS_CH_BBOX_TOK "B"
#define PS_FONT_NAME_TOK "FontName"
#define PS_FONT_FULL_NAME_TOK "FullName"
#define PS_FONT_MS_NAME_TOK "MSFaceName"
#define PS_FONT_FAMILY_NAME_TOK "FamilyName"
#define PS_FONT_VERSION_TOK "Version"
#define PS_CHAR_WIDTH_TOK "CharWidth"
#define PS_PITCH_TOK "IsFixedPitch"
#define PS_CH_WIDTH_TOK "WX"
#define PS_CH_WIDTH0_TOK "W0X"
#define PS_COMMENT_TOK "Comment"
#define PS_END_METRICS_TOK "EndCharMetrics"
#define PS_FONT_BBOX_TOK "FontBBox"
#define PS_FONT_BBOX2_TOK "FontBBox2"
#define PS_EOF_TOK "EndFontMetrics"
#define PS_UNDERLINE_POS_TOK "UnderlinePosition"
#define PS_UNDERLINE_THICK_TOK "UnderlineThickness"
#define PS_KERN_DATA_TOK "StartKernData"
#define PS_NUM_KERN_PAIRS_TOK "StartKernPairs"
#define PS_END_KERN_PAIRS_TOK "EndKernPairs"
#define PS_KERN_PAIR_TOK "KPX"
#define PS_CHARSET_TOK "CharacterSet"
#define PS_STANDARD_CHARSET_TOK "Standard"
#define PS_SPECIAL_CHARSET_TOK "Special"
#define PS_EXTENDED_CHARSET_TOK "ExtendedRoman"
#define PS_ITALIC_TOK "ItalicAngle"
#define PS_WEIGHT_TOK "Weight"
#define PS_ENCODING_TOK "EncodingScheme"
#define PS_SYMBOL_ENCODING "FontSpecific"
#define PS_STANDARD_ENCODING "AdobeStandardEncoding"
#define PS_CH_NAME_EASTEUROPE "ncaron"
#define PS_CH_NAME_RUSSIAN "afii10071"
#define PS_CH_NAME_ANSI "ecircumflex"
#define PS_CH_NAME_GREEK "upsilondieresis"
#define PS_CH_NAME_TURKISH "Idotaccent"
#define PS_CH_NAME_HEBREW "afii57664"
#define PS_CH_NAME_ARABIC "afii57410"
#define PS_CH_NAME_BALTIC "uogonek"
#define PS_CIDFONT_TOK "IsCIDFont"
#define CHAR_NAME_LEN 50
#define NUM_PS_CHARS 602
#define NUM_UNICODE_CHARS 0x10000
#define MAX_TOKENS 3
#define NUM_CHARSETS 8
#define CS_THRESHOLD 200
#define MAX_CSET_CHARS 256
#define MAX_ASCII 127
#define CAP_HEIGHT_CHAR "H"
#define CAP_HEIGHT_CH 'H'
#define X_HEIGHT_CHAR "x"
#define X_HEIGHT_CH 'x'
#define LWR_ASCENT_CHAR "d"
#define LWR_ASCENT_CH 'd'
#define LWR_DESCENT_CHAR "p"
#define LWR_DESCENT_CH 'p'
#define UNICODE_PRV_STRT 0xf000
#define ANSI_CCODE_MAX 0x007f
// Equivalent symbol to '.notdef1f' (ref. unipstbl.c)
#define NOTDEF1F 0x1f
// Some CharSet numbers made up - only meaningful to the driver itself
#define ADOBE228_CHARSET 255 // Internally, we use the CodePage 0xFFF1 to match CharCol256
#define ADOBE314_CHARSET 255 // Internally, we use the CodePage 0xFFF2 to match CharCol257
// Special codepage for symbol fonts and the driver itself
#define SYMBOL_CODEPAGE 4
//
// Defs related to FD_GLYPHSET (unicode->glyphindex map) generation.
//
// Type which indicates source of "recommended" PS character name.
//
typedef enum
{
SRC_NONE, // There is no "recommended" PS char name
SRC_ADOBE_CURRENT, // Font name used in "shipping" font
SRC_ADOBE_FUTURE, // Font name to be used in future fonts
SRC_MSDN, // Name from MS Dev Network Docs
SRC_AFII // Some folks met and agreed on this name
} CHARNAMESRC;
//
// Possible Charsets supported by this font. Note that the charsets are
// listed in Win 3.x codepage order.
//
typedef enum
{
CS_228 = 0,
CS_314,
CS_EASTEUROPE,
CS_SYMBOL,
CS_RUSSIAN,
CS_ANSI,
CS_GREEK,
CS_TURKISH,
CS_HEBREW,
CS_ARABIC,
CS_BALTIC,
CS_ANSI_RUS,
CS_ANSI_RUS_EE_BAL_TURK,
CS_WEST_MAX,
CS_CHINESEBIG5 = CS_WEST_MAX,
CS_GB2312,
CS_SHIFTJIS,
CS_SHIFTJISP,
CS_SHIFTJIS83, // Bogus for OCF font support
CS_HANGEUL,
CS_HANGEULHW, // Added for fixing bug 360206
CS_JOHAB,
CS_MAX,
CS_UNICODE, // This codepage NOT to be referenced by NTMs!
CS_DEFAULT,
CS_OEM,
CS_VIETNAMESE,
CS_THAI,
CS_MAC,
CS_NOCHARSET
} CHSETSUPPORT, *PCHSETSUPPORT;
#define CS_UNIQUE CS_MAX // Charset is unique to this font.
#define CS_EURO \
(\
CSUP(CS_228) | \
CSUP(CS_EASTEUROPE) | \
CSUP(CS_RUSSIAN) | \
CSUP(CS_ANSI) | \
CSUP(CS_GREEK) | \
CSUP(CS_TURKISH) | \
CSUP(CS_HEBREW) | \
CSUP(CS_ARABIC) | \
CSUP(CS_BALTIC) \
)
#define CS_ALL \
(\
CSUP(CS_228) | \
CSUP(CS_314) | \
CSUP(CS_EASTEUROPE) | \
CSUP(CS_SYMBOL) | \
CSUP(CS_RUSSIAN) | \
CSUP(CS_ANSI) | \
CSUP(CS_GREEK) | \
CSUP(CS_TURKISH) | \
CSUP(CS_HEBREW) | \
CSUP(CS_ARABIC) | \
CSUP(CS_BALTIC) | \
CSUP(CS_ANSI_RUS) | \
CSUP(CS_ANSI_RUS_EE_BAL_TURK) | \
\
CSUP(CS_CHINESEBIG5) | \
CSUP(CS_GB2312) | \
CSUP(CS_SHIFTJIS) | \
CSUP(CS_SHIFTJISP) | \
CSUP(CS_SHIFTJIS83) | \
CSUP(CS_HANGEUL) | \
CSUP(CS_HANGEULHW) | \
CSUP(CS_JOHAB) | \
\
CSUP(CS_DEFAULT) | \
CSUP(CS_OEM) | \
CSUP(CS_VIETNAMESE) | \
CSUP(CS_THAI) | \
CSUP(CS_MAC) \
)
#define CS_CJK \
(\
CSUP(CS_CHINESEBIG5) | \
CSUP(CS_GB2312) | \
CSUP(CS_SHIFTJIS) | \
CSUP(CS_SHIFTJISP) | \
CSUP(CS_SHIFTJIS83) | \
CSUP(CS_HANGEUL) | \
CSUP(CS_HANGEULHW) | \
CSUP(CS_JOHAB) \
)
//
// Standard GLYPHSETDATA names. These are #defines as someday they may
// become public.
//
#define ADOBE228_GS_NAME "228"
#define ADOBE314_GS_NAME "314"
#define EASTEUROPE_GS_NAME "Eastern European"
#define SYMBOL_GS_NAME "Symbol"
#define CYRILLIC_GS_NAME "Cyrillic"
#define ANSI_GS_NAME "ANSI"
#define GREEK_GS_NAME "Greek"
#define TURKISH_GS_NAME "Turkish"
#define HEBREW_GS_NAME "Hebrew"
#define ARABIC_GS_NAME "Arabic"
#define BALTIC_GS_NAME "Baltic"
#define ANSI_CYR_GS_NAME "ANSI/Cyrillic"
#define ANSI_CYR_EE_BAL_TURK_GS_NAME "ANSI/Cyrillic/EastEurope/Baltic/Turkish"
#define CHN_BIG5_GS_NAME "--ETen-B5-"
#define CHN_SMPL_GBK_GS_NAME "--GBK-EUC-"
#define SHIFTJIS_GS_NAME "-90ms-RKSJ-"
#define SHIFTJIS_P_GS_NAME "-90msp-RKSJ-"
#define KSCMS_UHC_GS_NAME "--KSCms-UHC-"
#define KSC_JOHAB_GS_NAME "--KSC-Johab-"
#define UNICODE_GS_NAME "Unicode"
#define CHN_SMPL_GB_GS_NAME "--GB-EUC-"
#define CHN_SMPL_GBT_GS_NAME "--GBT-EUC-"
#define CHN_B5_GS_NAME "--B5-"
#define SHIFTJIS_83PV_GS_NAME "-83pv-RKSJ-"
#define KSC_GS_NAME "--KSC-EUC-"
#define KSCMS_UHC_HW_GS_NAME "--KSCms-UHC-HW-"
#define SHIFTJIS_P_GS_HNAME "-90msp-RKSJ-H"
#define SHIFTJIS_P_GS_VNAME "-90msp-RKSJ-V"
#define KSCMS_UHC_GS_HNAME "--KSCms-UHC-H"
#define KSCMS_UHC_GS_VNAME "--KSCms-UHC-V"
//
// CJK related stuff.
//
#define CMAPS_PER_COL 4
//
// Win CJK Codepage values.
//
#define CH_BIG5 950 // Traditional Chinese
#define CH_SIMPLE 936 // Simplified Chinese
#define CH_JIS 932 // Japanese
#define CH_HANA 949 // Korean Wansung
#define CH_JOHAB 1361 // Korean Johab
//
// Font Metrics Stuff.
//
#define EM 1000
#define NOTDEF_WIDTH_BIAS 166 // Bias of space char in avg charwidth
// computation.
//
// Structure to xlat between Postscript char names and unicode code points.
//
typedef struct _UPSCODEPT
{
WCHAR wcUnicodeid; // Unicode code point
PUCHAR pPsName; // PS Char Name
CHSETSUPPORT flCharSets; // Which Win CPs are supported?
} UPSCODEPT, *PUPSCODEPT;
//
// Structure to store AFM char metrics.
//
typedef struct _AFMCHMETRICS
{
ULONG chWidth; // WX, W0X: Char width
} AFMCHMETRICS, *PAFMCHMETRICS;
//
// PS Char Info Structure.
//
typedef struct _PSCHARMETRICS
{
CHAR pPsName[CHAR_NAME_LEN];
ULONG chWidth;
RECT rcChBBox;
} PSCHARMETRICS, *PPSCHARMETRICS;
//
// Codepage mapping table structure. Maps PS char names to Win
// codepages/codepoints.
//
//
// Win codept to PS char name mapping.
//
typedef struct _WINCPT
{
PUCHAR pPsName; // PS Char Name
USHORT usWinCpt; // Windows codept
} WINCPT, *PWINCPT;
//
// Win Codepage to PS char name mapping.
//
typedef struct _WINCPTOPS
{
USHORT usACP; // Windows ANSI Codepage
BYTE jWinCharset; // Win 3.1 IFIMETRICS.jWinCharset
PUCHAR pGSName; // Glyphset name for this Codepage
ULONG ulChCnt; // Count of supported chars
WINCPT aWinCpts[MAX_CSET_CHARS];
} WINCPTOPS, *PWINCPTOPS;
//
// Win codepoint to Unicode mapping.
//
typedef struct _UNIWINCPT
{
WCHAR wcWinCpt; // Windows charcode value
WCHAR wcUnicodeid; // Unicode id
} UNIWINCPT, *PUNIWINCPT;
//
// Windows codepage structure.
//
typedef struct _WINCODEPAGE
{
USHORT usNumBaseCsets; // # of base csets
PSZ pszCPname; // Name of this "codepage"
CHSETSUPPORT pCsetList[CS_MAX]; // ptr to base csets supported
} WINCODEPAGE, *PWINCODEPAGE;
//
// Structure used to store EXTTEXTMETRIC info which must be derived
// from the AFM char metrics. These fields are identical to the fields
// etmCapHeight -> etmLowerCaseDescent in the EXTTEXTMETRIC struct.
//
typedef struct _ETMINFO
{
SHORT etmCapHeight;
SHORT etmXHeight;
SHORT etmLowerCaseAscent;
SHORT etmLowerCaseDescent;
} ETMINFO, *PETMINFO;
//
// Generic Key-Value pair.
//
typedef struct _KEY
{
CHAR pName[CHAR_NAME_LEN]; // Key name
USHORT usValue; // Value
} KEY, *PKEY;
//
// Format of table entries which map PS font names to MS face (family) names.
//
typedef struct _PSFAMILYINFO
{
CHAR pFontName[CHAR_NAME_LEN];
CHAR pEngFamilyName[CHAR_NAME_LEN];
KEY FamilyKey;
USHORT usPitch;
} PSFAMILYINFO, *PPSFAMILYINFO;
//
// Generic table struct.
//
typedef struct _TBL
{
USHORT usNumEntries; // Number of PSFAMILYINFOs
PVOID pTbl; // -> to table entries
} TBL, *PTBL;
//
// Macro used to determine if a particular codept's CHSETSUPPORT field
// (see UPSCODEPT above) indicates support for a particular charset.
//
#define CSUP(a) \
(1 << a)
#define CSET_SUPPORT(cpt, cset) \
(cpt & (CSUP(cset)))
//
// Macros used to determine if a char from a glyphset is supported by a
// font. Takes the char index and IsCharDefined table as parms.
//
#define CHR_DEF(gi) \
(1 << (gi % 8))
#define CHR_DEF_INDEX(gi) \
(gi / 8)
#define IS_CHAR_DEFINED(gi, cdeftbl) \
(cdeftbl[CHR_DEF_INDEX(gi)] & CHR_DEF(gi))
#define DEFINE_CHAR(gi, cdeftbl) \
(cdeftbl[CHR_DEF_INDEX(gi)] |= CHR_DEF(gi))
//
// Macro used to create a void ptr from a pointer to a structure and its
// element name. The result must be cast to the desired type.
//
#ifndef MK_PTR
#define MK_PTR(pstruct, element) ((PVOID)((PBYTE)(pstruct)+(pstruct)->element))
#endif
//
// External global data defined in UNIPSTBL.C.
//
extern ULONG cFontChsetCnt[CS_MAX];
extern UPSCODEPT PstoUnicode[NUM_PS_CHARS];
extern PUPSCODEPT UnicodetoPs;
extern WINCODEPAGE aStdCPList[];
extern AFM_TOKEN afmTokenList[MAX_TOKENS];
extern WINCPTOPS aPStoCP[];
extern WINCODEPAGE aStdCPList[];
extern char *TimesAlias[];
extern char *HelveticaAlias[];
extern char *CourierAlias[];
extern char *HelveticaNarrowAlias[];
extern char *PalatinoAlias[];
extern char *BookmanAlias[];
extern char *NewCenturySBAlias[];
extern char *AvantGardeAlias[];
extern char *ZapfChanceryAlias[];
extern char *ZapfDingbatsAlias[];
extern KEY FontFamilies[];
extern PWCHAR DatFileName;
extern PTBL pFamilyTbl;
extern TBL FamilyKeyTbl;
extern TBL PitchKeyTbl;
extern TBL WeightKeyTbl[];
extern TBL CjkColTbl;
extern ULONG CharWidthBias[];
extern PWCHAR CjkFnameTbl[8][CMAPS_PER_COL];
extern WINCODEPAGE UnicodePage;
extern char *PropCjkGsNames[];
extern PSTR pAFMCharacterSetString;
//
// Local fct protos.
//
PNTM
AFMToNTM(
PBYTE pAFM,
PGLYPHSETDATA pGlyphSetData,
PULONG pUniPs,
CHSETSUPPORT *pCharSet,
BOOL bIsCJKFont,
BOOL bIs90mspFont
);
CHSETSUPPORT
GetAFMCharSetSupport(
PBYTE pAFM,
CHSETSUPPORT *pGlyphSet
);
PBYTE
FindAFMToken(
PBYTE pAFM,
PSZ pszToken
);
extern int __cdecl
StrCmp(
const VOID *str1,
const VOID *str2
);
extern size_t
StrLen(
PBYTE pString
);
extern int
StrCpy(
const VOID *str1,
const VOID *str2
);
extern int __cdecl
StrPos(
const PBYTE str1,
CHAR c
);
int __cdecl
CmpUniCodePts(
const VOID *p1,
const VOID *p2
);
static int __cdecl
CmpUnicodePsNames(
const VOID *p1,
const VOID *p2
);
extern int __cdecl
CmpPsChars(
const VOID *p1,
const VOID *p2
);
ULONG
CreateGlyphSets(
PGLYPHSETDATA *pGlyphSet,
PWINCODEPAGE pWinCodePage,
PULONG *pUniPs
);
ULONG
BuildPSFamilyTable(
PBYTE pDatFile,
PTBL *pPsFamilyTbl,
ULONG ulFileSize
);
LONG
FindClosestCodePage(
PWINCODEPAGE *pWinCodePages,
ULONG ulNumCodePages,
CHSETSUPPORT chSets,
PCHSETSUPPORT pchCsupMatch
);
ULONG
GetAFMCharWidths(
PBYTE pAFM,
PWIDTHRUN *pWidthRuns,
PPSCHARMETRICS pFontChars,
PULONG pUniPs,
ULONG ulChCnt,
PUSHORT pusAvgCharWidth,
PUSHORT pusMaxCharWidth
);
ULONG
GetAFMETM(
PBYTE pAFM,
PPSCHARMETRICS pFontChars,
PETMINFO pEtmInfo
);
ULONG
GetAFMKernPairs(
PBYTE pAFM,
FD_KERNINGPAIR *pKernPairs,
PGLYPHSETDATA pGlyphSetData
);
static int __cdecl
CmpPsChars(
const VOID *p1,
const VOID *p2
);
static int __cdecl
CmpPsNameWinCpt(
const VOID *p1,
const VOID *p2
);
static int __cdecl
CmpKernPairs(
const VOID *p1,
const VOID *p2
);
int __cdecl
CmpGlyphRuns(
const VOID *p1,
const VOID *p2
);
ULONG
BuildPSCharMetrics(
PBYTE pAFM,
PULONG pUniPs,
PPSCHARMETRICS pFontChars,
PBYTE pCharDefTbl,
ULONG cGlyphSetChars
);
ULONG
cjGetFamilyAliases(
IFIMETRICS *pifi,
PSTR pstr,
UINT cp
);
PBYTE
FindStringToken(
PBYTE pPSFile,
PBYTE pToken
);
BOOLEAN
AsciiToHex(
PBYTE pStr,
PUSHORT pNum
);
BOOLEAN
IsPiFont(
PBYTE pAFM
);
BOOLEAN
IsCJKFixedPitchEncoding(
PGLYPHSETDATA pGlyphSetData
);
PBYTE
FindUniqueID(
PBYTE pAFM
);
#endif //!_AFM2NTM_H_