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