2 |
- |
1 |
/* Copyright (C) 2003 artofcode LLC. All rights reserved.
|
|
|
2 |
|
|
|
3 |
This software is provided AS-IS with no warranty, either express or
|
|
|
4 |
implied.
|
|
|
5 |
|
|
|
6 |
This software is distributed under license and may not be copied,
|
|
|
7 |
modified or distributed except as expressly authorized under the terms
|
|
|
8 |
of the license contained in the file LICENSE in this distribution.
|
|
|
9 |
|
|
|
10 |
For more information about licensing, please refer to
|
|
|
11 |
http://www.ghostscript.com/licensing/. For information on
|
|
|
12 |
commercial licensing, go to http://www.artifex.com/licensing/ or
|
|
|
13 |
contact Artifex Software, Inc., 101 Lucas Valley Road #110,
|
|
|
14 |
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
|
|
|
15 |
*/
|
|
|
16 |
/* $Id: ttfsfnt.h,v 1.6 2003/12/09 21:17:59 giles Exp $ */
|
|
|
17 |
/* Changes after Apple: replaced non-portable types with ISO/IEC 988:1999 exact-size types */
|
|
|
18 |
|
|
|
19 |
/*
|
|
|
20 |
File 'sfnt.h'
|
|
|
21 |
|
|
|
22 |
Contains 'sfnt' resource structure description
|
|
|
23 |
|
|
|
24 |
Copyright 1991 Apple Computer, Inc.
|
|
|
25 |
|
|
|
26 |
*/
|
|
|
27 |
|
|
|
28 |
#ifndef sfntIncludes
|
|
|
29 |
#define sfntIncludes
|
|
|
30 |
|
|
|
31 |
#include "stdint_.h" /* make sure stdint types are available */
|
|
|
32 |
|
|
|
33 |
typedef uint8_t uint8; /* 8-bit unsigned integer */
|
|
|
34 |
typedef int8_t int8; /* 8-bit signed integer */
|
|
|
35 |
typedef uint16_t uint16; /* 16-bit unsigned integer */
|
|
|
36 |
typedef int16_t int16; /* 16-bit signed integer */
|
|
|
37 |
typedef uint32_t uint32; /* 32-bit unsigned integer */
|
|
|
38 |
typedef int32_t int32; /* 32-bit signed integer */
|
|
|
39 |
#if 0
|
|
|
40 |
typedef int32_t Fixed; /* 16.16 32-bit signed fixed-point number */
|
|
|
41 |
#endif
|
|
|
42 |
typedef int16_t FUnit; /* Smallest measurable distance in em space (16-bit signed integer) */
|
|
|
43 |
typedef int16_t FWord; /* 16-bit signed integer that describes a quantity in FUnits */
|
|
|
44 |
typedef uint16_t uFWord; /* 16-bit unsigned integer that describes a quantity in FUnits */
|
|
|
45 |
typedef int16_t F2Dot14; /* 2.14 16-bit signed fixed-point number */
|
|
|
46 |
#if 0
|
|
|
47 |
typedef int32_t F26Dot6; /* 26.6 32-bit signed fixed-point number */
|
|
|
48 |
#endif
|
|
|
49 |
|
|
|
50 |
typedef struct {
|
|
|
51 |
uint32 bc;
|
|
|
52 |
uint32 ad;
|
|
|
53 |
} BigDate;
|
|
|
54 |
|
|
|
55 |
typedef struct {
|
|
|
56 |
uint32 tag;
|
|
|
57 |
uint32 checkSum;
|
|
|
58 |
uint32 offset;
|
|
|
59 |
uint32 length;
|
|
|
60 |
} sfnt_DirectoryEntry;
|
|
|
61 |
|
|
|
62 |
#define SFNT_VERSION 0x10000
|
|
|
63 |
|
|
|
64 |
/*
|
|
|
65 |
* The search fields limits numOffsets to 4096.
|
|
|
66 |
*/
|
|
|
67 |
typedef struct {
|
|
|
68 |
Fixed version; /* 1.0 */
|
|
|
69 |
uint16 numOffsets; /* number of tables */
|
|
|
70 |
uint16 searchRange; /* (max2 <= numOffsets)*16 */
|
|
|
71 |
uint16 entrySelector; /* log2(max2 <= numOffsets) */
|
|
|
72 |
uint16 rangeShift; /* numOffsets*16-searchRange*/
|
|
|
73 |
sfnt_DirectoryEntry table[1]; /* table[numOffsets] */
|
|
|
74 |
} sfnt_OffsetTable;
|
|
|
75 |
|
|
|
76 |
#define OFFSETTABLESIZE 12 /* not including any entries */
|
|
|
77 |
|
|
|
78 |
typedef enum sfntHeaderFlagBits {
|
|
|
79 |
Y_POS_SPECS_BASELINE = 1,
|
|
|
80 |
X_POS_SPECS_LSB = 2,
|
|
|
81 |
HINTS_USE_POINTSIZE = 4,
|
|
|
82 |
USE_INTEGER_SCALING = 8,
|
|
|
83 |
INSTRUCTIONS_CHANGE_ADVANCEWIDTHS = 16,
|
|
|
84 |
X_POS_SPECS_BASELINE = 32,
|
|
|
85 |
Y_POS_SPECS_TSB = 64
|
|
|
86 |
} sfntHeaderFlagBits;
|
|
|
87 |
|
|
|
88 |
#define SFNT_MAGIC 0x5F0F3CF5
|
|
|
89 |
#define SHORT_INDEX_TO_LOC_FORMAT 0
|
|
|
90 |
#define LONG_INDEX_TO_LOC_FORMAT 1
|
|
|
91 |
#define GLYPH_DATA_FORMAT 0
|
|
|
92 |
#define FONT_HEADER_VERSION 0x10000
|
|
|
93 |
|
|
|
94 |
typedef struct {
|
|
|
95 |
Fixed version; /* for this table, set to 1.0 */
|
|
|
96 |
Fixed fontRevision; /* For Font Manufacturer */
|
|
|
97 |
uint32 checkSumAdjustment;
|
|
|
98 |
uint32 magicNumber; /* signature, should always be 0x5F0F3CF5 == MAGIC */
|
|
|
99 |
uint16 flags;
|
|
|
100 |
uint16 unitsPerEm; /* Specifies how many in Font Units we have per EM */
|
|
|
101 |
|
|
|
102 |
BigDate created;
|
|
|
103 |
BigDate modified;
|
|
|
104 |
|
|
|
105 |
/** This is the font wide bounding box in ideal space
|
|
|
106 |
(baselines and metrics are NOT worked into these numbers) **/
|
|
|
107 |
int16 xMin;
|
|
|
108 |
int16 yMin;
|
|
|
109 |
int16 xMax;
|
|
|
110 |
int16 yMax;
|
|
|
111 |
|
|
|
112 |
uint16 macStyle; /* macintosh style word */
|
|
|
113 |
uint16 lowestRecPPEM; /* lowest recommended pixels per Em */
|
|
|
114 |
|
|
|
115 |
/* 0: fully mixed directional glyphs, 1: only strongly L->R or T->B glyphs,
|
|
|
116 |
-1: only strongly R->L or B->T glyphs, 2: like 1 but also contains neutrals,
|
|
|
117 |
-2: like -1 but also contains neutrals */
|
|
|
118 |
int16 fontDirectionHint;
|
|
|
119 |
|
|
|
120 |
int16 indexToLocFormat;
|
|
|
121 |
int16 glyphDataFormat;
|
|
|
122 |
} sfnt_FontHeader;
|
|
|
123 |
|
|
|
124 |
#define METRIC_HEADER_FORMAT 0x10000
|
|
|
125 |
|
|
|
126 |
typedef struct {
|
|
|
127 |
Fixed version; /* for this table, set to 1.0 */
|
|
|
128 |
int16 ascender;
|
|
|
129 |
int16 descender;
|
|
|
130 |
int16 lineGap; /* linespacing = ascender - descender + linegap */
|
|
|
131 |
uint16 advanceMax;
|
|
|
132 |
int16 sideBearingMin; /* left or top */
|
|
|
133 |
int16 otherSideBearingMin; /* right or bottom */
|
|
|
134 |
int16 extentMax; /* Max of ( SB[i] + bounds[i] ), i loops through all glyphs */
|
|
|
135 |
int16 caretSlopeNumerator;
|
|
|
136 |
int16 caretSlopeDenominator;
|
|
|
137 |
int16 caretOffset;
|
|
|
138 |
|
|
|
139 |
uint32 reserved1, reserved2; /* set to 0 */
|
|
|
140 |
|
|
|
141 |
int16 metricDataFormat; /* set to 0 for current format */
|
|
|
142 |
uint16 numberLongMetrics; /* if format == 0 */
|
|
|
143 |
} sfnt_MetricsHeader;
|
|
|
144 |
|
|
|
145 |
typedef sfnt_MetricsHeader sfnt_HorizontalHeader;
|
|
|
146 |
typedef sfnt_MetricsHeader sfnt_VerticalHeader;
|
|
|
147 |
|
|
|
148 |
#define MAX_PROFILE_VERSION 0x10000
|
|
|
149 |
|
|
|
150 |
typedef struct {
|
|
|
151 |
Fixed version; /* for this table, set to 1.0 */
|
|
|
152 |
uint16 numGlyphs;
|
|
|
153 |
uint16 maxPoints; /* in an individual glyph */
|
|
|
154 |
uint16 maxContours; /* in an individual glyph */
|
|
|
155 |
uint16 maxCompositePoints; /* in an composite glyph */
|
|
|
156 |
uint16 maxCompositeContours; /* in an composite glyph */
|
|
|
157 |
uint16 maxElements; /* set to 2, or 1 if no twilightzone points */
|
|
|
158 |
uint16 maxTwilightPoints; /* max points in element zero */
|
|
|
159 |
uint16 maxStorage; /* max number of storage locations */
|
|
|
160 |
uint16 maxFunctionDefs; /* max number of FDEFs in any preprogram */
|
|
|
161 |
uint16 maxInstructionDefs; /* max number of IDEFs in any preprogram */
|
|
|
162 |
uint16 maxStackElements; /* max number of stack elements for any individual glyph */
|
|
|
163 |
uint16 maxSizeOfInstructions; /* max size in bytes for any individual glyph */
|
|
|
164 |
uint16 maxComponentElements; /* number of glyphs referenced at top level */
|
|
|
165 |
uint16 maxComponentDepth; /* levels of recursion, 1 for simple components */
|
|
|
166 |
} sfnt_maxProfileTable;
|
|
|
167 |
|
|
|
168 |
|
|
|
169 |
typedef struct {
|
|
|
170 |
uint16 advance;
|
|
|
171 |
int16 sideBearing;
|
|
|
172 |
} sfnt_GlyphMetrics;
|
|
|
173 |
|
|
|
174 |
typedef sfnt_GlyphMetrics sfnt_HorizontalMetrics;
|
|
|
175 |
typedef sfnt_GlyphMetrics sfnt_VerticalMetrics;
|
|
|
176 |
|
|
|
177 |
typedef int16 sfnt_ControlValue;
|
|
|
178 |
|
|
|
179 |
/*
|
|
|
180 |
* Char2Index structures, including platform IDs
|
|
|
181 |
*/
|
|
|
182 |
typedef struct {
|
|
|
183 |
uint16 format;
|
|
|
184 |
uint16 length;
|
|
|
185 |
uint16 version;
|
|
|
186 |
} sfnt_mappingTable;
|
|
|
187 |
|
|
|
188 |
typedef struct {
|
|
|
189 |
uint16 platformID;
|
|
|
190 |
uint16 specificID;
|
|
|
191 |
uint32 offset;
|
|
|
192 |
} sfnt_platformEntry;
|
|
|
193 |
|
|
|
194 |
typedef struct {
|
|
|
195 |
uint16 version;
|
|
|
196 |
uint16 numTables;
|
|
|
197 |
sfnt_platformEntry platform[1]; /* platform[numTables] */
|
|
|
198 |
} sfnt_char2IndexDirectory;
|
|
|
199 |
#define SIZEOFCHAR2INDEXDIR 4
|
|
|
200 |
|
|
|
201 |
typedef struct {
|
|
|
202 |
uint16 platformID;
|
|
|
203 |
uint16 specificID;
|
|
|
204 |
uint16 languageID;
|
|
|
205 |
uint16 nameID;
|
|
|
206 |
uint16 length;
|
|
|
207 |
uint16 offset;
|
|
|
208 |
} sfnt_NameRecord;
|
|
|
209 |
|
|
|
210 |
typedef struct {
|
|
|
211 |
uint16 format;
|
|
|
212 |
uint16 count;
|
|
|
213 |
uint16 stringOffset;
|
|
|
214 |
/* sfnt_NameRecord[count] */
|
|
|
215 |
} sfnt_NamingTable;
|
|
|
216 |
|
|
|
217 |
#define DEVWIDTHEXTRA 2 /* size + max */
|
|
|
218 |
/*
|
|
|
219 |
* Each record is n+2 bytes, padded to long word alignment.
|
|
|
220 |
* First byte is ppem, second is maxWidth, rest are widths for each glyph
|
|
|
221 |
*/
|
|
|
222 |
typedef struct {
|
|
|
223 |
int16 version;
|
|
|
224 |
int16 numRecords;
|
|
|
225 |
int32 recordSize;
|
|
|
226 |
/* Byte widths[numGlyphs+DEVWIDTHEXTRA] * numRecords */
|
|
|
227 |
} sfnt_DeviceMetrics;
|
|
|
228 |
|
|
|
229 |
#define stdPostTableFormat 0x10000
|
|
|
230 |
#define wordPostTableFormat 0x20000
|
|
|
231 |
#define bytePostTableFormat 0x28000
|
|
|
232 |
#define richardsPostTableFormat 0x30000
|
|
|
233 |
|
|
|
234 |
typedef struct {
|
|
|
235 |
Fixed version;
|
|
|
236 |
Fixed italicAngle;
|
|
|
237 |
int16 underlinePosition;
|
|
|
238 |
int16 underlineThickness;
|
|
|
239 |
int16 isFixedPitch;
|
|
|
240 |
int16 pad;
|
|
|
241 |
uint32 minMemType42;
|
|
|
242 |
uint32 maxMemType42;
|
|
|
243 |
uint32 minMemType1;
|
|
|
244 |
uint32 maxMemType1;
|
|
|
245 |
/* if version == 2.0
|
|
|
246 |
{
|
|
|
247 |
numberGlyphs;
|
|
|
248 |
unsigned short[numberGlyphs];
|
|
|
249 |
pascalString[numberNewNames];
|
|
|
250 |
}
|
|
|
251 |
else if version == 2.5
|
|
|
252 |
{
|
|
|
253 |
numberGlyphs;
|
|
|
254 |
int8[numberGlyphs];
|
|
|
255 |
}
|
|
|
256 |
*/
|
|
|
257 |
} sfnt_PostScriptInfo;
|
|
|
258 |
|
|
|
259 |
typedef enum outlinePacking {
|
|
|
260 |
ONCURVE = 1,
|
|
|
261 |
XSHORT = 2,
|
|
|
262 |
YSHORT = 4,
|
|
|
263 |
REPEAT_FLAGS = 8,
|
|
|
264 |
/* IF XSHORT */
|
|
|
265 |
SHORT_X_IS_POS = 16, /* the short vector is positive */
|
|
|
266 |
/* ELSE */
|
|
|
267 |
NEXT_X_IS_ZERO = 16, /* the relative x coordinate is zero */
|
|
|
268 |
/* ENDIF */
|
|
|
269 |
/* IF YSHORT */
|
|
|
270 |
SHORT_Y_IS_POS = 32, /* the short vector is positive */
|
|
|
271 |
/* ELSE */
|
|
|
272 |
NEXT_Y_IS_ZERO = 32 /* the relative y coordinate is zero */
|
|
|
273 |
/* ENDIF */
|
|
|
274 |
} outlinePacking;
|
|
|
275 |
|
|
|
276 |
typedef enum componentPacking {
|
|
|
277 |
COMPONENTCTRCOUNT = -1,
|
|
|
278 |
ARG_1_AND_2_ARE_WORDS = 1, /* if not, they are bytes */
|
|
|
279 |
ARGS_ARE_XY_VALUES = 2, /* if not, they are points */
|
|
|
280 |
ROUND_XY_TO_GRID = 4,
|
|
|
281 |
WE_HAVE_A_SCALE = 8, /* if not, Sx = Sy = 1.0 */
|
|
|
282 |
NON_OVERLAPPING = 16,
|
|
|
283 |
MORE_COMPONENTS = 32, /* if not, this is the last one */
|
|
|
284 |
WE_HAVE_AN_X_AND_Y_SCALE = 64, /* Sx != Sy */
|
|
|
285 |
WE_HAVE_A_TWO_BY_TWO = 128, /* t00, t01, t10, t11 */
|
|
|
286 |
WE_HAVE_INSTRUCTIONS = 256, /* short count followed by instructions follows */
|
|
|
287 |
USE_MY_METRICS = 512 /* use my metrics for parent glyph */
|
|
|
288 |
} componentPacking;
|
|
|
289 |
|
|
|
290 |
typedef struct {
|
|
|
291 |
uint16 firstCode;
|
|
|
292 |
uint16 entryCount;
|
|
|
293 |
int16 idDelta;
|
|
|
294 |
uint16 idRangeOffset;
|
|
|
295 |
} sfnt_subheader;
|
|
|
296 |
|
|
|
297 |
typedef struct {
|
|
|
298 |
uint16 segCountX2;
|
|
|
299 |
uint16 searchRange;
|
|
|
300 |
uint16 entrySelector;
|
|
|
301 |
uint16 rangeShift;
|
|
|
302 |
} sfnt_4_subheader;
|
|
|
303 |
|
|
|
304 |
/* sfnt_enum.h */
|
|
|
305 |
|
|
|
306 |
typedef enum {
|
|
|
307 |
plat_Unicode,
|
|
|
308 |
plat_Macintosh,
|
|
|
309 |
plat_ISO,
|
|
|
310 |
plat_MS
|
|
|
311 |
} platformEnums;
|
|
|
312 |
|
|
|
313 |
#define tag_FontHeader 'daeh' /* (*(LPDWORD)"head") */
|
|
|
314 |
#define tag_HoriHeader 'aehh' /* (*(LPDWORD)"hhea") */
|
|
|
315 |
#define tag_VertHeader 'aehv' /* (*(LPDWORD)"vhea") */
|
|
|
316 |
#define tag_IndexToLoc 'acol' /* (*(LPDWORD)"loca") */
|
|
|
317 |
#define tag_MaxProfile 'pxam' /* (*(LPDWORD)"maxp") */
|
|
|
318 |
#define tag_ControlValue ' tvc' /* (*(LPDWORD)"cvt ") */
|
|
|
319 |
#define tag_PreProgram 'perp' /* (*(LPDWORD)"prep") */
|
|
|
320 |
#define tag_GlyphData 'fylg' /* (*(LPDWORD)"glyf") */
|
|
|
321 |
#define tag_HorizontalMetrics 'xtmh' /* (*(LPDWORD)"hmtx") */
|
|
|
322 |
#define tag_VerticalMetrics 'xtmv' /* (*(LPDWORD)"vmtx") */
|
|
|
323 |
#define tag_CharToIndexMap 'pamc' /* (*(LPDWORD)"cmap") */
|
|
|
324 |
#define tag_FontProgram 'mgpf' /* (*(LPDWORD)"fpgm") */
|
|
|
325 |
|
|
|
326 |
#define tag_Kerning 'nrek' /* (*(LPDWORD)"kern") */
|
|
|
327 |
#define tag_HoriDeviceMetrics 'xmdh' /* (*(LPDWORD)"hdmx") */
|
|
|
328 |
#define tag_NamingTable 'eman' /* (*(LPDWORD)"name") */
|
|
|
329 |
#define tag_PostScript 'tsop' /* (*(LPDWORD)"post") */
|
|
|
330 |
|
|
|
331 |
#if 0
|
|
|
332 |
/* access.h */
|
|
|
333 |
#define fNoError 0
|
|
|
334 |
#define fTableNotFound -1
|
|
|
335 |
#define fNameNotFound -2
|
|
|
336 |
#define fMemoryError -3
|
|
|
337 |
#define fUnimplemented -4
|
|
|
338 |
#define fCMapNotFound -5
|
|
|
339 |
#define fGlyphNotFound -6
|
|
|
340 |
|
|
|
341 |
typedef int32 FontError;
|
|
|
342 |
#endif
|
|
|
343 |
|
|
|
344 |
typedef struct FontTableInfo {
|
|
|
345 |
int32 offset; /* from beginning of sfnt to beginning of the table */
|
|
|
346 |
int32 length; /* length of the table */
|
|
|
347 |
int32 checkSum; /* checkSum of the table */
|
|
|
348 |
} FontTableInfo;
|
|
|
349 |
|
|
|
350 |
#define RAW_TRUE_TYPE_SIZE 512
|
|
|
351 |
|
|
|
352 |
#endif
|