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