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