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