mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-29 05:49:19 +00:00
311 lines
9.1 KiB
C
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;
|
||
|
|