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