|
|
/*++
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 AFM2NTMStrCpy( const VOID *str1, size_t cchDest, 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_
|