Use some spans in CFX_CTTGSUBTable
Switch from raw pointers to spans in the ctor and some of the helper
methods.
Change-Id: I53b08f1ade78f832f8257fdde8f0ca85f2e758a5
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/107452
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/font/cfx_cttgsubtable.cpp b/core/fpdfapi/font/cfx_cttgsubtable.cpp
index da3ce76..c19649e 100644
--- a/core/fpdfapi/font/cfx_cttgsubtable.cpp
+++ b/core/fpdfapi/font/cfx_cttgsubtable.cpp
@@ -27,7 +27,7 @@
} // namespace
-CFX_CTTGSUBTable::CFX_CTTGSUBTable(const uint8_t* gsub) {
+CFX_CTTGSUBTable::CFX_CTTGSUBTable(pdfium::span<const uint8_t> gsub) {
if (!LoadGSUBTable(gsub))
return;
@@ -55,13 +55,18 @@
CFX_CTTGSUBTable::~CFX_CTTGSUBTable() = default;
-bool CFX_CTTGSUBTable::LoadGSUBTable(const uint8_t* gsub) {
+bool CFX_CTTGSUBTable::LoadGSUBTable(pdfium::span<const uint8_t> gsub) {
if (FXSYS_UINT32_GET_MSBFIRST(gsub) != 0x00010000)
return false;
- Parse(&gsub[FXSYS_UINT16_GET_MSBFIRST(gsub + 4)],
- &gsub[FXSYS_UINT16_GET_MSBFIRST(gsub + 6)],
- &gsub[FXSYS_UINT16_GET_MSBFIRST(gsub + 8)]);
+ auto scriptlist_span = gsub.subspan(4, 2);
+ auto featurelist_span = gsub.subspan(6, 2);
+ auto lookuplist_span = gsub.subspan(8, 2);
+ size_t scriptlist_index = FXSYS_UINT16_GET_MSBFIRST(scriptlist_span);
+ size_t featurelist_index = FXSYS_UINT16_GET_MSBFIRST(featurelist_span);
+ size_t lookuplist_index = FXSYS_UINT16_GET_MSBFIRST(lookuplist_span);
+ Parse(gsub.subspan(scriptlist_index), gsub.subspan(featurelist_index),
+ gsub.subspan(lookuplist_index));
return true;
}
@@ -176,16 +181,16 @@
return ret;
}
-void CFX_CTTGSUBTable::Parse(const uint8_t* scriptlist,
- const uint8_t* featurelist,
- const uint8_t* lookuplist) {
+void CFX_CTTGSUBTable::Parse(pdfium::span<const uint8_t> scriptlist,
+ pdfium::span<const uint8_t> featurelist,
+ pdfium::span<const uint8_t> lookuplist) {
ParseScriptList(scriptlist);
ParseFeatureList(featurelist);
ParseLookupList(lookuplist);
}
-void CFX_CTTGSUBTable::ParseScriptList(const uint8_t* raw) {
- const uint8_t* sp = raw;
+void CFX_CTTGSUBTable::ParseScriptList(pdfium::span<const uint8_t> raw) {
+ const uint8_t* sp = raw.data();
script_list_ = std::vector<ScriptRecord>(GetUInt16(sp));
for (auto& script : script_list_) {
// Skip over "ScriptTag" field.
@@ -218,8 +223,8 @@
return result;
}
-void CFX_CTTGSUBTable::ParseFeatureList(const uint8_t* raw) {
- const uint8_t* sp = raw;
+void CFX_CTTGSUBTable::ParseFeatureList(pdfium::span<const uint8_t> raw) {
+ const uint8_t* sp = raw.data();
feature_list_ = std::vector<FeatureRecord>(GetUInt16(sp));
for (auto& record : feature_list_) {
record.feature_tag = GetUInt32(sp);
@@ -239,8 +244,8 @@
return result;
}
-void CFX_CTTGSUBTable::ParseLookupList(const uint8_t* raw) {
- const uint8_t* sp = raw;
+void CFX_CTTGSUBTable::ParseLookupList(pdfium::span<const uint8_t> raw) {
+ const uint8_t* sp = raw.data();
lookup_list_ = std::vector<Lookup>(GetUInt16(sp));
for (auto& lookup : lookup_list_) {
lookup = ParseLookup(&raw[GetUInt16(sp)]);
diff --git a/core/fpdfapi/font/cfx_cttgsubtable.h b/core/fpdfapi/font/cfx_cttgsubtable.h
index de55f73..3e6bac8 100644
--- a/core/fpdfapi/font/cfx_cttgsubtable.h
+++ b/core/fpdfapi/font/cfx_cttgsubtable.h
@@ -16,10 +16,11 @@
#include "core/fxge/freetype/fx_freetype.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/abseil-cpp/absl/types/variant.h"
+#include "third_party/base/span.h"
class CFX_CTTGSUBTable {
public:
- explicit CFX_CTTGSUBTable(const uint8_t* gsub);
+ explicit CFX_CTTGSUBTable(pdfium::span<const uint8_t> gsub);
~CFX_CTTGSUBTable();
uint32_t GetVerticalGlyph(uint32_t glyphnum) const;
@@ -77,16 +78,16 @@
SubTables sub_tables;
};
- bool LoadGSUBTable(const uint8_t* gsub);
- void Parse(const uint8_t* scriptlist,
- const uint8_t* featurelist,
- const uint8_t* lookuplist);
- void ParseScriptList(const uint8_t* raw);
+ bool LoadGSUBTable(pdfium::span<const uint8_t> gsub);
+ void Parse(pdfium::span<const uint8_t> scriptlist,
+ pdfium::span<const uint8_t> featurelist,
+ pdfium::span<const uint8_t> lookuplist);
+ void ParseScriptList(pdfium::span<const uint8_t> raw);
ScriptRecord ParseScript(const uint8_t* raw);
FeatureIndices ParseLangSys(const uint8_t* raw);
- void ParseFeatureList(const uint8_t* raw);
+ void ParseFeatureList(pdfium::span<const uint8_t> raw);
DataVector<uint16_t> ParseFeatureLookupListIndices(const uint8_t* raw);
- void ParseLookupList(const uint8_t* raw);
+ void ParseLookupList(pdfium::span<const uint8_t> raw);
Lookup ParseLookup(const uint8_t* raw);
CoverageFormat ParseCoverage(const uint8_t* raw);
SubTable ParseSingleSubst(const uint8_t* raw);
diff --git a/core/fpdfapi/font/cpdf_cidfont.cpp b/core/fpdfapi/font/cpdf_cidfont.cpp
index 0d02494..f5a51b2 100644
--- a/core/fpdfapi/font/cpdf_cidfont.cpp
+++ b/core/fpdfapi/font/cpdf_cidfont.cpp
@@ -676,7 +676,7 @@
// CFX_CTTGSUBTable parses the data and stores all the values in its structs.
// It does not store pointers into `sub_data`.
- m_pTTGSUBTable = std::make_unique<CFX_CTTGSUBTable>(sub_data.span().data());
+ m_pTTGSUBTable = std::make_unique<CFX_CTTGSUBTable>(sub_data.span());
return GetVerticalGlyph(index, pVertGlyph);
}