windows-nt/Source/XPSP1/NT/windows/published/winfont.w
2020-09-26 16:20:57 +08:00

461 lines
18 KiB
OpenEdge ABL

/******************************Module*Header*******************************\
* Module Name: winfont.h
*
* font file headers for 2.0 and 3.0 windows *.fnt files
*
* Created: 25-Oct-1990 11:08:08
* Author: Bodin Dresevic [BodinD]
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
* (General description of its use)
*
*
\**************************************************************************/
/******************************Public*Macro********************************\
* WRITE_WORD
*
* Writes a word to the misaligned address, pv.
*
* !!! Note: this only works for little-endian.
*
* History:
* 11-Feb-1992 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
#define WRITE_WORD(pv, word) \
{ \
*(PBYTE) (pv) = (BYTE) ((word) & 0x00ff); \
*((PBYTE) (pv) + 1) = (BYTE) (((word) & 0xff00) >> 8); \
}
/******************************Public*Macro********************************\
* READ_WORD
*
* Reads a word from the misaligned address, pv.
*
* !!! Note: this only works for little-endian.
*
* History:
* 11-Feb-1992 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
#define READ_WORD(pv) \
( (WORD) \
( ((WORD)*(PBYTE) (pv)) & (WORD)0x00ff ) | \
( ((WORD)*((PBYTE) (pv) + (WORD)1) & (WORD)0x00ff) << 8 ) \
)
/******************************Public*Macro********************************\
* WRITE_DWORD
*
* Writes a dword to the misaligned address, pv.
*
* !!! Note: this only works for little-endian.
*
* History:
* 11-Feb-1992 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
#define WRITE_DWORD(pv, dword) \
{ \
*(PBYTE) (pv) = (BYTE) ((dword) & 0x000000ff); \
*((PBYTE) (pv) + 1) = (BYTE) (((dword) & 0x0000ff00) >> 8 ); \
*((PBYTE) (pv) + 2) = (BYTE) (((dword) & 0x00ff0000) >> 16); \
*((PBYTE) (pv) + 3) = (BYTE) (((dword) & 0xff000000) >> 24); \
}
/******************************Public*Macro********************************\
* READ_DWORD
*
* Reads a DWORD from the misaligned address, pv.
*
* !!! Note: this only works for little-endian.
*
* History:
* 11-Feb-1992 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
#define READ_DWORD(pv) \
( (DWORD) \
( (*(PBYTE) (pv)) & 0x000000ff ) | \
( (*((PBYTE) (pv) + 1) & 0x000000ff) << 8 ) | \
( (*((PBYTE) (pv) + 2) & 0x000000ff) << 16) | \
( (*((PBYTE) (pv) + 3) & 0x000000ff) << 24) \
)
// font file header (2.0 ddk adaptation guide, 7.7.3.
// and 3.0 ddk, Adaptation Guide section 13.3)
// CAUTION: These structures, as they are defined in the Adaptation Guide are
// out of allignment.(Not even WORD alligned,let alone DWORD alligned.)
// Here we make our own structures, so that when
// disk files are read in the data is copied in correctly, and so that
// the data can be accessed in memory regardless of the architecture.
/**************************************************************************\
// the original structure was
typedef struct {
WORD Version; // Always 17985 for the Nonce
DWORD Size; // Size of whole file
char Copyright[60];
WORD Type; // Raster Font if Type & 1 == 0
WORD Points; // Nominal Point size
WORD VertRes; // Nominal Vertical resolution
WORD HorizRes; // Nominal Horizontal resolution
WORD Ascent; // Height of Ascent
WORD IntLeading; // Internal (Microsoft) Leading
WORD ExtLeading; // External (Microsoft) Leading
BYTE Italic; // Italic font if set
BYTE Underline; // Etc.
BYTE StrikeOut; // Etc.
WORD Weight; // Weight: 200 = regular
BYTE CharSet; // ANSI=0. other=255
WORD PixWidth; // Fixed width. 0 ==> Variable
WORD PixHeight; // Fixed Height
BYTE Family; // Pitch and Family
WORD AvgWidth; // Width of character 'X'
WORD MaxWidth; // Maximum width
BYTE FirstChar; // First character defined in font
BYTE LastChar; // Last character defined in font
BYTE DefaultChar; // Sub. for out of range chars.
BYTE BreakChar; // Word Break Character
WORD WidthBytes; // No.Bytes/row of Bitmap
DWORD Device; // Pointer to Device Name string
DWORD Face; // Pointer to Face Name String
DWORD BitsPointer; // Pointer to Bit Map
DWORD BitsOffset; // Offset to Bit Map
} FontHeaderType; // Above pointers all rel. to start of file
// the original 3.0 header:
typedef struct {
WORD fsVersion;
DWORD fsSize;
char fsCopyright[60];
WORD fsType; // Type field for the font
WORD fsPoints; // Point size of font
WORD fsVertRes; // Vertical digitization
WORD fsHorizRes; // Horizontal digitization
WORD fsAscent; // Baseline offset from char cell top
WORD fsInternalLeading; // Internal leading included in font
WORD fsExternalLeading; // Prefered extra space between lines
BYTE fsItalic; // Flag specifying if italic
BYTE fsUnderline; // Flag specifying if underlined
BYTE fsStrikeOut; // Flag specifying if struck out
WORD fsWeight; // Weight of font
BYTE fsCharSet; // Character set of font
WORD fsPixWidth; // Width field for the font
WORD fsPixHeight; // Height field for the font
BYTE fsPitchAndFamily; // Flag specifying pitch and family
WORD fsAvgWidth; // Average character width
WORD fsMaxWidth; // Maximum character width
BYTE fsFirstChar; // First character in the font
BYTE fsLastChar; // Last character in the font
BYTE fsDefaultChar; // Default character for out of range
BYTE fsBreakChar; // Character to define wordbreaks
WORD fsWidthBytes; // Number of bytes in each row
DWORD fsDevice; // Offset to device name
DWORD fsFace; // Offset to face name
DWORD fsBitsPointer; // Bits pointer
DWORD fsBitsOffset; // Offset to the begining of the bitmap
BYTE fsDBfiller; // Word alignment for the offset table
DWORD fsFlags; // Bit flags
WORD fsAspace; // Global A space, if any
WORD fsBspace; // Global B space, if any
WORD fsCspace; // Global C space, if any
DWORD fsColorPointer; // offset to color table, if any
DWORD fsReserved[4]; //
BYTE fsCharOffset; // Area for storing the char. offsets
} FontHeader30;
typedef struct tagFFH {
WORD fhVersion ;
DWORD fhSize ;
char fhCopyright[60] ;
WORD fhType ;
WORD fhPoints ;
WORD fhVertRes ;
WORD fhHorizRes ;
WORD fhAscent ;
WORD fhInternalLeading;
WORD fhExternalLeading;
BYTE fhItalic ;
BYTE fhUnderline ;
BYTE fhStrikeOut ;
WORD fhWeight ;
BYTE fhCharSet ;
WORD fhPixWidth ;
WORD fhPixHeight ;
BYTE fhPitchAndFamily ;
WORD fhAvgWidth ;
WORD fhMaxWidth ;
BYTE fhFirstChar ;
BYTE fhLastChar ;
BYTE fhDefaultChar ;
BYTE fhBreakChar ;
WORD fhWidthBytes ;
DWORD fhDevice ;
DWORD fhFace ;
DWORD fhBitsPointer ;
} FFH;
\**************************************************************************/
// type of the font file
#define TYPE_RASTER 0x0000
#define TYPE_VECTOR 0x0001
#define TYPE_BITS_IN_ROM 0x0004
#define TYPE_REALIZED_BY_DEVICE 0x0080
// reserved fields in the fsType field, used are 0-th,2-nd, and 7-th bit
#define BITS_RESERVED (~(TYPE_VECTOR|TYPE_BITS_IN_ROM|TYPE_REALIZED_BY_DEVICE))
// supported in win 3.0
#define DFF_FIXED 0x01 // fixed font
#define DFF_PROPORTIONAL 0x02 // proportional font
// not supported in win 3.0, except maybe if someone has
// custom created such a font, using font editor or a similar tool
#define DFF_ABCFIXED 0x04 // ABC fixed font
#define DFF_ABCPROPORTIONAL 0x08 // ABC proportional font
#define DFF_1COLOR 0x10
#define DFF_16COLOR 0x20
#define DFF_256COLOR 0x40
#define DFF_RGBCOLOR 0x80
// here we list offsets of all fields of the original structures
// as they are computed under the assumption that the C compiler does not
// insert any paddings between fields
#define OFF_Version 0L // WORD Always 17985 for the Nonce
#define OFF_Size 2L // DWORD Size of whole file
#define OFF_Copyright 6L // char[60]
// Note: Win 3.1 hack. The LSB of Type is used by Win 3.1 as an engine type
// and font embedding flag. Font embedding is a form of a "hidden
// font file". The MSB of Type is the same as the fsSelection from
// IFIMETRICS. (Strictly speaking, the MSB of Type is equal to the
// LSB of IFIMETRICS.fsSelection).
#define OFF_Type 66L // WORD Raster Font if Type & 1 == 0
#define OFF_Points 68L // WORD Nominal Point size
#define OFF_VertRes 70L // WORD Nominal Vertical resolution
#define OFF_HorizRes 72L // WORD Nominal Horizontal resolution
#define OFF_Ascent 74L // WORD Height of Ascent
#define OFF_IntLeading 76L // WORD Internal (Microsoft) Leading
#define OFF_ExtLeading 78L // WORD External (Microsoft) Leading
#define OFF_Italic 80L // BYTE Italic font if set
#define OFF_Underline 81L // BYTE Etc.
#define OFF_StrikeOut 82L // BYTE Etc.
#define OFF_Weight 83L // WORD Weight: 200 = regular
#define OFF_CharSet 85L // BYTE ANSI=0. other=255
#define OFF_PixWidth 86L // WORD Fixed width. 0 ==> Variable
#define OFF_PixHeight 88L // WORD Fixed Height
#define OFF_Family 90L // BYTE Pitch and Family
#define OFF_AvgWidth 91L // WORD Width of character 'X'
#define OFF_MaxWidth 93L // WORD Maximum width
#define OFF_FirstChar 95L // BYTE First character defined in font
#define OFF_LastChar 96L // BYTE Last character defined in font
#define OFF_DefaultChar 97L // BYTE Sub. for out of range chars.
#define OFF_BreakChar 98L // BYTE Word Break Character
#define OFF_WidthBytes 99L // WORD No.Bytes/row of Bitmap
#define OFF_Device 101L // DWORD Pointer to Device Name string
#define OFF_Face 105L // DWORD Pointer to Face Name String
#define OFF_BitsPointer 109L // DWORD Pointer to Bit Map
#define OFF_BitsOffset 113L // DWORD Offset to Bit Map
#define OFF_jUnused20 117L // BYTE byte filler
#define OFF_OffTable20 118L // WORD here begins char table for 2.0
// 3.0 addition
#define OFF_jUnused30 117L // BYTE enforces word allignment
#define OFF_Flags 118L // DWORD Bit flags
#define OFF_Aspace 122L // WORD Global A space, if any
#define OFF_Bspace 124L // WORD Global B space, if any
#define OFF_Cspace 126L // WORD Global C space, if any
#define OFF_ColorPointer 128L // DWORD offset to color table, if any
#define OFF_Reserved 132L // DWORD[4]
#define OFF_OffTable30 148L // WORD Area for storing the char. offsets in 3.0
// latest offset for pscript device font pfm files [bodind]
#if 0
// This is from win31 sources \drivers\printers\pstt\utils\pfm.c [bodind]
........
WORD dfWidthBytes;
DWORD dfDevice;
DWORD dfFace;
DWORD dfBitsPointer;
DWORD dfBitsOffset; // up to here the offsets are the same as in *.fon files
WORD dfSizeFields;
DWORD dfExtMetricsOffset;
DWORD dfExtentTable;
DWORD dfOriginTable;
DWORD dfPairKernTable;
DWORD dfTrackKernTable;
DWORD dfDriverInfo;
DWORD dfReserved;
#endif
#define OFF_SizeFields 117L
#define OFF_ExtMetricsOffset 119L
#define OFF_ExtentTable 123L
#define OFF_OriginTable 127L
#define OFF_PairKernTable 131L
#define OFF_TrackKernTable 135L
#define OFF_DriverInfo 139L
#define OFF_ReservedPscript 143L
// FFH offsets
#define OFF_FFH_Version 0L // WORD Always 17985 for the Nonce
#define OFF_FFH_Size 2L // DWORD Size of whole file
#define OFF_FFH_Copyright 6L // char[60]
#define OFF_FFH_Type 66L // WORD Raster Font if Type & 1 == 0
#define OFF_FFH_Points 68L // WORD Nominal Point size
#define OFF_FFH_VertRes 70L // WORD Nominal Vertical resolution
#define OFF_FFH_HorizRes 72L // WORD Nominal Horizontal resolution
#define OFF_FFH_Ascent 74L // WORD Height of Ascent
#define OFF_FFH_IntLeading 76L // WORD Internal (Microsoft) Leading
#define OFF_FFH_ExtLeading 78L // WORD External (Microsoft) Leading
#define OFF_FFH_Italic 80L // BYTE Italic font if set
#define OFF_FFH_Underline 81L // BYTE Etc.
#define OFF_FFH_StrikeOut 82L // BYTE Etc.
#define OFF_FFH_Weight 83L // WORD Weight: 200 = regular
#define OFF_FFH_CharSet 85L // BYTE ANSI=0. other=255
#define OFF_FFH_PixWidth 86L // WORD Fixed width. 0 ==> Variable
#define OFF_FFH_PixHeight 88L // WORD Fixed Height
#define OFF_FFH_Family 90L // BYTE Pitch and Family
#define OFF_FFH_AvgWidth 91L // WORD Width of character 'X'
#define OFF_FFH_MaxWidth 93L // WORD Maximum width
#define OFF_FFH_FirstChar 95L // BYTE First character defined in font
#define OFF_FFH_LastChar 96L // BYTE Last character defined in font
#define OFF_FFH_DefaultChar 97L // BYTE Sub. for out of range chars.
#define OFF_FFH_BreakChar 98L // BYTE Word Break Character
#define OFF_FFH_WidthBytes 99L // WORD No.Bytes/row of Bitmap
#define OFF_FFH_Device 101L // DWORD Pointer to Device Name string
#define OFF_FFH_Face 105L // DWORD Pointer to Face Name String
#define OFF_FFH_BitsPointer 109L // DWORD Pointer to Bit Map
#define SIZEFFH (OFF_FFH_BitsPointer + 4)
// This is used in NtGdiMakeFontDir
#define CJ_FONTDIR (SIZEFFH + LF_FACESIZE + LF_FULLFACESIZE + LF_FACESIZE + 10)
// header sizes in bytes of the original headers
#define HDRSIZE20 117L // or 113L ?
#define HDRSIZE30 148L // CharOffset is not counted as header
#define HDRSIZEDIFF (HDRSIZE30 - HDRSIZE20) // 31 byte
// ranges for some quantities
#define MAX_PT_SIZE 999 // max size in points
// weight range
#define MIN_WEIGHT 1 // adaptation guide
#define MAX_WEIGHT 1000 // adaptation guide
// maximal size of bitmap font in pixels, (bound on cx and cy)
#define MAX_PEL_SIZE 64
// 2.0 fonts have offsets that fit into 64k
#define SEGMENT_SIZE 65536L // IN bytes
// offset limit for 2.0 font files
#define MAX_20_OFFSET 65534 // 64K - 2
// sizes of the offset table entries for the 2.0 and 3.0 fonts respectively
#define CJ_ENTRY_20 4 // two bytes for cx + two bytes for the offset
#define CJ_ENTRY_30 6 // two bytes for cx + four bytes for the offset
#define WINWT_TO_PANWT(x) ((x)/100 + 1)
// From [Windows 3.1] gdifeng.inc
#define WIN_VERSION 0x0310
#define GDI_VERSION 0x0101
// From [Windows 3.1] gdipfont.inc
#define PF_ENGINE_TYPE 0x03
#define PF_ENCAPSULATED 0x80 // used in FFH.fhType to identify hidden (embedded) font
#define PANDFTYPESHIFT 1
// for embeded fonts
#define PF_TID 0x40 // if set use TID ( WOW apps )
// otherwise use PID ( NT apps )
// From [Windows 3.1] fonteng2.asm
#define DEF_BRK_CHARACTER 0x0201 // default char for all TT fonts
// BITMAP size related macros
// number of bytes in a scan of a monobitmap that actually contain some info
// Note that this is the same as ((((cx) + 7) & ~7) >> 3), the last two bits
// are lost anyway because of >> 3
#define CJ_SCAN(cx) (((cx) + 7) >> 3)
// move this to a common place so we don't have it in multiple places
// given a byte count, compute the minimum 4 byte (DWORD) aligned size (in bytes)
#define ALIGN4(X) (((X) + 3) & ~3)
// size of the whole bimtap, only dword pad the last scan
#define CJ_BMP(cx,cy) ALIGN4(CJ_SCAN(cx) * (cy))
// get the size of GLYPHDATA structure that at the bottom has appended
// a dib format bitmap for the glyph
// Add offsetof(GLYPHDATA,aulBMData[2]) to cjDIB to account for cx and cy
// are stored in aulBMData[0] and aulBMData[1] respectively
#define CJ_GLYPHDATA(cx,cy) (offsetof(GLYPHBITS,aj) + CJ_BMP(cx,cy))