1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /***************************************************************************
4 *
5 *   Copyright (C) 1998-2013, International Business Machines
6 *   Corporation and others.  All Rights Reserved.
7 *
8 ************************************************************************/
9 
10 #ifndef __SFNT_H
11 #define __SFNT_H
12 
13 #include "layout/LETypes.h"
14 
15 U_NAMESPACE_USE
16 
17 #ifndef ANY_NUMBER
18 #define ANY_NUMBER 1
19 #endif
20 
21 struct DirectoryEntry
22 {
23     le_uint32   tag;
24     le_uint32   checksum;
25     le_uint32   offset;
26     le_uint32   length;
27 };
28 
29 #ifndef __cplusplus
30 typedef struct DirectoryEntry DirectoryEntry;
31 #endif
32 
33 struct SFNTDirectory
34 {
35     le_uint32       scalerType;
36     le_uint16       numTables;
37     le_uint16       searchRange;
38     le_uint16       entrySelector;
39     le_uint16       rangeShift;
40     DirectoryEntry  tableDirectory[ANY_NUMBER];
41 };
42 
43 #ifndef __cplusplus
44 typedef struct SFNTDirectory SFNTDirectory;
45 #endif
46 
47 
48 struct CMAPEncodingSubtableHeader
49 {
50     le_uint16   platformID;
51     le_uint16   platformSpecificID;
52     le_uint32   encodingOffset;
53 };
54 
55 #ifndef __cplusplus
56 typedef struct CMAPEncodingSubtableHeader CMAPEncodingSubtableHeader;
57 #endif
58 
59 struct CMAPTable
60 {
61     le_uint16   version;
62     le_uint16   numberSubtables;
63     CMAPEncodingSubtableHeader encodingSubtableHeaders[ANY_NUMBER];
64 };
65 
66 #ifndef __cplusplus
67 typedef struct CMAPTable CMAPTable;
68 #endif
69 
70 struct CMAPEncodingSubtable
71 {
72     le_uint16   format;
73     le_uint16   length;
74     le_uint16   language;
75 };
76 
77 #ifndef __cplusplus
78 typedef struct CMAPEncodingSubtable CMAPEncodingSubtable;
79 #endif
80 
81 #ifdef __cplusplus
82 struct CMAPFormat0Encoding : CMAPEncodingSubtable
83 {
84     le_uint8    glyphIndexArray[256];
85 };
86 #else
87 struct CMAPFormat0Encoding
88 {
89 	CMAPEncodingSubtable base;
90 
91 	le_uint8 glyphIndexArray[256];
92 };
93 
94 typedef struct CMAPFormat0Encoding CMAPFormat0Encoding;
95 #endif
96 
97 struct CMAPFormat2Subheader
98 {
99     le_uint16   firstCode;
100     le_uint16   entryCount;
101     le_int16    idDelta;
102     le_uint16   idRangeOffset;
103 };
104 
105 #ifndef __cplusplus
106 typedef struct CMAPFormat2Subheader CMAPFormat2Subheader;
107 #endif
108 
109 #ifdef __cplusplus
110 struct CMAPFormat2Encoding : CMAPEncodingSubtable
111 {
112     le_uint16  subHeadKeys[256];
113     CMAPFormat2Subheader subheaders[ANY_NUMBER];
114 };
115 #else
116 struct CMAPFormat2Encoding
117 {
118 	CMAPEncodingSubtable base;
119 
120     le_uint16  subHeadKeys[256];
121     CMAPFormat2Subheader subheaders[ANY_NUMBER];
122 };
123 
124 typedef struct CMAPFormat2Encoding CMAPFormat2Encoding;
125 #endif
126 
127 #ifdef __cplusplus
128 struct CMAPFormat4Encoding : CMAPEncodingSubtable
129 {
130     le_uint16   segCountX2;
131     le_uint16   searchRange;
132     le_uint16   entrySelector;
133     le_uint16   rangeShift;
134     le_uint16   endCodes[ANY_NUMBER];
135 /*
136     le_uint16   reservedPad;
137     le_uint16   startCodes[ANY_NUMBER];
138     le_uint16   idDelta[ANY_NUMBER];
139     le_uint16   idRangeOffset[ANY_NUMBER];
140     le_uint16   glyphIndexArray[ANY_NUMBER];
141 */
142 };
143 #else
144 struct CMAPFormat4Encoding
145 {
146 	CMAPEncodingSubtable base;
147 
148     le_uint16   segCountX2;
149     le_uint16   searchRange;
150     le_uint16   entrySelector;
151     le_uint16   rangeShift;
152     le_uint16   endCodes[ANY_NUMBER];
153 /*
154 //  le_uint16   reservedPad;
155 //  le_uint16   startCodes[ANY_NUMBER];
156 //  le_uint16   idDelta[ANY_NUMBER];
157 //  le_uint16   idRangeOffset[ANY_NUMBER];
158 //  le_uint16   glyphIndexArray[ANY_NUMBER];
159 */
160 };
161 
162 typedef struct CMAPFormat4Encoding CMAPFormat4Encoding;
163 #endif
164 
165 #ifdef __cplusplus
166 struct CMAPFormat6Encoding : CMAPEncodingSubtable
167 {
168     le_uint16   firstCode;
169     le_uint16   entryCount;
170     le_uint16   glyphIndexArray[ANY_NUMBER];
171 };
172 #else
173 struct CMAPFormat6Encoding
174 {
175 	CMAPEncodingSubtable base;
176 
177     le_uint16   firstCode;
178     le_uint16   entryCount;
179     le_uint16   glyphIndexArray[ANY_NUMBER];
180 };
181 
182 typedef struct CMAPFormat6Encoding CMAPFormat6Encoding;
183 #endif
184 
185 struct CMAPEncodingSubtable32
186 {
187     le_uint32   format;
188     le_uint32   length;
189     le_uint32   language;
190 };
191 
192 #ifndef __cplusplus
193 typedef struct CMAPEncodingSubtable32 CMAPEncodingSubtable32;
194 #endif
195 
196 struct CMAPGroup
197 {
198     le_uint32   startCharCode;
199     le_uint32   endCharCode;
200     le_uint32   startGlyphCode;
201 };
202 
203 #ifndef __cplusplus
204 typedef struct CMAPGroup CMAPGroup;
205 #endif
206 
207 #ifdef __cplusplus
208 struct CMAPFormat8Encoding : CMAPEncodingSubtable32
209 {
210     le_uint32   is32[65536/32];
211     le_uint32   nGroups;
212     CMAPGroup   groups[ANY_NUMBER];
213 };
214 #else
215 struct CMAPFormat8Encoding
216 {
217 	CMAPEncodingSubtable32 base;
218 
219     le_uint32   is32[65536/32];
220     le_uint32   nGroups;
221     CMAPGroup   groups[ANY_NUMBER];
222 };
223 
224 typedef struct CMAPFormat8Encoding CMAPFormat8Encoding;
225 #endif
226 
227 #ifdef __cplusplus
228 struct CMAPFormat10Encoding : CMAPEncodingSubtable32
229 {
230     le_uint32   startCharCode;
231     le_uint32   numCharCodes;
232     le_uint16   glyphs[ANY_NUMBER];
233 };
234 #else
235 struct CMAPFormat10Encoding
236 {
237 	CMAPEncodingSubtable32 base;
238 
239     le_uint32   startCharCode;
240     le_uint32   numCharCodes;
241     le_uint16   glyphs[ANY_NUMBER];
242 };
243 
244 typedef struct CMAPFormat10Encoding CMAPFormat10Encoding;
245 #endif
246 
247 #ifdef __cplusplus
248 struct CMAPFormat12Encoding : CMAPEncodingSubtable32
249 {
250     le_uint32   nGroups;
251     CMAPGroup   groups[ANY_NUMBER];
252 };
253 #else
254 struct CMAPFormat12Encoding
255 {
256 	CMAPEncodingSubtable32 base;
257 
258     le_uint32   nGroups;
259     CMAPGroup   groups[ANY_NUMBER];
260 };
261 
262 typedef struct CMAPFormat12Encoding CMAPFormat12Encoding;
263 #endif
264 
265 typedef le_int32 fixed;
266 
267 struct BigDate
268 {
269     le_uint32   bc;
270     le_uint32   ad;
271 };
272 
273 #ifndef __cplusplus
274 typedef struct BigDate BigDate;
275 #endif
276 
277 struct HEADTable
278 {
279     fixed       version;
280     fixed       fontRevision;
281     le_uint32   checksumAdjustment;
282     le_uint32   magicNumber;
283     le_uint16   flags;
284     le_uint16   unitsPerEm;
285     BigDate     created;
286     BigDate     modified;
287     le_int16    xMin;
288     le_int16    yMin;
289     le_int16    xMax;
290     le_int16    yMax;
291     le_int16    lowestRecPPEM;
292     le_int16    fontDirectionHint;
293     le_int16    indexToLocFormat;
294     le_int16    glyphDataFormat;
295 };
296 
297 #ifndef __cplusplus
298 typedef struct HEADTable HEADTable;
299 #endif
300 
301 struct MAXPTable
302 {
303     fixed       version;
304     le_uint16   numGlyphs;
305     le_uint16   maxPoints;
306     le_uint16   maxContours;
307     le_uint16   maxComponentPoints;
308     le_uint16   maxComponentContours;
309     le_uint16   maxZones;
310     le_uint16   maxTwilightPoints;
311     le_uint16   maxStorage;
312     le_uint16   maxFunctionDefs;
313     le_uint16   maxInstructionDefs;
314     le_uint16   maxStackElements;
315     le_uint16   maxSizeOfInstructions;
316     le_uint16   maxComponentElements;
317     le_uint16   maxComponentDepth;
318 };
319 
320 #ifndef __cplusplus
321 typedef struct MAXPTable MAXPTable;
322 #endif
323 
324 struct HHEATable
325 {
326     fixed       version;
327     le_int16    ascent;
328     le_int16    descent;
329     le_int16    lineGap;
330     le_uint16   advanceWidthMax;
331     le_int16    minLeftSideBearing;
332     le_int16    minRightSideBearing;
333     le_int16    xMaxExtent;
334     le_int16    caretSlopeRise;
335     le_int16    caretSlopeRun;
336     le_int16    caretOffset;
337     le_int16    reserved1;
338     le_int16    reserved2;
339     le_int16    reserved3;
340     le_int16    reserved4;
341     le_int16    metricDataFormat;
342     le_uint16   numOfLongHorMetrics;
343 };
344 
345 #ifndef __cplusplus
346 typedef struct HHEATable HHEATable;
347 #endif
348 
349 struct LongHorMetric
350 {
351     le_uint16   advanceWidth;
352     le_int16    leftSideBearing;
353 };
354 
355 #ifndef __cplusplus
356 typedef struct LongHorMetric LongHorMetric;
357 #endif
358 
359 struct HMTXTable
360 {
361     LongHorMetric hMetrics[ANY_NUMBER];       /* ANY_NUMBER = numOfLongHorMetrics from hhea table */
362 /* le_int16        leftSideBearing[ANY_NUMBER];  ANY_NUMBER = numGlyphs - numOfLongHorMetrics     */
363 };
364 
365 #ifndef __cplusplus
366 typedef struct HMTXTable HMTXTable;
367 #endif
368 
369 enum PlatformID
370 {
371     PLATFORM_UNICODE = 0,
372     PLATFORM_MACINTOSH = 1,
373     PLATFORM_ISO       = 2,
374     PLATFORM_MICROSOFT = 3,
375     PLATFORM_CUSTOM    = 4
376 };
377 
378 enum MacintoshEncodingID
379 {
380     MACINTOSH_ROMAN = 0
381 };
382 
383 enum MacintoshLanguageID
384 {
385     MACINTOSH_ENGLISH = 0
386 };
387 
388 enum MicrosoftEncodingID
389 {
390     MICROSOFT_UNICODE_BMP  =  1,
391     MICROSOFT_UNICODE_FULL = 10
392 };
393 
394 enum MicrosoftLanguageID
395 {
396     MICROSOFT_ENGLISH = 0x409
397 };
398 
399 enum NameID
400 {
401     NAME_COPYRIGHT_NOTICE     = 0,
402     NAME_FONT_FAMILY          = 1,
403     NAME_FONT_SUB_FAMILY      = 2,
404     NAME_UNIQUE_FONT_ID       = 3,
405     NAME_FULL_FONT_NAME       = 4,
406     NAME_VERSION_STRING       = 5,
407     NAME_POSTSCRIPT_NAME      = 6,
408     NAME_TRADEMARK            = 7,
409     NAME_MANUFACTURER         = 8,
410     NAME_DESIGNER             = 9,
411     NAME_DESCRIPTION          = 10,
412     NAME_VENDOR_URL           = 11,
413     NAME_DESIGNER_URL         = 12,
414     NAME_LICENSE_DESCRIPTION  = 13,
415     NAME_LICENSE_URL          = 14,
416     NAME_RESERVED             = 15,
417     NAME_PREFERRED_FAMILY     = 16,
418     NAME_PREFERRED_SUB_FAMILY = 17,
419     NAME_COMPATIBLE_FULL      = 18,
420     NAME_SAMPLE_TEXT          = 19,
421     NAME_POSTSCRIPT_CID       = 20
422 };
423 
424 struct NameRecord
425 {
426     le_uint16 platformID;
427     le_uint16 encodingID;
428     le_uint16 languageID;
429     le_uint16 nameID;
430     le_uint16 length;
431     le_uint16 offset;
432 };
433 
434 #ifndef __cplusplus
435 typedef struct NameRecord NameRecord;
436 #endif
437 
438 struct NAMETable
439 {
440     le_uint16 version;
441     le_uint16 count;
442     le_uint16 stringOffset;
443     NameRecord nameRecords[ANY_NUMBER];
444 };
445 
446 #ifndef __cplusplus
447 typedef struct NAMETable NAMETable;
448 #endif
449 
450 #endif
451 
452