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 21struct DirectoryEntry 22{ 23 le_uint32 tag; 24 le_uint32 checksum; 25 le_uint32 offset; 26 le_uint32 length; 27}; 28 29struct 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 40struct CMAPEncodingSubtableHeader 41{ 42 le_uint16 platformID; 43 le_uint16 platformSpecificID; 44 le_uint32 encodingOffset; 45}; 46 47struct CMAPTable 48{ 49 le_uint16 version; 50 le_uint16 numberSubtables; 51 CMAPEncodingSubtableHeader encodingSubtableHeaders[ANY_NUMBER]; 52}; 53 54struct CMAPEncodingSubtable 55{ 56 le_uint16 format; 57 le_uint16 length; 58 le_uint16 language; 59}; 60 61struct CMAPFormat0Encoding : CMAPEncodingSubtable 62{ 63 le_uint8 glyphIndexArray[256]; 64}; 65 66struct CMAPFormat2Subheader 67{ 68 le_uint16 firstCode; 69 le_uint16 entryCount; 70 le_int16 idDelta; 71 le_uint16 idRangeOffset; 72}; 73 74struct CMAPFormat2Encoding : CMAPEncodingSubtable 75{ 76 le_uint16 subHeadKeys[256]; 77 CMAPFormat2Subheader subheaders[ANY_NUMBER]; 78}; 79 80struct 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 94struct CMAPFormat6Encoding : CMAPEncodingSubtable 95{ 96 le_uint16 firstCode; 97 le_uint16 entryCount; 98 le_uint16 glyphIndexArray[ANY_NUMBER]; 99}; 100 101typedef le_int32 fixed; 102 103struct BigDate 104{ 105 le_uint32 bc; 106 le_uint32 ad; 107}; 108 109struct 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 129struct 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 148struct 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 169struct LongHorMetric 170{ 171 le_uint16 advanceWidth; 172 le_int16 leftSideBearing; 173}; 174 175struct 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 181class FontObject 182{ 183public: 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 201private: 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 236