|
1 /*************************************************************************** |
|
2 * |
|
3 * Copyright (C) 1998-2002, 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 |