// 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_FPDF_FONT_TTGSUBTABLE_H_
|
#define CORE_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_
|
|
#include <stdint.h>
|
|
#include <map>
|
#include <memory>
|
|
#include "core/fxcrt/include/fx_basic.h"
|
#include "core/fxge/include/fx_font.h"
|
#include "core/fxge/include/fx_freetype.h"
|
|
class CFX_GlyphMap {
|
public:
|
CFX_GlyphMap();
|
~CFX_GlyphMap();
|
|
void SetAt(int key, int value);
|
FX_BOOL Lookup(int key, int& value);
|
|
protected:
|
CFX_BinaryBuf m_Buffer;
|
};
|
|
class CFX_CTTGSUBTable {
|
public:
|
CFX_CTTGSUBTable();
|
explicit CFX_CTTGSUBTable(FT_Bytes gsub);
|
virtual ~CFX_CTTGSUBTable();
|
|
bool IsOk() const;
|
bool LoadGSUBTable(FT_Bytes gsub);
|
bool GetVerticalGlyph(uint32_t glyphnum, uint32_t* vglyphnum);
|
|
private:
|
struct tt_gsub_header {
|
uint32_t Version;
|
uint16_t ScriptList;
|
uint16_t FeatureList;
|
uint16_t LookupList;
|
};
|
struct TLangSys {
|
TLangSys();
|
~TLangSys();
|
|
uint16_t LookupOrder;
|
uint16_t ReqFeatureIndex;
|
uint16_t FeatureCount;
|
std::unique_ptr<uint16_t[]> FeatureIndex;
|
|
private:
|
TLangSys(const TLangSys&);
|
TLangSys& operator=(const TLangSys&);
|
};
|
struct TLangSysRecord {
|
TLangSysRecord() : LangSysTag(0) {}
|
|
uint32_t LangSysTag;
|
TLangSys LangSys;
|
|
private:
|
TLangSysRecord(const TLangSysRecord&);
|
TLangSysRecord& operator=(const TLangSysRecord&);
|
};
|
struct TScript {
|
TScript();
|
~TScript();
|
|
uint16_t DefaultLangSys;
|
uint16_t LangSysCount;
|
std::unique_ptr<TLangSysRecord[]> LangSysRecord;
|
|
private:
|
TScript(const TScript&);
|
TScript& operator=(const TScript&);
|
};
|
struct TScriptRecord {
|
TScriptRecord() : ScriptTag(0) {}
|
|
uint32_t ScriptTag;
|
TScript Script;
|
|
private:
|
TScriptRecord(const TScriptRecord&);
|
TScriptRecord& operator=(const TScriptRecord&);
|
};
|
struct TScriptList {
|
TScriptList();
|
~TScriptList();
|
|
uint16_t ScriptCount;
|
std::unique_ptr<TScriptRecord[]> ScriptRecord;
|
|
private:
|
TScriptList(const TScriptList&);
|
TScriptList& operator=(const TScriptList&);
|
};
|
struct TFeature {
|
TFeature();
|
~TFeature();
|
|
uint16_t FeatureParams;
|
int LookupCount;
|
std::unique_ptr<uint16_t[]> LookupListIndex;
|
|
private:
|
TFeature(const TFeature&);
|
TFeature& operator=(const TFeature&);
|
};
|
struct TFeatureRecord {
|
TFeatureRecord() : FeatureTag(0) {}
|
|
uint32_t FeatureTag;
|
TFeature Feature;
|
|
private:
|
TFeatureRecord(const TFeatureRecord&);
|
TFeatureRecord& operator=(const TFeatureRecord&);
|
};
|
struct TFeatureList {
|
TFeatureList();
|
~TFeatureList();
|
|
int FeatureCount;
|
std::unique_ptr<TFeatureRecord[]> FeatureRecord;
|
|
private:
|
TFeatureList(const TFeatureList&);
|
TFeatureList& operator=(const TFeatureList&);
|
};
|
enum TLookupFlag {
|
LOOKUPFLAG_RightToLeft = 0x0001,
|
LOOKUPFLAG_IgnoreBaseGlyphs = 0x0002,
|
LOOKUPFLAG_IgnoreLigatures = 0x0004,
|
LOOKUPFLAG_IgnoreMarks = 0x0008,
|
LOOKUPFLAG_Reserved = 0x00F0,
|
LOOKUPFLAG_MarkAttachmentType = 0xFF00,
|
};
|
struct TCoverageFormatBase {
|
TCoverageFormatBase() : CoverageFormat(0) {}
|
explicit TCoverageFormatBase(uint16_t format) : CoverageFormat(format) {}
|
virtual ~TCoverageFormatBase() {}
|
|
uint16_t CoverageFormat;
|
CFX_GlyphMap m_glyphMap;
|
|
private:
|
TCoverageFormatBase(const TCoverageFormatBase&);
|
TCoverageFormatBase& operator=(const TCoverageFormatBase&);
|
};
|
struct TCoverageFormat1 : public TCoverageFormatBase {
|
TCoverageFormat1();
|
~TCoverageFormat1() override;
|
|
uint16_t GlyphCount;
|
std::unique_ptr<uint16_t[]> GlyphArray;
|
|
private:
|
TCoverageFormat1(const TCoverageFormat1&);
|
TCoverageFormat1& operator=(const TCoverageFormat1&);
|
};
|
struct TRangeRecord {
|
TRangeRecord();
|
|
friend bool operator>(const TRangeRecord& r1, const TRangeRecord& r2) {
|
return r1.Start > r2.Start;
|
}
|
|
uint16_t Start;
|
uint16_t End;
|
uint16_t StartCoverageIndex;
|
|
private:
|
TRangeRecord(const TRangeRecord&);
|
};
|
struct TCoverageFormat2 : public TCoverageFormatBase {
|
TCoverageFormat2();
|
~TCoverageFormat2() override;
|
|
uint16_t RangeCount;
|
std::unique_ptr<TRangeRecord[]> RangeRecord;
|
|
private:
|
TCoverageFormat2(const TCoverageFormat2&);
|
TCoverageFormat2& operator=(const TCoverageFormat2&);
|
};
|
struct TDevice {
|
TDevice() : StartSize(0), EndSize(0), DeltaFormat(0) {}
|
|
uint16_t StartSize;
|
uint16_t EndSize;
|
uint16_t DeltaFormat;
|
|
private:
|
TDevice(const TDevice&);
|
TDevice& operator=(const TDevice&);
|
};
|
struct TSubTableBase {
|
TSubTableBase() : SubstFormat(0) {}
|
explicit TSubTableBase(uint16_t format) : SubstFormat(format) {}
|
virtual ~TSubTableBase() {}
|
|
uint16_t SubstFormat;
|
|
private:
|
TSubTableBase(const TSubTableBase&);
|
TSubTableBase& operator=(const TSubTableBase&);
|
};
|
struct TSingleSubstFormat1 : public TSubTableBase {
|
TSingleSubstFormat1();
|
~TSingleSubstFormat1() override;
|
|
std::unique_ptr<TCoverageFormatBase> Coverage;
|
int16_t DeltaGlyphID;
|
|
private:
|
TSingleSubstFormat1(const TSingleSubstFormat1&);
|
TSingleSubstFormat1& operator=(const TSingleSubstFormat1&);
|
};
|
struct TSingleSubstFormat2 : public TSubTableBase {
|
TSingleSubstFormat2();
|
~TSingleSubstFormat2() override;
|
|
std::unique_ptr<TCoverageFormatBase> Coverage;
|
uint16_t GlyphCount;
|
std::unique_ptr<uint16_t[]> Substitute;
|
|
private:
|
TSingleSubstFormat2(const TSingleSubstFormat2&);
|
TSingleSubstFormat2& operator=(const TSingleSubstFormat2&);
|
};
|
struct TLookup {
|
TLookup();
|
~TLookup();
|
|
uint16_t LookupType;
|
uint16_t LookupFlag;
|
uint16_t SubTableCount;
|
std::unique_ptr<TSubTableBase* []> SubTable;
|
|
private:
|
TLookup(const TLookup&);
|
TLookup& operator=(const TLookup&);
|
};
|
struct TLookupList {
|
TLookupList();
|
~TLookupList();
|
|
int LookupCount;
|
std::unique_ptr<TLookup[]> Lookup;
|
|
private:
|
TLookupList(const TLookupList&);
|
TLookupList& operator=(const TLookupList&);
|
};
|
|
bool Parse(FT_Bytes scriptlist, FT_Bytes featurelist, FT_Bytes lookuplist);
|
void ParseScriptList(FT_Bytes raw, TScriptList* rec);
|
void ParseScript(FT_Bytes raw, TScript* rec);
|
void ParseLangSys(FT_Bytes raw, TLangSys* rec);
|
void ParseFeatureList(FT_Bytes raw, TFeatureList* rec);
|
void ParseFeature(FT_Bytes raw, TFeature* rec);
|
void ParseLookupList(FT_Bytes raw, TLookupList* rec);
|
void ParseLookup(FT_Bytes raw, TLookup* rec);
|
TCoverageFormatBase* ParseCoverage(FT_Bytes raw);
|
void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1* rec);
|
void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2* rec);
|
void ParseSingleSubst(FT_Bytes raw, TSubTableBase** rec);
|
void ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1* rec);
|
void ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2* rec);
|
|
bool GetVerticalGlyphSub(uint32_t glyphnum,
|
uint32_t* vglyphnum,
|
TFeature* Feature) const;
|
bool GetVerticalGlyphSub2(uint32_t glyphnum,
|
uint32_t* vglyphnum,
|
TLookup* Lookup) 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::map<uint32_t, uint32_t> m_featureMap;
|
FX_BOOL m_bFeautureMapLoad;
|
bool loaded;
|
tt_gsub_header header;
|
TScriptList ScriptList;
|
TFeatureList FeatureList;
|
TLookupList LookupList;
|
};
|
|
#endif // CORE_FPDFAPI_FPDF_FONT_TTGSUBTABLE_H_
|