Simplify CPDF_CMap ctor. Instead of using CPDF_CMapParser::HasAdditionalMappings() and TakeAdditionalMappings() in the CPDF_CMap ctor to take the mappings from the parser, CPDF_CMap can implement SetAdditionalMappings(), and let the parser call it to set the mappings. This is consistent with how CPDF_CMapParser sets many other CPDF_CMap members. Change-Id: I722593ea2565c557899e1190cc2f78f3ac9e3c7e Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/59514 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_cmap.cpp b/core/fpdfapi/font/cpdf_cmap.cpp index 81ee02d..d4797bc 100644 --- a/core/fpdfapi/font/cpdf_cmap.cpp +++ b/core/fpdfapi/font/cpdf_cmap.cpp
@@ -295,16 +295,6 @@ parser.ParseWord(word); } - - if (m_CodingScheme == MixedFourBytes && parser.HasAdditionalMappings()) { - m_AdditionalCharcodeToCIDMappings = parser.TakeAdditionalMappings(); - std::sort( - m_AdditionalCharcodeToCIDMappings.begin(), - m_AdditionalCharcodeToCIDMappings.end(), - [](const CPDF_CMap::CIDRange& arg1, const CPDF_CMap::CIDRange& arg2) { - return arg1.m_EndCode < arg2.m_EndCode; - }); - } } CPDF_CMap::~CPDF_CMap() = default; @@ -476,6 +466,19 @@ return 0; } +void CPDF_CMap::SetAdditionalMappings(std::vector<CIDRange> mappings) { + ASSERT(m_AdditionalCharcodeToCIDMappings.empty()); + if (m_CodingScheme != MixedFourBytes || mappings.empty()) + return; + + std::sort( + mappings.begin(), mappings.end(), + [](const CPDF_CMap::CIDRange& arg1, const CPDF_CMap::CIDRange& arg2) { + return arg1.m_EndCode < arg2.m_EndCode; + }); + m_AdditionalCharcodeToCIDMappings = std::move(mappings); +} + void CPDF_CMap::SetMixedFourByteLeadingRanges(std::vector<CodeRange> ranges) { m_MixedFourByteLeadingRanges = std::move(ranges); }
diff --git a/core/fpdfapi/font/cpdf_cmap.h b/core/fpdfapi/font/cpdf_cmap.h index c9dc61f..6754c71 100644 --- a/core/fpdfapi/font/cpdf_cmap.h +++ b/core/fpdfapi/font/cpdf_cmap.h
@@ -62,6 +62,7 @@ void SetVertical(bool vert) { m_bVertical = vert; } void SetCodingScheme(CodingScheme scheme) { m_CodingScheme = scheme; } + void SetAdditionalMappings(std::vector<CIDRange> mappings); void SetMixedFourByteLeadingRanges(std::vector<CodeRange> ranges); int GetCoding() const { return m_Coding; }
diff --git a/core/fpdfapi/font/cpdf_cmapparser.cpp b/core/fpdfapi/font/cpdf_cmapparser.cpp index 1ef8a7c..6b5e56f 100644 --- a/core/fpdfapi/font/cpdf_cmapparser.cpp +++ b/core/fpdfapi/font/cpdf_cmapparser.cpp
@@ -29,6 +29,7 @@ CPDF_CMapParser::CPDF_CMapParser(CPDF_CMap* pCMap) : m_pCMap(pCMap) {} CPDF_CMapParser::~CPDF_CMapParser() { + m_pCMap->SetAdditionalMappings(std::move(m_AdditionalCharcodeToCIDMappings)); m_pCMap->SetMixedFourByteLeadingRanges(std::move(m_Ranges)); }
diff --git a/core/fpdfapi/font/cpdf_cmapparser.h b/core/fpdfapi/font/cpdf_cmapparser.h index f24a93b..b2454af 100644 --- a/core/fpdfapi/font/cpdf_cmapparser.h +++ b/core/fpdfapi/font/cpdf_cmapparser.h
@@ -21,12 +21,6 @@ ~CPDF_CMapParser(); void ParseWord(ByteStringView word); - bool HasAdditionalMappings() const { - return !m_AdditionalCharcodeToCIDMappings.empty(); - } - std::vector<CPDF_CMap::CIDRange> TakeAdditionalMappings() { - return std::move(m_AdditionalCharcodeToCIDMappings); - } static CIDSet CharsetFromOrdering(ByteStringView ordering);