| // Copyright 2014 The PDFium Authors |
| // 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/fxcrt/data_vector.h" |
| #include "core/fxge/freetype/fx_freetype.h" |
| #include "third_party/abseil-cpp/absl/types/optional.h" |
| |
| class CFX_CTTGSUBTable { |
| public: |
| explicit CFX_CTTGSUBTable(FT_Bytes gsub); |
| ~CFX_CTTGSUBTable(); |
| |
| uint32_t GetVerticalGlyph(uint32_t glyphnum) const; |
| |
| private: |
| struct TLangSysRecord { |
| TLangSysRecord(); |
| ~TLangSysRecord(); |
| |
| uint32_t LangSysTag = 0; |
| uint16_t LookupOrder = 0; |
| uint16_t ReqFeatureIndex = 0; |
| DataVector<uint16_t> FeatureIndices; |
| }; |
| |
| struct TScriptRecord { |
| TScriptRecord(); |
| ~TScriptRecord(); |
| |
| uint32_t ScriptTag = 0; |
| uint16_t DefaultLangSys = 0; |
| std::vector<TLangSysRecord> LangSysRecords; |
| }; |
| |
| struct TFeatureRecord { |
| TFeatureRecord(); |
| ~TFeatureRecord(); |
| |
| uint32_t FeatureTag = 0; |
| uint16_t FeatureParams = 0; |
| DataVector<uint16_t> LookupListIndices; |
| }; |
| |
| struct TRangeRecord { |
| TRangeRecord(); |
| |
| uint16_t Start = 0; |
| uint16_t End = 0; |
| uint16_t StartCoverageIndex = 0; |
| }; |
| |
| struct TCoverageFormatBase { |
| explicit TCoverageFormatBase(uint16_t format) : CoverageFormat(format) {} |
| virtual ~TCoverageFormatBase() = default; |
| |
| const uint16_t CoverageFormat; |
| }; |
| |
| struct TCoverageFormat1 final : public TCoverageFormatBase { |
| explicit TCoverageFormat1(size_t initial_size); |
| ~TCoverageFormat1() override; |
| |
| DataVector<uint16_t> GlyphArray; |
| }; |
| |
| struct TCoverageFormat2 final : public TCoverageFormatBase { |
| explicit TCoverageFormat2(size_t initial_size); |
| ~TCoverageFormat2() override; |
| |
| std::vector<TRangeRecord> RangeRecords; |
| }; |
| |
| struct TDevice { |
| TDevice(); |
| |
| uint16_t StartSize = 0; |
| uint16_t EndSize = 0; |
| uint16_t DeltaFormat = 0; |
| }; |
| |
| struct TSubTableBase { |
| explicit TSubTableBase(uint16_t format); |
| virtual ~TSubTableBase(); |
| |
| const uint16_t SubstFormat; |
| std::unique_ptr<TCoverageFormatBase> Coverage; |
| }; |
| |
| struct TSubTable1 final : public TSubTableBase { |
| TSubTable1(); |
| ~TSubTable1() override; |
| |
| int16_t DeltaGlyphID = 0; |
| }; |
| |
| struct TSubTable2 final : public TSubTableBase { |
| TSubTable2(); |
| ~TSubTable2() override; |
| |
| DataVector<uint16_t> Substitutes; |
| }; |
| |
| struct TLookup { |
| TLookup(); |
| ~TLookup(); |
| |
| uint16_t LookupType = 0; |
| uint16_t LookupFlag = 0; |
| std::vector<std::unique_ptr<TSubTableBase>> SubTables; |
| }; |
| |
| bool LoadGSUBTable(FT_Bytes gsub); |
| 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); |
| std::unique_ptr<TCoverageFormat1> ParseCoverageFormat1(FT_Bytes raw); |
| std::unique_ptr<TCoverageFormat2> ParseCoverageFormat2(FT_Bytes raw); |
| std::unique_ptr<TSubTableBase> ParseSingleSubst(FT_Bytes raw); |
| std::unique_ptr<TSubTable1> ParseSingleSubstFormat1(FT_Bytes raw); |
| std::unique_ptr<TSubTable2> ParseSingleSubstFormat2(FT_Bytes raw); |
| |
| absl::optional<uint32_t> GetVerticalGlyphSub(const TFeatureRecord& feature, |
| uint32_t glyphnum) const; |
| absl::optional<uint32_t> GetVerticalGlyphSub2(const TLookup& lookup, |
| uint32_t glyphnum) const; |
| 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; |
| std::vector<TScriptRecord> ScriptList; |
| std::vector<TFeatureRecord> FeatureList; |
| std::vector<TLookup> LookupList; |
| }; |
| |
| #endif // CORE_FPDFAPI_FONT_CFX_CTTGSUBTABLE_H_ |