os/textandloc/fontservices/textshaperplugin/test/letest/FontObject.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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