1/*
2 ******************************************************************************
3 *
4 *   Copyright (C) 2016 and later: Unicode, Inc. and others.
5 *   License & terms of use: http://www.unicode.org/copyright.html#License
6 *
7 ******************************************************************************
8 ****************************************************************************** *
9 *
10 *   Copyright (C) 1999-2001, International Business Machines
11 *   Corporation and others.  All Rights Reserved.
12 *
13 ****************************************************************************** *
14 *   file name:  sfnt.h
15 *
16 *   created on: ??/??/2001
17 *   created by: Eric R. Mader
18 */
19
20#ifndef __SFNT_H
21#define __SFNT_H
22
23#include "LETypes.h"
24
25
26#ifndef ANY_NUMBER
27#define ANY_NUMBER 1
28#endif
29
30struct DirectoryEntry
31{
32    le_uint32   tag;
33    le_uint32   checksum;
34    le_uint32   offset;
35    le_uint32   length;
36};
37
38struct SFNTDirectory
39{
40    le_uint32       scalerType;
41    le_uint16       numTables;
42    le_uint16       searchRange;
43    le_uint16       entrySelector;
44    le_uint16       rangeShift;
45    DirectoryEntry  tableDirectory[ANY_NUMBER];
46};
47
48
49struct CMAPEncodingSubtableHeader
50{
51    le_uint16   platformID;
52    le_uint16   platformSpecificID;
53    le_uint32   encodingOffset;
54};
55
56struct CMAPTable
57{
58    le_uint16   version;
59    le_uint16   numberSubtables;
60    CMAPEncodingSubtableHeader encodingSubtableHeaders[ANY_NUMBER];
61};
62
63struct CMAPEncodingSubtable
64{
65    le_uint16   format;
66    le_uint16   length;
67    le_uint16   language;
68};
69
70struct CMAPFormat0Encoding : CMAPEncodingSubtable
71{
72    le_uint8    glyphIndexArray[256];
73};
74
75struct CMAPFormat2Subheader
76{
77    le_uint16   firstCode;
78    le_uint16   entryCount;
79    le_int16    idDelta;
80    le_uint16   idRangeOffset;
81};
82
83struct CMAPFormat2Encoding : CMAPEncodingSubtable
84{
85    le_uint16  subHeadKeys[256];
86    CMAPFormat2Subheader subheaders[ANY_NUMBER];
87};
88
89struct CMAPFormat4Encoding : CMAPEncodingSubtable
90{
91    le_uint16   segCountX2;
92    le_uint16   searchRange;
93    le_uint16   entrySelector;
94    le_uint16   rangeShift;
95    le_uint16   endCodes[ANY_NUMBER];
96//  le_uint16   reservedPad;
97//  le_uint16   startCodes[ANY_NUMBER];
98//  le_uint16   idDelta[ANY_NUMBER];
99//  le_uint16   idRangeOffset[ANY_NUMBER];
100//  le_uint16   glyphIndexArray[ANY_NUMBER];
101};
102
103struct CMAPFormat6Encoding : CMAPEncodingSubtable
104{
105    le_uint16   firstCode;
106    le_uint16   entryCount;
107    le_uint16   glyphIndexArray[ANY_NUMBER];
108};
109
110struct CMAPEncodingSubtable32
111{
112    le_uint32   format;
113    le_uint32   length;
114    le_uint32   language;
115};
116
117struct CMAPGroup
118{
119    le_uint32   startCharCode;
120    le_uint32   endCharCode;
121    le_uint32   startGlyphCode;
122};
123
124struct CMAPFormat8Encoding : CMAPEncodingSubtable32
125{
126    le_uint32   is32[65536/32];
127    le_uint32   nGroups;
128    CMAPGroup   groups[ANY_NUMBER];
129};
130
131struct CMAPFormat10Encoding : CMAPEncodingSubtable32
132{
133    le_uint32   startCharCode;
134    le_uint32   numCharCodes;
135    le_uint16   glyphs[ANY_NUMBER];
136};
137
138struct CMAPFormat12Encoding : CMAPEncodingSubtable32
139{
140    le_uint32   nGroups;
141    CMAPGroup   groups[ANY_NUMBER];
142};
143
144typedef le_int32 fixed;
145
146struct BigDate
147{
148    le_uint32   bc;
149    le_uint32   ad;
150};
151
152struct HEADTable
153{
154    fixed       version;
155    fixed       fontRevision;
156    le_uint32   checksumAdjustment;
157    le_uint32   magicNumber;
158    le_uint16   flags;
159    le_uint16   unitsPerEm;
160    BigDate     created;
161    BigDate     modified;
162    le_int16    xMin;
163    le_int16    yMin;
164    le_int16    xMax;
165    le_int16    yMax;
166    le_int16    lowestRecPPEM;
167    le_int16    fontDirectionHint;
168    le_int16    indexToLocFormat;
169    le_int16    glyphDataFormat;
170};
171
172struct MAXPTable
173{
174    fixed       version;
175    le_uint16   numGlyphs;
176    le_uint16   maxPoints;
177    le_uint16   maxContours;
178    le_uint16   maxComponentPoints;
179    le_uint16   maxComponentContours;
180    le_uint16   maxZones;
181    le_uint16   maxTwilightPoints;
182    le_uint16   maxStorage;
183    le_uint16   maxFunctionDefs;
184    le_uint16   maxInstructionDefs;
185    le_uint16   maxStackElements;
186    le_uint16   maxSizeOfInstructions;
187    le_uint16   maxComponentElements;
188    le_uint16   maxComponentDepth;
189};
190
191struct HHEATable
192{
193    fixed       version;
194    le_int16    ascent;
195    le_int16    descent;
196    le_int16    lineGap;
197    le_uint16   advanceWidthMax;
198    le_int16    minLeftSideBearing;
199    le_int16    minRightSideBearing;
200    le_int16    xMaxExtent;
201    le_int16    caretSlopeRise;
202    le_int16    caretSlopeRun;
203    le_int16    caretOffset;
204    le_int16    reserved1;
205    le_int16    reserved2;
206    le_int16    reserved3;
207    le_int16    reserved4;
208    le_int16    metricDataFormat;
209    le_uint16   numOfLongHorMetrics;
210};
211
212struct LongHorMetric
213{
214    le_uint16   advanceWidth;
215    le_int16    leftSideBearing;
216};
217
218struct HMTXTable
219{
220    LongHorMetric hMetrics[ANY_NUMBER];        // ANY_NUMBER = numOfLongHorMetrics from hhea table
221//  le_int16      leftSideBearing[ANY_NUMBER]; // ANY_NUMBER = numGlyphs - numOfLongHorMetrics
222};
223
224#endif
225
226