1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/font/ttgsubtable.h"
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/fx_freetype.h"
1033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann#include "third_party/base/ptr_util.h"
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "third_party/base/stl_util.h"
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_GlyphMap::CFX_GlyphMap() {}
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_GlyphMap::~CFX_GlyphMap() {}
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovextern "C" {
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int _CompareInt(const void* p1, const void* p2) {
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return (*(uint32_t*)p1) - (*(uint32_t*)p2);
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct _IntPair {
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t key;
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t value;
26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_GlyphMap::SetAt(int key, int value) {
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t count = m_Buffer.GetSize() / sizeof(_IntPair);
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  _IntPair* buf = (_IntPair*)m_Buffer.GetBuffer();
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  _IntPair pair = {key, value};
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (count == 0 || key > buf[count - 1].key) {
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Buffer.AppendBlock(&pair, sizeof(_IntPair));
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int low = 0, high = count - 1;
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (low <= high) {
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int mid = (low + high) / 2;
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (buf[mid].key < key) {
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      low = mid + 1;
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (buf[mid].key > key) {
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      high = mid - 1;
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      buf[mid].value = value;
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Buffer.InsertBlock(low * sizeof(_IntPair), &pair, sizeof(_IntPair));
49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_GlyphMap::Lookup(int key, int& value) {
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  void* pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(),
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                m_Buffer.GetSize() / sizeof(_IntPair),
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                sizeof(_IntPair), _CompareInt);
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pResult) {
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  value = ((uint32_t*)pResult)[1];
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::CFX_CTTGSUBTable()
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_bFeautureMapLoad(false), loaded(false) {}
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::CFX_CTTGSUBTable(FT_Bytes gsub)
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_bFeautureMapLoad(false), loaded(false) {
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  LoadGSUBTable(gsub);
68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::~CFX_CTTGSUBTable() {}
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_CTTGSUBTable::IsOk() const {
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return loaded;
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbool CFX_CTTGSUBTable::LoadGSUBTable(FT_Bytes gsub) {
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  header.Version = gsub[0] << 24 | gsub[1] << 16 | gsub[2] << 8 | gsub[3];
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (header.Version != 0x00010000) {
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return false;
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  header.ScriptList = gsub[4] << 8 | gsub[5];
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  header.FeatureList = gsub[6] << 8 | gsub[7];
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  header.LookupList = gsub[8] << 8 | gsub[9];
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return Parse(&gsub[header.ScriptList], &gsub[header.FeatureList],
85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               &gsub[header.LookupList]);
86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbool CFX_CTTGSUBTable::GetVerticalGlyph(uint32_t glyphnum,
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        uint32_t* vglyphnum) {
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint32_t tag[] = {
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (uint8_t)'v' << 24 | (uint8_t)'r' << 16 | (uint8_t)'t' << 8 |
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          (uint8_t)'2',
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (uint8_t)'v' << 24 | (uint8_t)'e' << 16 | (uint8_t)'r' << 8 |
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          (uint8_t)'t',
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  };
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_bFeautureMapLoad) {
9733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    for (const auto& script : ScriptList.ScriptRecords) {
9833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      for (const auto& record : script.Script.LangSysRecords) {
9933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        for (const auto& index : record.LangSys.FeatureIndices) {
10033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann          if (FeatureList.FeatureRecords[index].FeatureTag == tag[0] ||
10133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann              FeatureList.FeatureRecords[index].FeatureTag == tag[1]) {
10233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann            m_featureSet.insert(index);
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
10733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    if (m_featureSet.empty()) {
10833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      int i = 0;
10933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      for (const auto& feature : FeatureList.FeatureRecords) {
11033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        if (feature.FeatureTag == tag[0] || feature.FeatureTag == tag[1])
11133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann          m_featureSet.insert(i);
11233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        ++i;
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bFeautureMapLoad = true;
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
11733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (const auto& item : m_featureSet) {
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetVerticalGlyphSub(glyphnum, vglyphnum,
11933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                            &FeatureList.FeatureRecords[item].Feature)) {
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return true;
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return false;
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbool CFX_CTTGSUBTable::GetVerticalGlyphSub(uint32_t glyphnum,
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           uint32_t* vglyphnum,
12833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                                           TFeature* Feature) {
12933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (int index : Feature->LookupListIndices) {
13033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    if (index < 0 || index >= pdfium::CollectionSize<int>(LookupList.Lookups))
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
13233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann
13333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    if (LookupList.Lookups[index].LookupType == 1 &&
13433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        GetVerticalGlyphSub2(glyphnum, vglyphnum, &LookupList.Lookups[index])) {
13533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      return true;
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return false;
139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbool CFX_CTTGSUBTable::GetVerticalGlyphSub2(uint32_t glyphnum,
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            uint32_t* vglyphnum,
14333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                                            TLookup* Lookup) {
14433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (const auto& subTable : Lookup->SubTables) {
14533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    switch (subTable->SubstFormat) {
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 1: {
14733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        auto tbl1 = static_cast<TSingleSubstFormat1*>(subTable.get());
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (GetCoverageIndex(tbl1->Coverage.get(), glyphnum) >= 0) {
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          *vglyphnum = glyphnum + tbl1->DeltaGlyphID;
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return true;
151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 2: {
15533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        auto tbl2 = static_cast<TSingleSubstFormat2*>(subTable.get());
15633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        int index = GetCoverageIndex(tbl2->Coverage.get(), glyphnum);
15733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        if (index >= 0 &&
15833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann            index < pdfium::CollectionSize<int>(tbl2->Substitutes)) {
15933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann          *vglyphnum = tbl2->Substitutes[index];
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return true;
161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return false;
167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CFX_CTTGSUBTable::GetCoverageIndex(TCoverageFormatBase* Coverage,
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       uint32_t g) const {
17133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (!Coverage)
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
17333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (Coverage->CoverageFormat) {
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 1: {
17633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      int i = 0;
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      TCoverageFormat1* c1 = (TCoverageFormat1*)Coverage;
17833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      for (const auto& glyph : c1->GlyphArray) {
17933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        if (static_cast<uint32_t>(glyph) == g)
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return i;
18133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        ++i;
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return -1;
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 2: {
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      TCoverageFormat2* c2 = (TCoverageFormat2*)Coverage;
18733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      for (const auto& rangeRec : c2->RangeRecords) {
18833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        uint32_t s = rangeRec.Start;
18933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        uint32_t e = rangeRec.End;
19033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        uint32_t si = rangeRec.StartCoverageIndex;
19133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        if (s <= g && g <= e)
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return si + g - s;
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return -1;
195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return -1;
198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint8_t CFX_CTTGSUBTable::GetUInt8(FT_Bytes& p) const {
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint8_t ret = p[0];
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  p += 1;
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return ret;
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint16_t CFX_CTTGSUBTable::GetInt16(FT_Bytes& p) const {
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint16_t ret = p[0] << 8 | p[1];
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  p += 2;
2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return *(int16_t*)&ret;
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint16_t CFX_CTTGSUBTable::GetUInt16(FT_Bytes& p) const {
2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint16_t ret = p[0] << 8 | p[1];
2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  p += 2;
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return ret;
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CFX_CTTGSUBTable::GetInt32(FT_Bytes& p) const {
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  p += 4;
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return *(int32_t*)&ret;
2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CFX_CTTGSUBTable::GetUInt32(FT_Bytes& p) const {
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  p += 4;
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return ret;
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbool CFX_CTTGSUBTable::Parse(FT_Bytes scriptlist,
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             FT_Bytes featurelist,
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             FT_Bytes lookuplist) {
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ParseScriptList(scriptlist, &ScriptList);
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ParseFeatureList(featurelist, &FeatureList);
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ParseLookupList(lookuplist, &LookupList);
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return true;
237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_CTTGSUBTable::ParseScriptList(FT_Bytes raw, TScriptList* rec) {
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_Bytes sp = raw;
24133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  rec->ScriptRecords = std::vector<TScriptRecord>(GetUInt16(sp));
24233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (auto& scriptRec : rec->ScriptRecords) {
24333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    scriptRec.ScriptTag = GetUInt32(sp);
24433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    ParseScript(&raw[GetUInt16(sp)], &scriptRec.Script);
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_CTTGSUBTable::ParseScript(FT_Bytes raw, TScript* rec) {
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_Bytes sp = raw;
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rec->DefaultLangSys = GetUInt16(sp);
25133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  rec->LangSysRecords = std::vector<TLangSysRecord>(GetUInt16(sp));
25233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (auto& sysRecord : rec->LangSysRecords) {
25333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    sysRecord.LangSysTag = GetUInt32(sp);
25433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    ParseLangSys(&raw[GetUInt16(sp)], &sysRecord.LangSys);
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_CTTGSUBTable::ParseLangSys(FT_Bytes raw, TLangSys* rec) {
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_Bytes sp = raw;
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rec->LookupOrder = GetUInt16(sp);
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rec->ReqFeatureIndex = GetUInt16(sp);
26233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  rec->FeatureIndices = std::vector<uint16_t>(GetUInt16(sp));
26333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (auto& element : rec->FeatureIndices)
26433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    element = GetUInt16(sp);
265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_CTTGSUBTable::ParseFeatureList(FT_Bytes raw, TFeatureList* rec) {
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_Bytes sp = raw;
26933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  rec->FeatureRecords = std::vector<TFeatureRecord>(GetUInt16(sp));
27033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (auto& featureRec : rec->FeatureRecords) {
27133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    featureRec.FeatureTag = GetUInt32(sp);
27233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    ParseFeature(&raw[GetUInt16(sp)], &featureRec.Feature);
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_CTTGSUBTable::ParseFeature(FT_Bytes raw, TFeature* rec) {
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_Bytes sp = raw;
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rec->FeatureParams = GetUInt16(sp);
27933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  rec->LookupListIndices = std::vector<uint16_t>(GetUInt16(sp));
28033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (auto& listIndex : rec->LookupListIndices)
28133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    listIndex = GetUInt16(sp);
282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_CTTGSUBTable::ParseLookupList(FT_Bytes raw, TLookupList* rec) {
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_Bytes sp = raw;
28633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  rec->Lookups = std::vector<TLookup>(GetUInt16(sp));
28733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (auto& lookup : rec->Lookups)
28833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    ParseLookup(&raw[GetUInt16(sp)], &lookup);
289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_CTTGSUBTable::ParseLookup(FT_Bytes raw, TLookup* rec) {
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_Bytes sp = raw;
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rec->LookupType = GetUInt16(sp);
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rec->LookupFlag = GetUInt16(sp);
29533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  rec->SubTables = std::vector<std::unique_ptr<TSubTableBase>>(GetUInt16(sp));
29633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (rec->LookupType != 1)
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
29833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann
29933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (auto& subTable : rec->SubTables)
30033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    ParseSingleSubst(&raw[GetUInt16(sp)], &subTable);
301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TCoverageFormatBase* CFX_CTTGSUBTable::ParseCoverage(
3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FT_Bytes raw) {
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_Bytes sp = raw;
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint16_t format = GetUInt16(sp);
3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  TCoverageFormatBase* rec = nullptr;
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (format == 1) {
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rec = new TCoverageFormat1();
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ParseCoverageFormat1(raw, static_cast<TCoverageFormat1*>(rec));
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (format == 2) {
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rec = new TCoverageFormat2();
3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ParseCoverageFormat2(raw, static_cast<TCoverageFormat2*>(rec));
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return rec;
316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_CTTGSUBTable::ParseCoverageFormat1(FT_Bytes raw,
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            TCoverageFormat1* rec) {
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_Bytes sp = raw;
32133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  (void)GetUInt16(sp);
32233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  rec->GlyphArray = std::vector<uint16_t>(GetUInt16(sp));
32333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (auto& glyph : rec->GlyphArray)
32433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    glyph = GetUInt16(sp);
325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_CTTGSUBTable::ParseCoverageFormat2(FT_Bytes raw,
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            TCoverageFormat2* rec) {
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_Bytes sp = raw;
33033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  (void)GetUInt16(sp);
33133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  rec->RangeRecords = std::vector<TRangeRecord>(GetUInt16(sp));
33233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (auto& rangeRec : rec->RangeRecords) {
33333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    rangeRec.Start = GetUInt16(sp);
33433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    rangeRec.End = GetUInt16(sp);
33533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    rangeRec.StartCoverageIndex = GetUInt16(sp);
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
33933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannvoid CFX_CTTGSUBTable::ParseSingleSubst(FT_Bytes raw,
34033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                                        std::unique_ptr<TSubTableBase>* rec) {
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_Bytes sp = raw;
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint16_t Format = GetUInt16(sp);
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (Format) {
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 1:
34533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      *rec = pdfium::MakeUnique<TSingleSubstFormat1>();
34633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      ParseSingleSubstFormat1(raw,
34733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                              static_cast<TSingleSubstFormat1*>(rec->get()));
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case 2:
35033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      *rec = pdfium::MakeUnique<TSingleSubstFormat2>();
35133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      ParseSingleSubstFormat2(raw,
35233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                              static_cast<TSingleSubstFormat2*>(rec->get()));
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_CTTGSUBTable::ParseSingleSubstFormat1(FT_Bytes raw,
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               TSingleSubstFormat1* rec) {
359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_Bytes sp = raw;
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  GetUInt16(sp);
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint16_t offset = GetUInt16(sp);
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rec->Coverage.reset(ParseCoverage(&raw[offset]));
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rec->DeltaGlyphID = GetInt16(sp);
364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_CTTGSUBTable::ParseSingleSubstFormat2(FT_Bytes raw,
367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               TSingleSubstFormat2* rec) {
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FT_Bytes sp = raw;
36933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  (void)GetUInt16(sp);
370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint16_t offset = GetUInt16(sp);
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rec->Coverage.reset(ParseCoverage(&raw[offset]));
37233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  rec->Substitutes = std::vector<uint16_t>(GetUInt16(sp));
37333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (auto& substitute : rec->Substitutes)
37433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    substitute = GetUInt16(sp);
375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TCoverageFormat1::TCoverageFormat1()
37833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    : TCoverageFormatBase(1) {}
3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TCoverageFormat1::~TCoverageFormat1() {}
3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TRangeRecord::TRangeRecord()
3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : Start(0), End(0), StartCoverageIndex(0) {}
3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TCoverageFormat2::TCoverageFormat2()
38633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    : TCoverageFormatBase(2) {}
3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TCoverageFormat2::~TCoverageFormat2() {}
3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TSingleSubstFormat1::TSingleSubstFormat1()
3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : TSubTableBase(1), DeltaGlyphID(0) {}
3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TSingleSubstFormat1::~TSingleSubstFormat1() {}
3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TSingleSubstFormat2::TSingleSubstFormat2()
39633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    : TSubTableBase(2) {}
3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TSingleSubstFormat2::~TSingleSubstFormat2() {}
3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
40033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannCFX_CTTGSUBTable::TLookup::TLookup() : LookupType(0), LookupFlag(0) {}
4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
40233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannCFX_CTTGSUBTable::TLookup::~TLookup() {}
4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
40433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannCFX_CTTGSUBTable::TScript::TScript() : DefaultLangSys(0) {}
4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TScript::~TScript() {}
4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
40833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannCFX_CTTGSUBTable::TScriptList::TScriptList() {}
4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TScriptList::~TScriptList() {}
4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
41233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannCFX_CTTGSUBTable::TFeature::TFeature() : FeatureParams(0) {}
4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TFeature::~TFeature() {}
4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
41633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannCFX_CTTGSUBTable::TFeatureList::TFeatureList() {}
4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TFeatureList::~TFeatureList() {}
4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
42033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannCFX_CTTGSUBTable::TLookupList::TLookupList() {}
4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TLookupList::~TLookupList() {}
4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
42433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannCFX_CTTGSUBTable::TLangSys::TLangSys() : LookupOrder(0), ReqFeatureIndex(0) {}
4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_CTTGSUBTable::TLangSys::~TLangSys() {}
427