Home | History | Annotate | Download | only in fpdf_font
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #ifndef CORE_SRC_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_
      8 #define CORE_SRC_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_
      9 
     10 #include <stdint.h>
     11 
     12 #include <map>
     13 
     14 #include "core/include/fxcrt/fx_basic.h"
     15 #include "core/include/fxge/fx_font.h"
     16 #include "core/include/fxge/fx_freetype.h"
     17 
     18 class CFX_GlyphMap {
     19  public:
     20   CFX_GlyphMap();
     21   ~CFX_GlyphMap();
     22   void SetAt(int key, int value);
     23   FX_BOOL Lookup(int key, int& value);
     24 
     25  protected:
     26   CFX_BinaryBuf m_Buffer;
     27 };
     28 class CFX_CTTGSUBTable {
     29  public:
     30   CFX_CTTGSUBTable(void) : m_bFeautureMapLoad(FALSE), loaded(false) {}
     31   CFX_CTTGSUBTable(FT_Bytes gsub) : m_bFeautureMapLoad(FALSE), loaded(false) {
     32     LoadGSUBTable(gsub);
     33   }
     34   virtual ~CFX_CTTGSUBTable() {}
     35   bool IsOk(void) const { return loaded; }
     36   bool LoadGSUBTable(FT_Bytes gsub);
     37   bool GetVerticalGlyph(uint32_t glyphnum, uint32_t* vglyphnum);
     38 
     39  private:
     40   struct tt_gsub_header {
     41     uint32_t Version;
     42     uint16_t ScriptList;
     43     uint16_t FeatureList;
     44     uint16_t LookupList;
     45   };
     46   struct TLangSys {
     47     uint16_t LookupOrder;
     48     uint16_t ReqFeatureIndex;
     49     uint16_t FeatureCount;
     50     uint16_t* FeatureIndex;
     51     TLangSys()
     52         : LookupOrder(0),
     53           ReqFeatureIndex(0),
     54           FeatureCount(0),
     55           FeatureIndex(NULL) {}
     56     ~TLangSys() { delete[] FeatureIndex; }
     57 
     58    private:
     59     TLangSys(const TLangSys&);
     60     TLangSys& operator=(const TLangSys&);
     61   };
     62   struct TLangSysRecord {
     63     uint32_t LangSysTag;
     64     struct TLangSys LangSys;
     65     TLangSysRecord() : LangSysTag(0) {}
     66 
     67    private:
     68     TLangSysRecord(const TLangSysRecord&);
     69     TLangSysRecord& operator=(const TLangSysRecord&);
     70   };
     71   struct TScript {
     72     uint16_t DefaultLangSys;
     73     uint16_t LangSysCount;
     74     struct TLangSysRecord* LangSysRecord;
     75     TScript() : DefaultLangSys(0), LangSysCount(0), LangSysRecord(NULL) {}
     76     ~TScript() { delete[] LangSysRecord; }
     77 
     78    private:
     79     TScript(const TScript&);
     80     TScript& operator=(const TScript&);
     81   };
     82   struct TScriptRecord {
     83     uint32_t ScriptTag;
     84     struct TScript Script;
     85     TScriptRecord() : ScriptTag(0) {}
     86 
     87    private:
     88     TScriptRecord(const TScriptRecord&);
     89     TScriptRecord& operator=(const TScriptRecord&);
     90   };
     91   struct TScriptList {
     92     uint16_t ScriptCount;
     93     struct TScriptRecord* ScriptRecord;
     94     TScriptList() : ScriptCount(0), ScriptRecord(NULL) {}
     95     ~TScriptList() { delete[] ScriptRecord; }
     96 
     97    private:
     98     TScriptList(const TScriptList&);
     99     TScriptList& operator=(const TScriptList&);
    100   };
    101   struct TFeature {
    102     uint16_t FeatureParams;
    103     int LookupCount;
    104     uint16_t* LookupListIndex;
    105     TFeature() : FeatureParams(0), LookupCount(0), LookupListIndex(NULL) {}
    106     ~TFeature() { delete[] LookupListIndex; }
    107 
    108    private:
    109     TFeature(const TFeature&);
    110     TFeature& operator=(const TFeature&);
    111   };
    112   struct TFeatureRecord {
    113     uint32_t FeatureTag;
    114     struct TFeature Feature;
    115     TFeatureRecord() : FeatureTag(0) {}
    116 
    117    private:
    118     TFeatureRecord(const TFeatureRecord&);
    119     TFeatureRecord& operator=(const TFeatureRecord&);
    120   };
    121   struct TFeatureList {
    122     int FeatureCount;
    123     struct TFeatureRecord* FeatureRecord;
    124     TFeatureList() : FeatureCount(0), FeatureRecord(NULL) {}
    125     ~TFeatureList() { delete[] FeatureRecord; }
    126 
    127    private:
    128     TFeatureList(const TFeatureList&);
    129     TFeatureList& operator=(const TFeatureList&);
    130   };
    131   enum TLookupFlag {
    132     LOOKUPFLAG_RightToLeft = 0x0001,
    133     LOOKUPFLAG_IgnoreBaseGlyphs = 0x0002,
    134     LOOKUPFLAG_IgnoreLigatures = 0x0004,
    135     LOOKUPFLAG_IgnoreMarks = 0x0008,
    136     LOOKUPFLAG_Reserved = 0x00F0,
    137     LOOKUPFLAG_MarkAttachmentType = 0xFF00,
    138   };
    139   struct TCoverageFormatBase {
    140     uint16_t CoverageFormat;
    141     CFX_GlyphMap m_glyphMap;
    142     TCoverageFormatBase() : CoverageFormat(0) {}
    143     virtual ~TCoverageFormatBase() {}
    144 
    145    private:
    146     TCoverageFormatBase(const TCoverageFormatBase&);
    147     TCoverageFormatBase& operator=(const TCoverageFormatBase&);
    148   };
    149   struct TCoverageFormat1 : public TCoverageFormatBase {
    150     uint16_t GlyphCount;
    151     uint16_t* GlyphArray;
    152     TCoverageFormat1() : GlyphCount(0), GlyphArray(NULL) { CoverageFormat = 1; }
    153     ~TCoverageFormat1() override { delete[] GlyphArray; }
    154 
    155    private:
    156     TCoverageFormat1(const TCoverageFormat1&);
    157     TCoverageFormat1& operator=(const TCoverageFormat1&);
    158   };
    159   struct TRangeRecord {
    160     uint16_t Start;
    161     uint16_t End;
    162     uint16_t StartCoverageIndex;
    163     TRangeRecord() : Start(0), End(0), StartCoverageIndex(0) {}
    164     friend bool operator>(const TRangeRecord& r1, const TRangeRecord& r2) {
    165       return r1.Start > r2.Start;
    166     }
    167 
    168    private:
    169     TRangeRecord(const TRangeRecord&);
    170   };
    171   struct TCoverageFormat2 : public TCoverageFormatBase {
    172     uint16_t RangeCount;
    173     struct TRangeRecord* RangeRecord;
    174     TCoverageFormat2() : RangeCount(0), RangeRecord(NULL) {
    175       CoverageFormat = 2;
    176     }
    177     ~TCoverageFormat2() override { delete[] RangeRecord; }
    178 
    179    private:
    180     TCoverageFormat2(const TCoverageFormat2&);
    181     TCoverageFormat2& operator=(const TCoverageFormat2&);
    182   };
    183   struct TClassDefFormatBase {
    184     uint16_t ClassFormat;
    185     TClassDefFormatBase() : ClassFormat(0) {}
    186     virtual ~TClassDefFormatBase() {}
    187 
    188    private:
    189     TClassDefFormatBase(const TClassDefFormatBase&);
    190     TClassDefFormatBase& operator=(const TClassDefFormatBase&);
    191   };
    192   struct TClassDefFormat1 : public TClassDefFormatBase {
    193     uint16_t StartGlyph;
    194     uint16_t GlyphCount;
    195     uint16_t* ClassValueArray;
    196     TClassDefFormat1() : StartGlyph(0), GlyphCount(0), ClassValueArray(NULL) {
    197       ClassFormat = 1;
    198     }
    199     ~TClassDefFormat1() override { delete[] ClassValueArray; }
    200 
    201    private:
    202     TClassDefFormat1(const TClassDefFormat1&);
    203     TClassDefFormat1& operator=(const TClassDefFormat1&);
    204   };
    205   struct TClassRangeRecord {
    206     uint16_t Start;
    207     uint16_t End;
    208     uint16_t Class;
    209     TClassRangeRecord() : Start(0), End(0), Class(0) {}
    210 
    211    private:
    212     TClassRangeRecord(const TClassRangeRecord&);
    213     TClassRangeRecord& operator=(const TClassRangeRecord&);
    214   };
    215   struct TClassDefFormat2 : public TClassDefFormatBase {
    216     uint16_t ClassRangeCount;
    217     struct TClassRangeRecord* ClassRangeRecord;
    218     TClassDefFormat2() : ClassRangeCount(0), ClassRangeRecord(NULL) {
    219       ClassFormat = 2;
    220     }
    221     ~TClassDefFormat2() override { delete[] ClassRangeRecord; }
    222 
    223    private:
    224     TClassDefFormat2(const TClassDefFormat2&);
    225     TClassDefFormat2& operator=(const TClassDefFormat2&);
    226   };
    227   struct TDevice {
    228     uint16_t StartSize;
    229     uint16_t EndSize;
    230     uint16_t DeltaFormat;
    231     TDevice() : StartSize(0), EndSize(0), DeltaFormat(0) {}
    232 
    233    private:
    234     TDevice(const TDevice&);
    235     TDevice& operator=(const TDevice&);
    236   };
    237   struct TSubTableBase {
    238     uint16_t SubstFormat;
    239     TSubTableBase() : SubstFormat(0) {}
    240     virtual ~TSubTableBase() {}
    241 
    242    private:
    243     TSubTableBase(const TSubTableBase&);
    244     TSubTableBase& operator=(const TSubTableBase&);
    245   };
    246   struct TSingleSubstFormat1 : public TSubTableBase {
    247     TCoverageFormatBase* Coverage;
    248     int16_t DeltaGlyphID;
    249     TSingleSubstFormat1() : Coverage(NULL), DeltaGlyphID(0) { SubstFormat = 1; }
    250     ~TSingleSubstFormat1() override { delete Coverage; }
    251 
    252    private:
    253     TSingleSubstFormat1(const TSingleSubstFormat1&);
    254     TSingleSubstFormat1& operator=(const TSingleSubstFormat1&);
    255   };
    256   struct TSingleSubstFormat2 : public TSubTableBase {
    257     TCoverageFormatBase* Coverage;
    258     uint16_t GlyphCount;
    259     uint16_t* Substitute;
    260     TSingleSubstFormat2() : Coverage(NULL), GlyphCount(0), Substitute(NULL) {
    261       SubstFormat = 2;
    262     }
    263     ~TSingleSubstFormat2() override {
    264       delete Coverage;
    265       delete[] Substitute;
    266     }
    267 
    268    private:
    269     TSingleSubstFormat2(const TSingleSubstFormat2&);
    270     TSingleSubstFormat2& operator=(const TSingleSubstFormat2&);
    271   };
    272   struct TLookup {
    273     uint16_t LookupType;
    274     uint16_t LookupFlag;
    275     uint16_t SubTableCount;
    276     struct TSubTableBase** SubTable;
    277     TLookup()
    278         : LookupType(0), LookupFlag(0), SubTableCount(0), SubTable(NULL) {}
    279     ~TLookup() {
    280       if (SubTable) {
    281         for (int i = 0; i < SubTableCount; ++i)
    282           delete SubTable[i];
    283         delete[] SubTable;
    284       }
    285     }
    286 
    287    private:
    288     TLookup(const TLookup&);
    289     TLookup& operator=(const TLookup&);
    290   };
    291   struct TLookupList {
    292     int LookupCount;
    293     struct TLookup* Lookup;
    294     TLookupList() : LookupCount(0), Lookup(NULL) {}
    295     ~TLookupList() { delete[] Lookup; }
    296 
    297    private:
    298     TLookupList(const TLookupList&);
    299     TLookupList& operator=(const TLookupList&);
    300   };
    301   bool Parse(FT_Bytes scriptlist, FT_Bytes featurelist, FT_Bytes lookuplist);
    302   void ParseScriptList(FT_Bytes raw, TScriptList* rec);
    303   void ParseScript(FT_Bytes raw, TScript* rec);
    304   void ParseLangSys(FT_Bytes raw, TLangSys* rec);
    305   void ParseFeatureList(FT_Bytes raw, TFeatureList* rec);
    306   void ParseFeature(FT_Bytes raw, TFeature* rec);
    307   void ParseLookupList(FT_Bytes raw, TLookupList* rec);
    308   void ParseLookup(FT_Bytes raw, TLookup* rec);
    309   void ParseCoverage(FT_Bytes raw, TCoverageFormatBase** rec);
    310   void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1* rec);
    311   void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2* rec);
    312   void ParseSingleSubst(FT_Bytes raw, TSubTableBase** rec);
    313   void ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1* rec);
    314   void ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2* rec);
    315   bool GetVerticalGlyphSub(uint32_t glyphnum,
    316                            uint32_t* vglyphnum,
    317                            struct TFeature* Feature);
    318   bool GetVerticalGlyphSub2(uint32_t glyphnum,
    319                             uint32_t* vglyphnum,
    320                             struct TLookup* Lookup);
    321   int GetCoverageIndex(struct TCoverageFormatBase* Coverage, uint32_t g);
    322   uint8_t GetUInt8(FT_Bytes& p) const {
    323     uint8_t ret = p[0];
    324     p += 1;
    325     return ret;
    326   }
    327   int16_t GetInt16(FT_Bytes& p) const {
    328     uint16_t ret = p[0] << 8 | p[1];
    329     p += 2;
    330     return *(int16_t*)&ret;
    331   }
    332   uint16_t GetUInt16(FT_Bytes& p) const {
    333     uint16_t ret = p[0] << 8 | p[1];
    334     p += 2;
    335     return ret;
    336   }
    337   int32_t GetInt32(FT_Bytes& p) const {
    338     uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
    339     p += 4;
    340     return *(int32_t*)&ret;
    341   }
    342   uint32_t GetUInt32(FT_Bytes& p) const {
    343     uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
    344     p += 4;
    345     return ret;
    346   }
    347   std::map<FX_DWORD, FX_DWORD> m_featureMap;
    348   FX_BOOL m_bFeautureMapLoad;
    349   bool loaded;
    350   struct tt_gsub_header header;
    351   struct TScriptList ScriptList;
    352   struct TFeatureList FeatureList;
    353   struct TLookupList LookupList;
    354 };
    355 class CFX_GSUBTable final : public IFX_GSUBTable {
    356  public:
    357   ~CFX_GSUBTable() override {}
    358   FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum) override;
    359 
    360   CFX_CTTGSUBTable m_GsubImp;
    361 };
    362 
    363 #endif  // CORE_SRC_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_
    364