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