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 
21 struct DirectoryEntry
22 {
23     le_uint32   tag;
24     le_uint32   checksum;
25     le_uint32   offset;
26     le_uint32   length;
27 };
28 
29 struct 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 
40 struct CMAPEncodingSubtableHeader
41 {
42     le_uint16   platformID;
43     le_uint16   platformSpecificID;
44     le_uint32   encodingOffset;
45 };
46 
47 struct CMAPTable
48 {
49     le_uint16   version;
50     le_uint16   numberSubtables;
51     CMAPEncodingSubtableHeader encodingSubtableHeaders[ANY_NUMBER];
52 };
53 
54 struct CMAPEncodingSubtable
55 {
56     le_uint16   format;
57     le_uint16   length;
58     le_uint16   language;
59 };
60 
61 struct CMAPFormat0Encoding : CMAPEncodingSubtable
62 {
63     le_uint8    glyphIndexArray[256];
64 };
65 
66 struct CMAPFormat2Subheader
67 {
68     le_uint16   firstCode;
69     le_uint16   entryCount;
70     le_int16    idDelta;
71     le_uint16   idRangeOffset;
72 };
73 
74 struct CMAPFormat2Encoding : CMAPEncodingSubtable
75 {
76     le_uint16  subHeadKeys[256];
77     CMAPFormat2Subheader subheaders[ANY_NUMBER];
78 };
79 
80 struct 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 
94 struct CMAPFormat6Encoding : CMAPEncodingSubtable
95 {
96     le_uint16   firstCode;
97     le_uint16   entryCount;
98     le_uint16   glyphIndexArray[ANY_NUMBER];
99 };
100 
101 typedef le_int32 fixed;
102 
103 struct BigDate
104 {
105     le_uint32 bc;
106     le_uint32 ad;
107 };
108 
109 struct 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 
129 struct 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 
148 struct 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 
169 struct LongHorMetric
170 {
171     le_uint16   advanceWidth;
172     le_int16    leftSideBearing;
173 };
174 
175 struct 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 
181 class FontObject
182 {
183 public:
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 
201 private:
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