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