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