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