| /*************************************************************************** |
| * |
| * Copyright (C) 1998-2002, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| * |
| ************************************************************************/ |
| |
| |
| #ifndef __FONTOBJECT_H |
| #define __FONTOBJECT_H |
| |
| #include <stdio.h> |
| |
| #include "LETypes.h" |
| |
| |
| #ifndef ANY_NUMBER |
| #define ANY_NUMBER 1 |
| #endif |
| |
| struct DirectoryEntry |
| { |
| le_uint32 tag; |
| le_uint32 checksum; |
| le_uint32 offset; |
| le_uint32 length; |
| }; |
| |
| struct SFNTDirectory |
| { |
| le_uint32 scalerType; |
| le_uint16 numTables; |
| le_uint16 searchRange; |
| le_uint16 entrySelector; |
| le_uint16 rangeShift; |
| DirectoryEntry tableDirectory[ANY_NUMBER]; |
| }; |
| |
| |
| struct CMAPEncodingSubtableHeader |
| { |
| le_uint16 platformID; |
| le_uint16 platformSpecificID; |
| le_uint32 encodingOffset; |
| }; |
| |
| struct CMAPTable |
| { |
| le_uint16 version; |
| le_uint16 numberSubtables; |
| CMAPEncodingSubtableHeader encodingSubtableHeaders[ANY_NUMBER]; |
| }; |
| |
| struct CMAPEncodingSubtable |
| { |
| le_uint16 format; |
| le_uint16 length; |
| le_uint16 language; |
| }; |
| |
| struct CMAPFormat0Encoding : CMAPEncodingSubtable |
| { |
| le_uint8 glyphIndexArray[256]; |
| }; |
| |
| struct CMAPFormat2Subheader |
| { |
| le_uint16 firstCode; |
| le_uint16 entryCount; |
| le_int16 idDelta; |
| le_uint16 idRangeOffset; |
| }; |
| |
| struct CMAPFormat2Encoding : CMAPEncodingSubtable |
| { |
| le_uint16 subHeadKeys[256]; |
| CMAPFormat2Subheader subheaders[ANY_NUMBER]; |
| }; |
| |
| struct CMAPFormat4Encoding : CMAPEncodingSubtable |
| { |
| le_uint16 segCountX2; |
| le_uint16 searchRange; |
| le_uint16 entrySelector; |
| le_uint16 rangeShift; |
| le_uint16 endCodes[ANY_NUMBER]; |
| // le_uint16 reservedPad; |
| // le_uint16 startCodes[ANY_NUMBER]; |
| // le_uint16 idDelta[ANY_NUMBER]; |
| // le_uint16 idRangeOffset[ANY_NUMBER]; |
| // le_uint16 glyphIndexArray[ANY_NUMBER]; |
| }; |
| |
| struct CMAPFormat6Encoding : CMAPEncodingSubtable |
| { |
| le_uint16 firstCode; |
| le_uint16 entryCount; |
| le_uint16 glyphIndexArray[ANY_NUMBER]; |
| }; |
| |
| typedef le_int32 fixed; |
| |
| struct BigDate |
| { |
| le_uint32 bc; |
| le_uint32 ad; |
| }; |
| |
| struct HEADTable |
| { |
| fixed version; |
| fixed fontRevision; |
| le_uint32 checksumAdjustment; |
| le_uint32 magicNumber; |
| le_uint16 flags; |
| le_uint16 unitsPerEm; |
| BigDate created; |
| BigDate modified; |
| le_int16 xMin; |
| le_int16 yMin; |
| le_int16 xMax; |
| le_int16 yMax; |
| le_int16 lowestRecPPEM; |
| le_int16 fontDirectionHint; |
| le_int16 indexToLocFormat; |
| le_int16 glyphDataFormat; |
| }; |
| |
| struct MAXPTable |
| { |
| fixed version; |
| le_uint16 numGlyphs; |
| le_uint16 maxPoints; |
| le_uint16 maxContours; |
| le_uint16 maxComponentPoints; |
| le_uint16 maxComponentContours; |
| le_uint16 maxZones; |
| le_uint16 maxTwilightPoints; |
| le_uint16 maxStorage; |
| le_uint16 maxFunctionDefs; |
| le_uint16 maxInstructionDefs; |
| le_uint16 maxStackElements; |
| le_uint16 maxSizeOfInstructions; |
| le_uint16 maxComponentElements; |
| le_uint16 maxComponentDepth; |
| }; |
| |
| struct HHEATable |
| { |
| fixed version; |
| le_int16 ascent; |
| le_int16 descent; |
| le_int16 lineGap; |
| le_uint16 advanceWidthMax; |
| le_int16 minLeftSideBearing; |
| le_int16 minRightSideBearing; |
| le_int16 xMaxExtent; |
| le_int16 caretSlopeRise; |
| le_int16 caretSlopeRun; |
| le_int16 caretOffset; |
| le_int16 reserved1; |
| le_int16 reserved2; |
| le_int16 reserved3; |
| le_int16 reserved4; |
| le_int16 metricDataFormat; |
| le_uint16 numOfLongHorMetrics; |
| }; |
| |
| struct LongHorMetric |
| { |
| le_uint16 advanceWidth; |
| le_int16 leftSideBearing; |
| }; |
| |
| struct HMTXTable |
| { |
| LongHorMetric hMetrics[ANY_NUMBER]; // ANY_NUMBER = numOfLongHorMetrics from hhea table |
| // le_int16 leftSideBearing[ANY_NUMBER]; // ANY_NUMBER = numGlyphs - numOfLongHorMetrics |
| }; |
| |
| class FontObject |
| { |
| public: |
| FontObject(char *fontName); |
| ~FontObject(); |
| |
| void *readTable(LETag tag, le_uint32 *length); |
| void deleteTable(void *table); |
| |
| LEGlyphID unicodeToGlyph(LEUnicode32 unicode); |
| |
| #if 0 |
| le_uint32 unicodesToGlyphs(LEUnicode *chars, le_uint32 nChars, LEGlyphID *glyphs, |
| le_uint32 *charIndices, le_bool rightToLeft); |
| #endif |
| |
| le_uint16 getUnitsPerEM(); |
| |
| le_uint16 getGlyphAdvance(LEGlyphID glyph); |
| |
| private: |
| FontObject(); |
| |
| DirectoryEntry *findTable(LETag tag); |
| CMAPEncodingSubtable *findCMAP(le_uint16 platformID, le_uint16 platformSpecificID); |
| void initUnicodeCMAP(); |
| |
| SFNTDirectory *directory; |
| le_uint16 numTables; |
| le_uint16 searchRange; |
| le_uint16 entrySelector; |
| le_uint16 rangeShift; |
| |
| CMAPTable *cmapTable; |
| le_uint16 cmSegCount; |
| le_uint16 cmSearchRange; |
| le_uint16 cmEntrySelector; |
| le_uint16 cmRangeShift; |
| le_uint16 *cmEndCodes; |
| le_uint16 *cmStartCodes; |
| le_uint16 *cmIdDelta; |
| le_uint16 *cmIdRangeOffset; |
| |
| HEADTable *headTable; |
| |
| HMTXTable *hmtxTable; |
| le_uint16 numGlyphs; |
| le_uint16 numOfLongHorMetrics; |
| |
| FILE *file; |
| |
| }; |
| |
| #endif |
| |