159d709d503bab6e2b61931737e662dd293b40578ccornelius/*************************************************************************** 259d709d503bab6e2b61931737e662dd293b40578ccornelius* 359d709d503bab6e2b61931737e662dd293b40578ccornelius* Copyright (C) 1998-2013, International Business Machines 459d709d503bab6e2b61931737e662dd293b40578ccornelius* Corporation and others. All Rights Reserved. 559d709d503bab6e2b61931737e662dd293b40578ccornelius* 659d709d503bab6e2b61931737e662dd293b40578ccornelius************************************************************************/ 759d709d503bab6e2b61931737e662dd293b40578ccornelius 859d709d503bab6e2b61931737e662dd293b40578ccornelius 959d709d503bab6e2b61931737e662dd293b40578ccornelius#ifndef __FONTOBJECT_H 1059d709d503bab6e2b61931737e662dd293b40578ccornelius#define __FONTOBJECT_H 1159d709d503bab6e2b61931737e662dd293b40578ccornelius 1259d709d503bab6e2b61931737e662dd293b40578ccornelius#include <stdio.h> 1359d709d503bab6e2b61931737e662dd293b40578ccornelius 1459d709d503bab6e2b61931737e662dd293b40578ccornelius#include "LETypes.h" 1559d709d503bab6e2b61931737e662dd293b40578ccornelius 1659d709d503bab6e2b61931737e662dd293b40578ccornelius 1759d709d503bab6e2b61931737e662dd293b40578ccornelius#ifndef ANY_NUMBER 1859d709d503bab6e2b61931737e662dd293b40578ccornelius#define ANY_NUMBER 1 1959d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 2059d709d503bab6e2b61931737e662dd293b40578ccornelius 2159d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct DirectoryEntry 2259d709d503bab6e2b61931737e662dd293b40578ccornelius{ 2359d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint32 tag; 2459d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint32 checksum; 2559d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint32 offset; 2659d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint32 length; 2759d709d503bab6e2b61931737e662dd293b40578ccornelius}; 2859d709d503bab6e2b61931737e662dd293b40578ccornelius 2959d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct SFNTDirectory 3059d709d503bab6e2b61931737e662dd293b40578ccornelius{ 3159d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint32 scalerType; 3259d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 numTables; 3359d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 searchRange; 3459d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 entrySelector; 3559d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 rangeShift; 3659d709d503bab6e2b61931737e662dd293b40578ccornelius DirectoryEntry tableDirectory[ANY_NUMBER]; 3759d709d503bab6e2b61931737e662dd293b40578ccornelius}; 3859d709d503bab6e2b61931737e662dd293b40578ccornelius 3959d709d503bab6e2b61931737e662dd293b40578ccornelius 4059d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct CMAPEncodingSubtableHeader 4159d709d503bab6e2b61931737e662dd293b40578ccornelius{ 4259d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 platformID; 4359d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 platformSpecificID; 4459d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint32 encodingOffset; 4559d709d503bab6e2b61931737e662dd293b40578ccornelius}; 4659d709d503bab6e2b61931737e662dd293b40578ccornelius 4759d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct CMAPTable 4859d709d503bab6e2b61931737e662dd293b40578ccornelius{ 4959d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 version; 5059d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 numberSubtables; 5159d709d503bab6e2b61931737e662dd293b40578ccornelius CMAPEncodingSubtableHeader encodingSubtableHeaders[ANY_NUMBER]; 5259d709d503bab6e2b61931737e662dd293b40578ccornelius}; 5359d709d503bab6e2b61931737e662dd293b40578ccornelius 5459d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct CMAPEncodingSubtable 5559d709d503bab6e2b61931737e662dd293b40578ccornelius{ 5659d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 format; 5759d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 length; 5859d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 language; 5959d709d503bab6e2b61931737e662dd293b40578ccornelius}; 6059d709d503bab6e2b61931737e662dd293b40578ccornelius 6159d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct CMAPFormat0Encoding : CMAPEncodingSubtable 6259d709d503bab6e2b61931737e662dd293b40578ccornelius{ 6359d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint8 glyphIndexArray[256]; 6459d709d503bab6e2b61931737e662dd293b40578ccornelius}; 6559d709d503bab6e2b61931737e662dd293b40578ccornelius 6659d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct CMAPFormat2Subheader 6759d709d503bab6e2b61931737e662dd293b40578ccornelius{ 6859d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 firstCode; 6959d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 entryCount; 7059d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 idDelta; 7159d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 idRangeOffset; 7259d709d503bab6e2b61931737e662dd293b40578ccornelius}; 7359d709d503bab6e2b61931737e662dd293b40578ccornelius 7459d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct CMAPFormat2Encoding : CMAPEncodingSubtable 7559d709d503bab6e2b61931737e662dd293b40578ccornelius{ 7659d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 subHeadKeys[256]; 7759d709d503bab6e2b61931737e662dd293b40578ccornelius CMAPFormat2Subheader subheaders[ANY_NUMBER]; 7859d709d503bab6e2b61931737e662dd293b40578ccornelius}; 7959d709d503bab6e2b61931737e662dd293b40578ccornelius 8059d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct CMAPFormat4Encoding : CMAPEncodingSubtable 8159d709d503bab6e2b61931737e662dd293b40578ccornelius{ 8259d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 segCountX2; 8359d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 searchRange; 8459d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 entrySelector; 8559d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 rangeShift; 8659d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 endCodes[ANY_NUMBER]; 8759d709d503bab6e2b61931737e662dd293b40578ccornelius// le_uint16 reservedPad; 8859d709d503bab6e2b61931737e662dd293b40578ccornelius// le_uint16 startCodes[ANY_NUMBER]; 8959d709d503bab6e2b61931737e662dd293b40578ccornelius// le_uint16 idDelta[ANY_NUMBER]; 9059d709d503bab6e2b61931737e662dd293b40578ccornelius// le_uint16 idRangeOffset[ANY_NUMBER]; 9159d709d503bab6e2b61931737e662dd293b40578ccornelius// le_uint16 glyphIndexArray[ANY_NUMBER]; 9259d709d503bab6e2b61931737e662dd293b40578ccornelius}; 9359d709d503bab6e2b61931737e662dd293b40578ccornelius 9459d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct CMAPFormat6Encoding : CMAPEncodingSubtable 9559d709d503bab6e2b61931737e662dd293b40578ccornelius{ 9659d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 firstCode; 9759d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 entryCount; 9859d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 glyphIndexArray[ANY_NUMBER]; 9959d709d503bab6e2b61931737e662dd293b40578ccornelius}; 10059d709d503bab6e2b61931737e662dd293b40578ccornelius 10159d709d503bab6e2b61931737e662dd293b40578ccorneliustypedef le_int32 fixed; 10259d709d503bab6e2b61931737e662dd293b40578ccornelius 10359d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct BigDate 10459d709d503bab6e2b61931737e662dd293b40578ccornelius{ 10559d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint32 bc; 10659d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint32 ad; 10759d709d503bab6e2b61931737e662dd293b40578ccornelius}; 10859d709d503bab6e2b61931737e662dd293b40578ccornelius 10959d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct HEADTable 11059d709d503bab6e2b61931737e662dd293b40578ccornelius{ 11159d709d503bab6e2b61931737e662dd293b40578ccornelius fixed version; 11259d709d503bab6e2b61931737e662dd293b40578ccornelius fixed fontRevision; 11359d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint32 checksumAdjustment; 11459d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint32 magicNumber; 11559d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 flags; 11659d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 unitsPerEm; 11759d709d503bab6e2b61931737e662dd293b40578ccornelius BigDate created; 11859d709d503bab6e2b61931737e662dd293b40578ccornelius BigDate modified; 11959d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 xMin; 12059d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 yMin; 12159d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 xMax; 12259d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 yMax; 12359d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 lowestRecPPEM; 12459d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 fontDirectionHint; 12559d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 indexToLocFormat; 12659d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 glyphDataFormat; 12759d709d503bab6e2b61931737e662dd293b40578ccornelius}; 12859d709d503bab6e2b61931737e662dd293b40578ccornelius 12959d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct MAXPTable 13059d709d503bab6e2b61931737e662dd293b40578ccornelius{ 13159d709d503bab6e2b61931737e662dd293b40578ccornelius fixed version; 13259d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 numGlyphs; 13359d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 maxPoints; 13459d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 maxContours; 13559d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 maxComponentPoints; 13659d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 maxComponentContours; 13759d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 maxZones; 13859d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 maxTwilightPoints; 13959d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 maxStorage; 14059d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 maxFunctionDefs; 14159d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 maxInstructionDefs; 14259d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 maxStackElements; 14359d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 maxSizeOfInstructions; 14459d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 maxComponentElements; 14559d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 maxComponentDepth; 14659d709d503bab6e2b61931737e662dd293b40578ccornelius}; 14759d709d503bab6e2b61931737e662dd293b40578ccornelius 14859d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct HHEATable 14959d709d503bab6e2b61931737e662dd293b40578ccornelius{ 15059d709d503bab6e2b61931737e662dd293b40578ccornelius fixed version; 15159d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 ascent; 15259d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 descent; 15359d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 lineGap; 15459d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 advanceWidthMax; 15559d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 minLeftSideBearing; 15659d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 minRightSideBearing; 15759d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 xMaxExtent; 15859d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 caretSlopeRise; 15959d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 caretSlopeRun; 16059d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 caretOffset; 16159d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 reserved1; 16259d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 reserved2; 16359d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 reserved3; 16459d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 reserved4; 16559d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 metricDataFormat; 16659d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 numOfLongHorMetrics; 16759d709d503bab6e2b61931737e662dd293b40578ccornelius}; 16859d709d503bab6e2b61931737e662dd293b40578ccornelius 16959d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct LongHorMetric 17059d709d503bab6e2b61931737e662dd293b40578ccornelius{ 17159d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 advanceWidth; 17259d709d503bab6e2b61931737e662dd293b40578ccornelius le_int16 leftSideBearing; 17359d709d503bab6e2b61931737e662dd293b40578ccornelius}; 17459d709d503bab6e2b61931737e662dd293b40578ccornelius 17559d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct HMTXTable 17659d709d503bab6e2b61931737e662dd293b40578ccornelius{ 17759d709d503bab6e2b61931737e662dd293b40578ccornelius LongHorMetric hMetrics[ANY_NUMBER]; // ANY_NUMBER = numOfLongHorMetrics from hhea table 17859d709d503bab6e2b61931737e662dd293b40578ccornelius// le_int16 leftSideBearing[ANY_NUMBER]; // ANY_NUMBER = numGlyphs - numOfLongHorMetrics 17959d709d503bab6e2b61931737e662dd293b40578ccornelius}; 18059d709d503bab6e2b61931737e662dd293b40578ccornelius 18159d709d503bab6e2b61931737e662dd293b40578ccorneliusclass FontObject 18259d709d503bab6e2b61931737e662dd293b40578ccornelius{ 18359d709d503bab6e2b61931737e662dd293b40578ccorneliuspublic: 18459d709d503bab6e2b61931737e662dd293b40578ccornelius FontObject(char *fontName); 18559d709d503bab6e2b61931737e662dd293b40578ccornelius ~FontObject(); 18659d709d503bab6e2b61931737e662dd293b40578ccornelius 18759d709d503bab6e2b61931737e662dd293b40578ccornelius void *readTable(LETag tag, le_uint32 *length); 18859d709d503bab6e2b61931737e662dd293b40578ccornelius void deleteTable(void *table); 18959d709d503bab6e2b61931737e662dd293b40578ccornelius 19059d709d503bab6e2b61931737e662dd293b40578ccornelius LEGlyphID unicodeToGlyph(LEUnicode32 unicode); 19159d709d503bab6e2b61931737e662dd293b40578ccornelius 19259d709d503bab6e2b61931737e662dd293b40578ccornelius#if 0 19359d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint32 unicodesToGlyphs(LEUnicode *chars, le_uint32 nChars, LEGlyphID *glyphs, 19459d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint32 *charIndices, le_bool rightToLeft); 19559d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 19659d709d503bab6e2b61931737e662dd293b40578ccornelius 19759d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 getUnitsPerEM(); 19859d709d503bab6e2b61931737e662dd293b40578ccornelius 19959d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 getGlyphAdvance(LEGlyphID glyph); 20059d709d503bab6e2b61931737e662dd293b40578ccornelius 20159d709d503bab6e2b61931737e662dd293b40578ccorneliusprivate: 20259d709d503bab6e2b61931737e662dd293b40578ccornelius FontObject(); 20359d709d503bab6e2b61931737e662dd293b40578ccornelius 20459d709d503bab6e2b61931737e662dd293b40578ccornelius DirectoryEntry *findTable(LETag tag); 20559d709d503bab6e2b61931737e662dd293b40578ccornelius CMAPEncodingSubtable *findCMAP(le_uint16 platformID, le_uint16 platformSpecificID); 20659d709d503bab6e2b61931737e662dd293b40578ccornelius void initUnicodeCMAP(); 20759d709d503bab6e2b61931737e662dd293b40578ccornelius 20859d709d503bab6e2b61931737e662dd293b40578ccornelius SFNTDirectory *directory; 20959d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 numTables; 21059d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 searchRange; 21159d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 entrySelector; 21259d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 rangeShift; 21359d709d503bab6e2b61931737e662dd293b40578ccornelius 21459d709d503bab6e2b61931737e662dd293b40578ccornelius CMAPTable *cmapTable; 21559d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 cmSegCount; 21659d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 cmSearchRange; 21759d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 cmEntrySelector; 21859d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 cmRangeShift; 21959d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 *cmEndCodes; 22059d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 *cmStartCodes; 22159d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 *cmIdDelta; 22259d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 *cmIdRangeOffset; 22359d709d503bab6e2b61931737e662dd293b40578ccornelius 22459d709d503bab6e2b61931737e662dd293b40578ccornelius HEADTable *headTable; 22559d709d503bab6e2b61931737e662dd293b40578ccornelius 22659d709d503bab6e2b61931737e662dd293b40578ccornelius HMTXTable *hmtxTable; 22759d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 numGlyphs; 22859d709d503bab6e2b61931737e662dd293b40578ccornelius le_uint16 numOfLongHorMetrics; 22959d709d503bab6e2b61931737e662dd293b40578ccornelius 23059d709d503bab6e2b61931737e662dd293b40578ccornelius FILE *file; 23159d709d503bab6e2b61931737e662dd293b40578ccornelius 23259d709d503bab6e2b61931737e662dd293b40578ccornelius}; 23359d709d503bab6e2b61931737e662dd293b40578ccornelius 23459d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 23559d709d503bab6e2b61931737e662dd293b40578ccornelius 236