234 lines
8.8 KiB
C
234 lines
8.8 KiB
C
//--------------------------------------------------------------------------
|
|
//
|
|
// Module Name: PFM.H
|
|
//
|
|
// Brief Description: This module contains the PSCRIPT driver's
|
|
// font metrics defines.
|
|
//
|
|
// Author: Kent Settle (kentse)
|
|
// Created: 22-Jan-1991
|
|
//
|
|
// Copyright (C) 1991 - 1999 Microsoft Corporation.
|
|
//--------------------------------------------------------------------------
|
|
|
|
#define MAX_KERNPAIRS 1024
|
|
|
|
#define ANSI_CHARSET 0
|
|
#define SYMBOL_CHARSET 2
|
|
#define OEM_CHARSET 255
|
|
|
|
#define NTM_VERSION 0x00010000
|
|
#define FL_NTFM_SOFTFONT 1
|
|
#define FL_NTFM_NO_TRANSLATE_CHARSET 2
|
|
|
|
|
|
#define INIT_IFI 2048
|
|
#define INIT_PFM 262144 + INIT_IFI // storage to allocate to build NTFM.
|
|
|
|
#define MIN_UNICODE_VALUE 0
|
|
#define MAX_UNICODE_VALUE 0xFFFE
|
|
#define INVALID_UNICODE_VALUE 0xFFFF
|
|
// The AFM tokens.
|
|
|
|
#define TK_UNDEFINED 0
|
|
#define TK_STARTKERNDATA 2
|
|
#define TK_STARTKERNPAIRS 3
|
|
#define TK_KPX 4
|
|
#define TK_ENDKERNPAIRS 5
|
|
#define TK_ENDKERNDATA 6
|
|
#define TK_FONTNAME 7
|
|
#define TK_WEIGHT 8
|
|
#define TK_ITALICANGLE 9
|
|
#define TK_ISFIXEDPITCH 10
|
|
#define TK_UNDERLINEPOSITION 11
|
|
#define TK_UNDERLINETHICKNESS 12
|
|
#define TK_FONTBBOX 13
|
|
#define TK_CAPHEIGHT 14
|
|
#define TK_XHEIGHT 15
|
|
#define TK_DESCENDER 16
|
|
#define TK_ASCENDER 17
|
|
#define TK_STARTCHARMETRICS 18
|
|
#define TK_ENDCHARMETRICS 19
|
|
#define TK_ENDFONTMETRICS 20
|
|
#define TK_STARTFONTMETRICS 21
|
|
#define TK_ENCODINGSCHEME 22
|
|
#define TK_FULLNAME 23
|
|
#define TK_FAMILYNAME 24
|
|
#define TK_MSFAMILY 25
|
|
|
|
// font defines.
|
|
|
|
#define ARIAL 1
|
|
#define ARIAL_BOLD 2
|
|
#define ARIAL_BOLDOBLIQUE 3
|
|
#define ARIAL_OBLIQUE 4
|
|
#define ARIAL_NARROW 5
|
|
#define ARIAL_NARROW_BOLD 6
|
|
#define ARIAL_NARROW_BOLDOBLIQUE 7
|
|
#define ARIAL_NARROW_OBLIQUE 8
|
|
#define AVANTGARDE_BOOK 9
|
|
#define AVANTGARDE_BOOKOBLIQUE 10
|
|
#define AVANTGARDE_DEMI 11
|
|
#define AVANTGARDE_DEMIOBLIQUE 12
|
|
#define BOOKMAN_DEMI 13
|
|
#define BOOKMAN_DEMIITALIC 14
|
|
#define BOOKMAN_LIGHT 15
|
|
#define BOOKMAN_LIGHTITALIC 16
|
|
#define COURIER 17
|
|
#define COURIER_BOLD 18
|
|
#define COURIER_BOLDOBLIQUE 19
|
|
#define COURIER_OBLIQUE 20
|
|
#define GARAMOND_BOLD 21
|
|
#define GARAMOND_BOLDITALIC 22
|
|
#define GARAMOND_LIGHT 23
|
|
#define GARAMOND_LIGHTITALIC 24
|
|
#define HELVETICA 25
|
|
#define HELVETICA_BLACK 26
|
|
#define HELVETICA_BLACKOBLIQUE 27
|
|
#define HELVETICA_BOLD 28
|
|
#define HELVETICA_BOLDOBLIQUE 29
|
|
#define HELVETICA_CONDENSED 30
|
|
#define HELVETICA_CONDENSED_BOLD 31
|
|
#define HELVETICA_CONDENSED_BOLDOBL 32
|
|
#define HELVETICA_CONDENSED_OBLIQUE 33
|
|
#define HELVETICA_LIGHT 34
|
|
#define HELVETICA_LIGHTOBLIQUE 35
|
|
#define HELVETICA_NARROW 36
|
|
#define HELVETICA_NARROW_BOLD 37
|
|
#define HELVETICA_NARROW_BOLDOBLIQUE 38
|
|
#define HELVETICA_NARROW_OBLIQUE 39
|
|
#define HELVETICA_OBLIQUE 40
|
|
#define KORINNA_BOLD 41
|
|
#define KORINNA_KURSIVBOLD 42
|
|
#define KORINNA_KURSIVREGULAR 43
|
|
#define KORINNA_REGULAR 44
|
|
#define LUBALINGRAPH_BOOK 45
|
|
#define LUBALINGRAPH_BOOKOBLIQUE 46
|
|
#define LUBALINGRAPH_DEMI 47
|
|
#define LUBALINGRAPH_DEMIOBLIQUE 48
|
|
#define NEWCENTURYSCHLBK_BOLD 49
|
|
#define NEWCENTURYSCHLBK_BOLDITALIC 50
|
|
#define NEWCENTURYSCHLBK_ITALIC 51
|
|
#define NEWCENTURYSCHLBK_ROMAN 52
|
|
#define PALATINO_BOLD 53
|
|
#define PALATINO_BOLDITALIC 54
|
|
#define PALATINO_ITALIC 55
|
|
#define PALATINO_ROMAN 56
|
|
#define SOUVENIR_DEMI 57
|
|
#define SOUVENIR_DEMIITALIC 58
|
|
#define SOUVENIR_LIGHT 59
|
|
#define SOUVENIR_LIGHTITALIC 60
|
|
#define SYMBOL 61
|
|
#define TIMES_BOLD 62
|
|
#define TIMES_BOLDITALIC 63
|
|
#define TIMES_ITALIC 64
|
|
#define TIMES_ROMAN 65
|
|
#define TIMES_NEW_ROMAN 66
|
|
#define TIMES_NEW_ROMAN_BOLD 67
|
|
#define TIMES_NEW_ROMAN_BOLDITALIC 68
|
|
#define TIMES_NEW_ROMAN_ITALIC 69
|
|
#define VARITIMES_BOLD 70
|
|
#define VARITIMES_BOLDITALIC 71
|
|
#define VARITIMES_ITALIC 72
|
|
#define VARITIMES_ROMAN 73
|
|
#define ZAPFCALLIGRAPHIC_BOLD 74
|
|
#define ZAPFCALLIGRAPHIC_BOLDITALIC 75
|
|
#define ZAPFCALLIGRAPHIC_ITALIC 76
|
|
#define ZAPFCALLIGRAPHIC_ROMAN 77
|
|
#define ZAPFCHANCERY_MEDIUMITALIC 78
|
|
#define ZAPFDINGBATS 79
|
|
|
|
#define FIRST_FONT 1
|
|
#define DEFAULT_FONT COURIER
|
|
#define NUM_INTERNAL_FONTS 79
|
|
|
|
extern PutByte(SHORT);
|
|
extern PutWord(SHORT);
|
|
extern PutLong(long);
|
|
|
|
typedef USHORT SOFFSET; // short offset.
|
|
|
|
#define DWORDALIGN(a) ((a + (sizeof(DWORD) - 1)) & ~(sizeof(DWORD) - 1))
|
|
#define WCHARALIGN(a) ((a + (sizeof(WCHAR) - 1)) & ~(sizeof(WCHAR) - 1))
|
|
|
|
// entry for each soft font.
|
|
|
|
// NT Font Metrics structure.
|
|
|
|
typedef ULONG LOFFSET; // long offset.
|
|
|
|
typedef struct
|
|
{
|
|
ULONG cjNTFM; // size of NTFM struct, with attached data.
|
|
LOFFSET loszFontName; // offset to FontName.
|
|
LOFFSET loIFIMETRICS; // offset to IFIMETRICS structure.
|
|
ULONG cKernPairs;
|
|
LOFFSET loKernPairs; // offset to start of FD_KERNINGPAIR structs.
|
|
} NTFMSZ;
|
|
|
|
typedef struct
|
|
{
|
|
ULONG ulVersion; // version
|
|
NTFMSZ ntfmsz; // size inormation
|
|
FLONG flNTFM; // flags [bodind]
|
|
EXTTEXTMETRIC etm;
|
|
USHORT ausCharWidths[256];
|
|
} NTFM, *PNTFM;
|
|
|
|
// This is value needed to determine if a particular soft font needs
|
|
// encoding vector remapping (stolen win31 source code) [bodind]
|
|
|
|
#define NO_TRANSLATE_CHARSET 200
|
|
|
|
// Maximum length of font names
|
|
|
|
#define MAX_FONTNAME 128
|
|
|
|
// An estimate of average PS font size =~ 33K
|
|
|
|
#define AVERAGE_FONT_SIZE (33*1024)
|
|
|
|
/*--------------------------------------------------------------------*\
|
|
* The PFB file format is a sequence of segments, each of which has a *
|
|
* header part and a data part. The header format, defined in the *
|
|
* struct PFBHEADER below, consists of a one byte sanity check number *
|
|
* (128) then a one byte segment type and finally a four byte length *
|
|
* field for the data following data. The length field is stored in *
|
|
* the file with the least significant byte first. *
|
|
* *
|
|
* The segment types are: *
|
|
* 1.) The data is a sequence of ASCII characters. *
|
|
* 2.) The data is a sequence of binary characters to be converted *
|
|
* to a sequence of pairs of hexadecimal digits. *
|
|
* 3.) The last segment in the file. This segment has no length or *
|
|
* data fields. *
|
|
* *
|
|
* The segment types are defined explicitly rather than as an *
|
|
* enumerated type because the values for each type are defined by the *
|
|
* file format rather than the compiler manipulating them. *
|
|
\*--------------------------------------------------------------------*/
|
|
|
|
#define CHECK_BYTE 128 // first byte of file segment
|
|
#define ASCII_TYPE 1 // segment type identifier
|
|
#define BINARY_TYPE 2
|
|
#define EOF_TYPE 3
|
|
|
|
// Macro to verify whether a PFBHEADER is valid
|
|
|
|
#define ValidPfbHeader(p) (*((PBYTE)(p)) == CHECK_BYTE)
|
|
|
|
// Macro to retrieve the segment type field of PFBHEADER
|
|
|
|
#define PfbSegmentType(p) (((PBYTE)(p))[1])
|
|
|
|
// Macro to retrieve the segment length field of PFBHEADER
|
|
|
|
#define PfbSegmentLength(p) (((DWORD) ((PBYTE)(p))[2] ) | \
|
|
((DWORD) ((PBYTE)(p))[3] << 8) | \
|
|
((DWORD) ((PBYTE)(p))[4] << 16) | \
|
|
((DWORD) ((PBYTE)(p))[5] << 24))
|
|
|
|
// Size of PFBHEADER = 6 bytes
|
|
|
|
#define PFBHEADER_SIZE 6
|