]> git.saurik.com Git - apple/icu.git/blob - icuSources/test/letest/FontObject.h
ICU-511.25.tar.gz
[apple/icu.git] / icuSources / test / letest / FontObject.h
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