Tidy CFX_CTTGSUBTable -- remove in-out parameters. -- initialize in header. -- improve constructors to make some members const. Change-Id: I083d5e3c3c3dba60684157e6883474b8694fca3d Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/77110 Reviewed-by: Hui Yingst <nigi@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/font/cfx_cttgsubtable.cpp b/core/fpdfapi/font/cfx_cttgsubtable.cpp index 7932e7a..4631582 100644 --- a/core/fpdfapi/font/cfx_cttgsubtable.cpp +++ b/core/fpdfapi/font/cfx_cttgsubtable.cpp
@@ -239,129 +239,118 @@ return; for (auto& subTable : rec->SubTables) - ParseSingleSubst(&raw[GetUInt16(sp)], &subTable); + subTable = ParseSingleSubst(&raw[GetUInt16(sp)]); } std::unique_ptr<CFX_CTTGSUBTable::TCoverageFormatBase> CFX_CTTGSUBTable::ParseCoverage(FT_Bytes raw) { FT_Bytes sp = raw; uint16_t format = GetUInt16(sp); - if (format == 1) { - auto rec = std::make_unique<TCoverageFormat1>(); - ParseCoverageFormat1(raw, rec.get()); - return std::move(rec); - } - if (format == 2) { - auto rec = std::make_unique<TCoverageFormat2>(); - ParseCoverageFormat2(raw, rec.get()); - return std::move(rec); - } + if (format == 1) + return ParseCoverageFormat1(raw); + if (format == 2) + return ParseCoverageFormat2(raw); return nullptr; } -void CFX_CTTGSUBTable::ParseCoverageFormat1(FT_Bytes raw, - TCoverageFormat1* rec) { +std::unique_ptr<CFX_CTTGSUBTable::TCoverageFormat1> +CFX_CTTGSUBTable::ParseCoverageFormat1(FT_Bytes raw) { FT_Bytes sp = raw; (void)GetUInt16(sp); - rec->GlyphArray = - std::vector<uint16_t, FxAllocAllocator<uint16_t>>(GetUInt16(sp)); + auto rec = std::make_unique<TCoverageFormat1>(GetUInt16(sp)); for (auto& glyph : rec->GlyphArray) glyph = GetUInt16(sp); + return rec; } -void CFX_CTTGSUBTable::ParseCoverageFormat2(FT_Bytes raw, - TCoverageFormat2* rec) { +std::unique_ptr<CFX_CTTGSUBTable::TCoverageFormat2> +CFX_CTTGSUBTable::ParseCoverageFormat2(FT_Bytes raw) { FT_Bytes sp = raw; (void)GetUInt16(sp); - rec->RangeRecords = std::vector<TRangeRecord>(GetUInt16(sp)); + auto rec = std::make_unique<TCoverageFormat2>(GetUInt16(sp)); for (auto& rangeRec : rec->RangeRecords) { rangeRec.Start = GetUInt16(sp); rangeRec.End = GetUInt16(sp); rangeRec.StartCoverageIndex = GetUInt16(sp); } + return rec; } -void CFX_CTTGSUBTable::ParseSingleSubst(FT_Bytes raw, - std::unique_ptr<TSubTableBase>* rec) { +std::unique_ptr<CFX_CTTGSUBTable::TSubTableBase> +CFX_CTTGSUBTable::ParseSingleSubst(FT_Bytes raw) { FT_Bytes sp = raw; - uint16_t Format = GetUInt16(sp); - switch (Format) { - case 1: - *rec = std::make_unique<TSubTable1>(); - ParseSingleSubstFormat1(raw, static_cast<TSubTable1*>(rec->get())); - break; - case 2: - *rec = std::make_unique<TSubTable2>(); - ParseSingleSubstFormat2(raw, static_cast<TSubTable2*>(rec->get())); - break; - } + uint16_t format = GetUInt16(sp); + if (format == 1) + return ParseSingleSubstFormat1(raw); + if (format == 2) + return ParseSingleSubstFormat2(raw); + return nullptr; } -void CFX_CTTGSUBTable::ParseSingleSubstFormat1(FT_Bytes raw, TSubTable1* rec) { +std::unique_ptr<CFX_CTTGSUBTable::TSubTable1> +CFX_CTTGSUBTable::ParseSingleSubstFormat1(FT_Bytes raw) { FT_Bytes sp = raw; GetUInt16(sp); uint16_t offset = GetUInt16(sp); + auto rec = std::make_unique<TSubTable1>(); rec->Coverage = ParseCoverage(&raw[offset]); rec->DeltaGlyphID = GetInt16(sp); + return rec; } -void CFX_CTTGSUBTable::ParseSingleSubstFormat2(FT_Bytes raw, TSubTable2* rec) { +std::unique_ptr<CFX_CTTGSUBTable::TSubTable2> +CFX_CTTGSUBTable::ParseSingleSubstFormat2(FT_Bytes raw) { FT_Bytes sp = raw; (void)GetUInt16(sp); uint16_t offset = GetUInt16(sp); + auto rec = std::make_unique<TSubTable2>(); rec->Coverage = ParseCoverage(&raw[offset]); rec->Substitutes = std::vector<uint16_t, FxAllocAllocator<uint16_t>>(GetUInt16(sp)); for (auto& substitute : rec->Substitutes) substitute = GetUInt16(sp); + return rec; } -CFX_CTTGSUBTable::TLangSysRecord::TLangSysRecord() - : LangSysTag(0), LookupOrder(0), ReqFeatureIndex(0) {} +CFX_CTTGSUBTable::TLangSysRecord::TLangSysRecord() = default; CFX_CTTGSUBTable::TLangSysRecord::~TLangSysRecord() = default; -CFX_CTTGSUBTable::TScriptRecord::TScriptRecord() - : ScriptTag(0), DefaultLangSys(0) {} +CFX_CTTGSUBTable::TScriptRecord::TScriptRecord() = default; CFX_CTTGSUBTable::TScriptRecord::~TScriptRecord() = default; -CFX_CTTGSUBTable::TFeatureRecord::TFeatureRecord() - : FeatureTag(0), FeatureParams(0) {} +CFX_CTTGSUBTable::TFeatureRecord::TFeatureRecord() = default; CFX_CTTGSUBTable::TFeatureRecord::~TFeatureRecord() = default; -CFX_CTTGSUBTable::TRangeRecord::TRangeRecord() - : Start(0), End(0), StartCoverageIndex(0) {} +CFX_CTTGSUBTable::TRangeRecord::TRangeRecord() = default; -CFX_CTTGSUBTable::TCoverageFormat1::TCoverageFormat1() { - CoverageFormat = 1; -} +CFX_CTTGSUBTable::TCoverageFormat1::TCoverageFormat1(size_t initial_size) + : TCoverageFormatBase(1), GlyphArray(initial_size) {} CFX_CTTGSUBTable::TCoverageFormat1::~TCoverageFormat1() = default; -CFX_CTTGSUBTable::TCoverageFormat2::TCoverageFormat2() { - CoverageFormat = 2; -} +CFX_CTTGSUBTable::TCoverageFormat2::TCoverageFormat2(size_t initial_size) + : TCoverageFormatBase(2), RangeRecords(initial_size) {} CFX_CTTGSUBTable::TCoverageFormat2::~TCoverageFormat2() = default; -CFX_CTTGSUBTable::TSubTableBase::TSubTableBase() = default; +CFX_CTTGSUBTable::TDevice::TDevice() = default; + +CFX_CTTGSUBTable::TSubTableBase::TSubTableBase(uint16_t format) + : SubstFormat(format) {} CFX_CTTGSUBTable::TSubTableBase::~TSubTableBase() = default; -CFX_CTTGSUBTable::TSubTable1::TSubTable1() { - SubstFormat = 1; -} +CFX_CTTGSUBTable::TSubTable1::TSubTable1() : TSubTableBase(1) {} CFX_CTTGSUBTable::TSubTable1::~TSubTable1() = default; -CFX_CTTGSUBTable::TSubTable2::TSubTable2() { - SubstFormat = 2; -} +CFX_CTTGSUBTable::TSubTable2::TSubTable2() : TSubTableBase(2) {} CFX_CTTGSUBTable::TSubTable2::~TSubTable2() = default; -CFX_CTTGSUBTable::TLookup::TLookup() : LookupType(0), LookupFlag(0) {} +CFX_CTTGSUBTable::TLookup::TLookup() = default; CFX_CTTGSUBTable::TLookup::~TLookup() = default;
diff --git a/core/fpdfapi/font/cfx_cttgsubtable.h b/core/fpdfapi/font/cfx_cttgsubtable.h index 8155b6c..fecd262 100644 --- a/core/fpdfapi/font/cfx_cttgsubtable.h +++ b/core/fpdfapi/font/cfx_cttgsubtable.h
@@ -28,9 +28,9 @@ TLangSysRecord(); ~TLangSysRecord(); - uint32_t LangSysTag; - uint16_t LookupOrder; - uint16_t ReqFeatureIndex; + uint32_t LangSysTag = 0; + uint16_t LookupOrder = 0; + uint16_t ReqFeatureIndex = 0; std::vector<uint16_t, FxAllocAllocator<uint16_t>> FeatureIndices; }; @@ -38,8 +38,8 @@ TScriptRecord(); ~TScriptRecord(); - uint32_t ScriptTag; - uint16_t DefaultLangSys; + uint32_t ScriptTag = 0; + uint16_t DefaultLangSys = 0; std::vector<TLangSysRecord> LangSysRecords; }; @@ -47,52 +47,54 @@ TFeatureRecord(); ~TFeatureRecord(); - uint32_t FeatureTag; - uint16_t FeatureParams; + uint32_t FeatureTag = 0; + uint16_t FeatureParams = 0; std::vector<uint16_t, FxAllocAllocator<uint16_t>> LookupListIndices; }; struct TRangeRecord { TRangeRecord(); - uint16_t Start; - uint16_t End; - uint16_t StartCoverageIndex; + uint16_t Start = 0; + uint16_t End = 0; + uint16_t StartCoverageIndex = 0; }; struct TCoverageFormatBase { + TCoverageFormatBase(uint16_t format) : CoverageFormat(format) {} virtual ~TCoverageFormatBase() = default; - uint16_t CoverageFormat; + + const uint16_t CoverageFormat; }; struct TCoverageFormat1 final : public TCoverageFormatBase { - TCoverageFormat1(); + TCoverageFormat1(size_t initial_size); ~TCoverageFormat1() override; std::vector<uint16_t, FxAllocAllocator<uint16_t>> GlyphArray; }; struct TCoverageFormat2 final : public TCoverageFormatBase { - TCoverageFormat2(); + TCoverageFormat2(size_t initial_size); ~TCoverageFormat2() override; std::vector<TRangeRecord> RangeRecords; }; struct TDevice { - TDevice() : StartSize(0), EndSize(0), DeltaFormat(0) {} + TDevice(); - uint16_t StartSize; - uint16_t EndSize; - uint16_t DeltaFormat; + uint16_t StartSize = 0; + uint16_t EndSize = 0; + uint16_t DeltaFormat = 0; }; struct TSubTableBase { - TSubTableBase(); + TSubTableBase(uint16_t format); virtual ~TSubTableBase(); + const uint16_t SubstFormat; std::unique_ptr<TCoverageFormatBase> Coverage; - uint16_t SubstFormat; }; struct TSubTable1 final : public TSubTableBase { @@ -113,8 +115,8 @@ TLookup(); ~TLookup(); - uint16_t LookupType; - uint16_t LookupFlag; + uint16_t LookupType = 0; + uint16_t LookupFlag = 0; std::vector<std::unique_ptr<TSubTableBase>> SubTables; }; @@ -128,11 +130,11 @@ void ParseLookupList(FT_Bytes raw); void ParseLookup(FT_Bytes raw, TLookup* rec); std::unique_ptr<TCoverageFormatBase> ParseCoverage(FT_Bytes raw); - void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1* rec); - void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2* rec); - void ParseSingleSubst(FT_Bytes raw, std::unique_ptr<TSubTableBase>* rec); - void ParseSingleSubstFormat1(FT_Bytes raw, TSubTable1* rec); - void ParseSingleSubstFormat2(FT_Bytes raw, TSubTable2* rec); + std::unique_ptr<TCoverageFormat1> ParseCoverageFormat1(FT_Bytes raw); + std::unique_ptr<TCoverageFormat2> ParseCoverageFormat2(FT_Bytes raw); + std::unique_ptr<TSubTableBase> ParseSingleSubst(FT_Bytes raw); + std::unique_ptr<TSubTable1> ParseSingleSubstFormat1(FT_Bytes raw); + std::unique_ptr<TSubTable2> ParseSingleSubstFormat2(FT_Bytes raw); bool GetVerticalGlyphSub(const TFeatureRecord& feature, uint32_t glyphnum,