7#include "core/fpdfapi/font/cfx_cttgsubtable.h"
13#include "core/fxcrt/byteorder.h"
14#include "core/fxcrt/data_vector.h"
15#include "core/fxcrt/stl_util.h"
16#include "core/fxge/cfx_fontmapper.h"
20bool IsVerticalFeatureTag(uint32_t tag) {
28 if (!LoadGSUBTable(gsub))
31 for (
const auto& script : script_list_) {
32 for (
const auto& record : script) {
33 for (uint16_t index : record) {
34 if (IsVerticalFeatureTag(feature_list_[index].feature_tag)) {
35 feature_set_.insert(index);
40 if (!feature_set_.empty()) {
45 for (
const FeatureRecord& feature : feature_list_) {
46 if (IsVerticalFeatureTag(feature.feature_tag)) {
47 feature_set_.insert(i);
60 auto scriptlist_span = gsub.subspan(4, 2);
61 auto featurelist_span = gsub.subspan(6, 2);
62 auto lookuplist_span = gsub.subspan(8, 2);
63 size_t scriptlist_index = fxcrt::GetUInt16MSBFirst(scriptlist_span);
64 size_t featurelist_index = fxcrt::GetUInt16MSBFirst(featurelist_span);
65 size_t lookuplist_index = fxcrt::GetUInt16MSBFirst(lookuplist_span);
66 Parse(gsub.subspan(scriptlist_index), gsub.subspan(featurelist_index),
67 gsub.subspan(lookuplist_index));
72 for (uint32_t item : feature_set_) {
73 std::optional<uint32_t> result =
74 GetVerticalGlyphSub(feature_list_[item], glyphnum);
75 if (result.has_value())
76 return result.value();
82 const FeatureRecord& feature,
83 uint32_t glyphnum)
const {
84 for (
int index : feature.lookup_list_indices) {
85 if (!fxcrt::IndexInBounds(lookup_list_, index)) {
88 if (lookup_list_[index].lookup_type != 1) {
91 std::optional<uint32_t> result =
92 GetVerticalGlyphSub2(lookup_list_[index], glyphnum);
93 if (result.has_value())
94 return result.value();
100 const Lookup& lookup,
101 uint32_t glyphnum)
const {
102 for (
const auto& sub_table : lookup.sub_tables) {
103 if (absl::holds_alternative<absl::monostate>(sub_table.table_data)) {
106 int index = GetCoverageIndex(sub_table.coverage, glyphnum);
107 if (absl::holds_alternative<int16_t>(sub_table.table_data)) {
109 return glyphnum + absl::get<int16_t>(sub_table.table_data);
112 const auto& substitutes =
113 absl::get<DataVector<uint16_t>>(sub_table.table_data);
114 if (fxcrt::IndexInBounds(substitutes, index)) {
115 return substitutes[index];
124 if (absl::holds_alternative<absl::monostate>(coverage)) {
128 if (absl::holds_alternative<DataVector<uint16_t>>(coverage)) {
130 const auto& glyph_array = absl::get<DataVector<uint16_t>>(coverage);
131 for (
const auto& glyph : glyph_array) {
132 if (
static_cast<uint32_t>(glyph) == g) {
140 const auto& range_records = absl::get<std::vector<RangeRecord>>(coverage);
141 for (
const auto& range_rec : range_records) {
142 uint32_t s = range_rec.start;
143 uint32_t e = range_rec.end;
144 uint32_t si = range_rec.start_coverage_index;
145 if (s <= g && g <= e) {
153 uint8_t ret = p.front();
159 uint16_t ret = fxcrt::GetUInt16MSBFirst(p.first(2u));
161 return static_cast<int16_t>(ret);
165 uint16_t ret = fxcrt::GetUInt16MSBFirst(p.first(2u));
171 uint32_t ret = fxcrt::GetUInt32MSBFirst(p.first(4u));
173 return static_cast<int32_t>(ret);
177 uint32_t ret = fxcrt::GetUInt32MSBFirst(p.first(4u));
183 pdfium::span<
const uint8_t> featurelist,
184 pdfium::span<
const uint8_t> lookuplist) {
185 ParseScriptList(scriptlist);
186 ParseFeatureList(featurelist);
187 ParseLookupList(lookuplist);
191 pdfium::span<
const uint8_t> sp = raw;
192 script_list_ = std::vector<ScriptRecord>(GetUInt16(sp));
193 for (
auto& script : script_list_) {
196 script = ParseScript(raw.subspan(GetUInt16(sp)));
201 pdfium::span<
const uint8_t> raw) {
203 pdfium::span<
const uint8_t> sp = raw.subspan(2u);
204 ScriptRecord result(GetUInt16(sp));
205 for (
auto& record : result) {
208 record = ParseLangSys(raw.subspan(GetUInt16(sp)));
214 pdfium::span<
const uint8_t> raw) {
216 pdfium::span<
const uint8_t> sp = raw.subspan(4u);
217 FeatureIndices result(GetUInt16(sp));
218 for (
auto& element : result) {
219 element = GetUInt16(sp);
225 pdfium::span<
const uint8_t> sp = raw;
226 feature_list_ = std::vector<FeatureRecord>(GetUInt16(sp));
227 for (
auto& record : feature_list_) {
228 record.feature_tag = GetUInt32(sp);
229 record.lookup_list_indices =
230 ParseFeatureLookupListIndices(raw.subspan(GetUInt16(sp)));
235 pdfium::span<
const uint8_t> raw) {
237 pdfium::span<
const uint8_t> sp = raw.subspan(2u);
238 DataVector<uint16_t> result(GetUInt16(sp));
239 for (
auto& index : result) {
240 index = GetUInt16(sp);
246 pdfium::span<
const uint8_t> sp = raw;
247 lookup_list_ = std::vector<Lookup>(GetUInt16(sp));
248 for (
auto& lookup : lookup_list_) {
249 lookup = ParseLookup(raw.subspan(GetUInt16(sp)));
254 pdfium::span<
const uint8_t> raw) {
255 pdfium::span<
const uint8_t> sp = raw;
257 result.lookup_type = GetUInt16(sp);
260 result.sub_tables = Lookup::SubTables(GetUInt16(sp));
261 if (result.lookup_type != 1) {
264 for (
auto& sub_table : result.sub_tables) {
265 sub_table = ParseSingleSubst(raw.subspan(GetUInt16(sp)));
271 pdfium::span<
const uint8_t> raw) {
272 pdfium::span<
const uint8_t> sp = raw;
273 uint16_t format = GetUInt16(sp);
274 if (format != 1 && format != 2) {
275 return absl::monostate();
278 DataVector<uint16_t> glyph_array(GetUInt16(sp));
279 for (
auto& glyph : glyph_array) {
280 glyph = GetUInt16(sp);
284 std::vector<RangeRecord> range_records(GetUInt16(sp));
285 for (
auto& range_rec : range_records) {
286 range_rec.start = GetUInt16(sp);
287 range_rec.end = GetUInt16(sp);
288 range_rec.start_coverage_index = GetUInt16(sp);
290 return range_records;
294 pdfium::span<
const uint8_t> raw) {
295 pdfium::span<
const uint8_t> sp = raw;
296 uint16_t format = GetUInt16(sp);
298 if (format != 1 && format != 2) {
301 rec.coverage = ParseCoverage(raw.subspan(GetUInt16(sp)));
303 rec.table_data = GetInt16(sp);
305 DataVector<uint16_t> table_data(GetUInt16(sp));
306 for (
auto& substitute : table_data) {
307 substitute = GetUInt16(sp);
309 rec.table_data = std::move(table_data);
325 SubTable&& that)
noexcept =
default;
334 Lookup&& that)
noexcept =
default;
uint32_t GetVerticalGlyph(uint32_t glyphnum) const
CFX_CTTGSUBTable(pdfium::span< const uint8_t > gsub)
static constexpr uint32_t MakeTag(char c1, char c2, char c3, char c4)
uint32_t GetUInt32MSBFirst(pdfium::span< const uint8_t, 4 > span)