// Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef CORE_FPDFAPI_FONT_CFX_CTTGSUBTABLE_H_ #define CORE_FPDFAPI_FONT_CFX_CTTGSUBTABLE_H_ #include <stdint.h> #include <memory> #include <set> #include <vector> #include "core/fxge/fx_freetype.h" class CFX_CTTGSUBTable { public: CFX_CTTGSUBTable(); ~CFX_CTTGSUBTable(); bool LoadGSUBTable(FT_Bytes gsub); bool GetVerticalGlyph(uint32_t glyphnum, uint32_t* vglyphnum); private: struct TLangSysRecord { TLangSysRecord(); ~TLangSysRecord(); uint32_t LangSysTag; uint16_t LookupOrder; uint16_t ReqFeatureIndex; std::vector<uint16_t> FeatureIndices; }; struct TScriptRecord { TScriptRecord(); ~TScriptRecord(); uint32_t ScriptTag; uint16_t DefaultLangSys; std::vector<TLangSysRecord> LangSysRecords; }; struct TFeatureRecord { TFeatureRecord(); ~TFeatureRecord(); uint32_t FeatureTag; uint16_t FeatureParams; std::vector<uint16_t> LookupListIndices; }; struct TRangeRecord { TRangeRecord(); uint16_t Start; uint16_t End; uint16_t StartCoverageIndex; }; struct TCoverageFormatBase { virtual ~TCoverageFormatBase() {} uint16_t CoverageFormat; }; struct TCoverageFormat1 : public TCoverageFormatBase { TCoverageFormat1(); ~TCoverageFormat1() override; std::vector<uint16_t> GlyphArray; }; struct TCoverageFormat2 : public TCoverageFormatBase { TCoverageFormat2(); ~TCoverageFormat2() override; std::vector<TRangeRecord> RangeRecords; }; struct TDevice { TDevice() : StartSize(0), EndSize(0), DeltaFormat(0) {} uint16_t StartSize; uint16_t EndSize; uint16_t DeltaFormat; }; struct TSubTableBase { TSubTableBase(); virtual ~TSubTableBase(); std::unique_ptr<TCoverageFormatBase> Coverage; uint16_t SubstFormat; }; struct TSubTable1 : public TSubTableBase { TSubTable1(); ~TSubTable1() override; int16_t DeltaGlyphID; }; struct TSubTable2 : public TSubTableBase { TSubTable2(); ~TSubTable2() override; std::vector<uint16_t> Substitutes; }; struct TLookup { TLookup(); ~TLookup(); uint16_t LookupType; uint16_t LookupFlag; std::vector<std::unique_ptr<TSubTableBase>> SubTables; }; bool Parse(FT_Bytes scriptlist, FT_Bytes featurelist, FT_Bytes lookuplist); void ParseScriptList(FT_Bytes raw); void ParseScript(FT_Bytes raw, TScriptRecord* rec); void ParseLangSys(FT_Bytes raw, TLangSysRecord* rec); void ParseFeatureList(FT_Bytes raw); void ParseFeature(FT_Bytes raw, TFeatureRecord* rec); void ParseLookupList(FT_Bytes raw); void ParseLookup(FT_Bytes raw, TLookup* rec); std::unique_ptr<TCoverageFormatBase> ParseCoverage(FT_Bytes raw); void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1* rec); void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2* rec); void ParseSingleSubst(FT_Bytes raw, std::unique_ptr<TSubTableBase>* rec); void ParseSingleSubstFormat1(FT_Bytes raw, TSubTable1* rec); void ParseSingleSubstFormat2(FT_Bytes raw, TSubTable2* rec); bool GetVerticalGlyphSub(uint32_t glyphnum, uint32_t* vglyphnum, TFeatureRecord* Feature); bool GetVerticalGlyphSub2(uint32_t glyphnum, uint32_t* vglyphnum, TLookup* Lookup); int GetCoverageIndex(TCoverageFormatBase* Coverage, uint32_t g) const; uint8_t GetUInt8(FT_Bytes& p) const; int16_t GetInt16(FT_Bytes& p) const; uint16_t GetUInt16(FT_Bytes& p) const; int32_t GetInt32(FT_Bytes& p) const; uint32_t GetUInt32(FT_Bytes& p) const; std::set<uint32_t> m_featureSet; bool m_bFeautureMapLoad; std::vector<TScriptRecord> ScriptList; std::vector<TFeatureRecord> FeatureList; std::vector<TLookup> LookupList; }; #endif // CORE_FPDFAPI_FONT_CFX_CTTGSUBTABLE_H_