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