sys7.1-doc-wip/Toolbox/FontMgr/sfnt.h
2019-07-27 22:37:48 +08:00

311 lines
9.1 KiB
C

/*
File: sfnt.h
Contains: xxx put contents here (or delete the whole line) xxx
Written by: xxx put name of writer here (or delete the whole line) xxx
Copyright: © 1988-1991 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<7> 10/22/91 RB Add support for sfnt-embedded-bitmaps
<6> 9/25/91 jlf Added GLOBAL_FONT_VERSION_NUMBER field for verifying the
version field of a font header at NewSfnt time.
<5> 12/20/90 MR Add caretOffset to horiHeader (replacing reserved0) [rb]
<4> 12/11/90 MR Add use-my-metrics support for devMetrics in component glyphs.
[rb]
<3> 10/31/90 MR Add bit-field option for integer or fractional scaling [rb]
<2> 10/20/90 MR Remove unneeded tables from sfnt_tableIndex. [rb]
<12> 7/18/90 MR platform and specific should always be unsigned
<11> 7/14/90 MR removed duplicate definitions of int[8,16,32] etc.
<10> 7/13/90 MR Minor type changes, for Ansi-C
<9> 6/29/90 RB revise postscriptinfo struct
<7> 6/4/90 MR Remove MVT
<6> 6/1/90 MR pad postscriptinfo to long word aligned
<5> 5/15/90 MR Add definition of PostScript table
<4> 5/3/90 RB mrr Added tag for font program 'fpgm'
<3> 3/20/90 CL chucked old change comments from EASE
<2> 2/27/90 CL getting bbs headers
<3.1> 11/14/89 CEL Instructions are legal in components.
<3.0> 8/28/89 sjk Cleanup and one transformation bugfix
<2.2> 8/14/89 sjk 1 point contours now OK
<2.1> 8/8/89 sjk Improved encryption handling
<2.0> 8/2/89 sjk Just fixed EASE comment
<1.7> 8/1/89 sjk Added composites and encryption. Plus some enhancements…
<1.6> 6/13/89 SJK Comment
<1.5> 6/2/89 CEL 16.16 scaling of metrics, minimum recommended ppem, point size 0
bug, correct transformed integralized ppem behavior, pretty much
so
<1.4> 5/26/89 CEL EASE messed up on “c” comments
<•1.3> 5/26/89 CEL Integrated the new Font Scaler 1.0 into Spline Fonts
To Do:
<3+> 3/20/90 mrr Added tag for font program 'fpgm'
*/
#ifndef SFNT_ENUMS
#include "sfnt_enum.h"
#endif
typedef struct {
uint32 bc;
uint32 ad;
} BigDate;
typedef struct {
sfnt_TableTag tag;
uint32 checkSum;
uint32 offset;
uint32 length;
} sfnt_DirectoryEntry;
/*
* The search fields limits numOffsets to 4096.
*/
typedef struct {
int32 version; /* 0x10000 (1.0) */
uint16 numOffsets; /* number of tables */
uint16 searchRange; /* (max2 <= numOffsets)*16 */
uint16 entrySelector; /* log2(max2 <= numOffsets) */
uint16 rangeShift; /* numOffsets*16-searchRange*/
sfnt_DirectoryEntry table[1]; /* table[numOffsets] */
} sfnt_OffsetTable;
#define OFFSETTABLESIZE 12 /* not including any entries */
/*
* for the flags field
*/
#define Y_POS_SPECS_BASELINE 0x0001
#define X_POS_SPECS_LSB 0x0002
#define HINTS_USE_POINTSIZE 0x0004
#define USE_INTEGER_SCALING 0x0008
#define INSTRUCTIONS_CHANGE_ADVANCEWIDTHS 0x0010 <6>
#define SFNT_MAGIC 0x5F0F3CF5
#define SHORT_INDEX_TO_LOC_FORMAT 0
#define LONG_INDEX_TO_LOC_FORMAT 1
#define GLYPH_DATA_FORMAT 0
#define GLOBAL_FONT_VERSION_NUMBER 0x00010000
typedef struct {
Fixed version; /* for this table, set to 1.0 */
Fixed fontRevision; /* For Font Manufacturer */
uint32 checkSumAdjustment;
uint32 magicNumber; /* signature, should always be 0x5F0F3CF5 == MAGIC */
uint16 flags;
uint16 unitsPerEm; /* Specifies how many in Font Units we have per EM */
BigDate created;
BigDate modified;
/** This is the font wide bounding box in ideal space
(baselines and metrics are NOT worked into these numbers) **/
FWord xMin;
FWord yMin;
FWord xMax;
FWord yMax;
uint16 macStyle; /* macintosh style word */
uint16 lowestRecPPEM; /* lowest recommended pixels per Em */
/* 0: fully mixed directional glyphs, 1: only strongly L->R or T->B glyphs,
-1: only strongly R->L or B->T glyphs, 2: like 1 but also contains neutrals,
-2: like -1 but also contains neutrals */
int16 fontDirectionHint;
int16 indexToLocFormat;
int16 glyphDataFormat;
} sfnt_FontHeader;
typedef struct {
Fixed version; /* for this table, set to 1.0 */
FWord yAscender;
FWord yDescender;
FWord yLineGap; /* Recommended linespacing = ascender - descender + linegap */
uFWord advanceWidthMax;
FWord minLeftSideBearing;
FWord minRightSideBearing;
FWord xMaxExtent; /* Max of ( LSBi + (XMAXi - XMINi) ), i loops through all glyphs */
int16 horizontalCaretSlopeNumerator;
int16 horizontalCaretSlopeDenominator;
FWord caretOffset;
uint16 reserved1;
uint16 reserved2;
uint16 reserved3;
uint16 reserved4;
int16 metricDataFormat; /* set to 0 for current format */
uint16 numberOf_LongHorMetrics; /* if format == 0 */
} sfnt_HorizontalHeader;
typedef struct {
Fixed version; /* for this table, set to 1.0 */
uint16 numGlyphs;
uint16 maxPoints; /* in an individual glyph */
uint16 maxContours; /* in an individual glyph */
uint16 maxCompositePoints; /* in an composite glyph */
uint16 maxCompositeContours; /* in an composite glyph */
uint16 maxElements; /* set to 2, or 1 if no twilightzone points */
uint16 maxTwilightPoints; /* max points in element zero */
uint16 maxStorage; /* max number of storage locations */
uint16 maxFunctionDefs; /* max number of FDEFs in any preprogram */
uint16 maxInstructionDefs; /* max number of IDEFs in any preprogram */
uint16 maxStackElements; /* max number of stack elements for any individual glyph */
uint16 maxSizeOfInstructions; /* max size in bytes for any individual glyph */
uint16 maxComponentElements; /* number of glyphs referenced at top level */
uint16 maxComponentDepth; /* levels of recursion, 1 for simple components */
} sfnt_maxProfileTable;
typedef struct {
uint16 advanceWidth;
int16 leftSideBearing;
} sfnt_HorizontalMetrics;
/*
* CVT is just a bunch of int16s
*/
typedef int16 sfnt_ControlValue;
/*
* Char2Index structures, including platform IDs
*/
typedef struct {
uint16 format;
uint16 length;
uint16 version;
} sfnt_mappingTable;
typedef struct {
uint16 platformID;
uint16 specificID;
uint32 offset;
} sfnt_platformEntry;
typedef struct {
uint16 version;
uint16 numTables;
sfnt_platformEntry platform[1]; /* platform[numTables] */
} sfnt_char2IndexDirectory;
#define SIZEOFCHAR2INDEXDIR 4
typedef struct {
uint16 platformID;
uint16 specificID;
uint16 languageID;
uint16 nameID;
uint16 length;
uint16 offset;
} sfnt_NameRecord;
typedef struct {
uint16 format;
uint16 count;
uint16 stringOffset;
/* sfnt_NameRecord[count] */
} sfnt_NamingTable;
#define DEVEXTRA 2 /* size + max */
/*
* Each record is n+2 bytes, padded to long word alignment.
* First byte is ppem, second is maxWidth, rest are widths for each glyph
*/
typedef struct {
int16 version;
int16 numRecords;
int32 recordSize;
/* Byte widths[numGlyphs+2] * numRecords */
} sfnt_DeviceMetrics;
typedef struct {
Fixed version; /* 1.0 */
Fixed italicAngle;
FWord underlinePosition;
FWord underlineThickness;
int16 isFixedPitch;
int16 pad;
uint32 minMemType42;
uint32 maxMemType42;
uint32 minMemType1;
uint32 maxMemType1;
/* if version == 2.0
{
numberGlyphs;
uint16[numberGlyphs];
pascalString[numberNewNames];
}
else if version == 2.5
{
numberGlyphs;
int8[numberGlyphs];
}
*/
} sfnt_PostScriptInfo;
/*
* UNPACKING Constants
*/
#define ONCURVE 0x01
#define XSHORT 0x02
#define YSHORT 0x04
#define REPEAT_FLAGS 0x08 /* repeat flag n times */
/* IF XSHORT */
#define SHORT_X_IS_POS 0x10 /* the short vector is positive */
/* ELSE */
#define NEXT_X_IS_ZERO 0x10 /* the relative x coordinate is zero */
/* ENDIF */
/* IF YSHORT */
#define SHORT_Y_IS_POS 0x20 /* the short vector is positive */
/* ELSE */
#define NEXT_Y_IS_ZERO 0x20 /* the relative y coordinate is zero */
/* ENDIF */
/* 0x40 & 0x80 RESERVED
** Set to Zero
**
*/
/*
* Composite glyph constants
*/
#define COMPONENTCTRCOUNT -1 /* ctrCount == -1 for composite */
#define ARG_1_AND_2_ARE_WORDS 0x0001 /* if set args are words otherwise they are bytes */
#define ARGS_ARE_XY_VALUES 0x0002 /* if set args are xy values, otherwise they are points */
#define ROUND_XY_TO_GRID 0x0004 /* for the xy values if above is true */
#define WE_HAVE_A_SCALE 0x0008 /* Sx = Sy, otherwise scale == 1.0 */
#define NON_OVERLAPPING 0x0010 /* set to same value for all components */
#define MORE_COMPONENTS 0x0020 /* indicates at least one more glyph after this one */
#define WE_HAVE_AN_X_AND_Y_SCALE 0x0040 /* Sx, Sy */
#define WE_HAVE_A_TWO_BY_TWO 0x0080 /* t00, t01, t10, t11 */
#define WE_HAVE_INSTRUCTIONS 0x0100 /* instructions follow */
#define USE_MY_METRICS 0x0200 /* apply these metrics to parent glyph */
/*
* Private enums for tables used by the scaler. See sfnt_Classify
*/
typedef enum {
sfnt_fontHeader,
sfnt_horiHeader,
sfnt_indexToLoc,
sfnt_maxProfile,
sfnt_controlValue,
sfnt_preProgram,
sfnt_glyphData,
sfnt_horizontalMetrics,
sfnt_charToIndexMap,
sfnt_fontProgram,
#if TheFuture /* <7 > EBITMAP */
sfnt_bitmapLocation,
sfnt_bitmapData,
#endif
sfnt_NUMTABLEINDEX
} sfnt_tableIndex;