summaryrefslogtreecommitdiff
path: root/core/fpdfapi/font/cpdf_cmapparser.cpp
diff options
context:
space:
mode:
authorRyan Harrison <rharrison@chromium.org>2018-09-12 19:09:06 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-09-12 19:09:06 +0000
commit5b9a0a9c12960e303d312656da4d49c8997b617d (patch)
treed3911fc466227fc2d94d3f743b47c42bf60142f3 /core/fpdfapi/font/cpdf_cmapparser.cpp
parent987416db22712d0b5c666be08a148946ce4b9bdb (diff)
downloadpdfium-5b9a0a9c12960e303d312656da4d49c8997b617d.tar.xz
Optimize CPDF_CMapParser
In this parser, a vector of CodeRange values are built up during operations that need to be sync'd with the CPDF_CMap that is being initialized. In the existing implementation, the vector being built as a member var for the parser, and copying the values over to the cmap whenever there is a change. When profiling, this copy is where the code spends most of its time. The code has been rewritten to have the parser reference/modify the instance of the vector in the cmap instead of having its own copy. This removes all of the copies and significantly speeds things up. BUG=chromium:881678 Change-Id: Ib8e75962507ca3d3b1ed066fd1faa4fbb7141122 Reviewed-on: https://pdfium-review.googlesource.com/42350 Commit-Queue: Ryan Harrison <rharrison@chromium.org> Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
Diffstat (limited to 'core/fpdfapi/font/cpdf_cmapparser.cpp')
-rw-r--r--core/fpdfapi/font/cpdf_cmapparser.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/core/fpdfapi/font/cpdf_cmapparser.cpp b/core/fpdfapi/font/cpdf_cmapparser.cpp
index a88448c5bd..5bfe17b34f 100644
--- a/core/fpdfapi/font/cpdf_cmapparser.cpp
+++ b/core/fpdfapi/font/cpdf_cmapparser.cpp
@@ -109,14 +109,17 @@ void CPDF_CMapParser::ParseWord(const ByteStringView& word) {
m_Status = 0;
} else if (m_Status == 7) {
if (word == "endcodespacerange") {
- size_t nSegs = m_CodeRanges.size();
+ auto code_ranges = m_pCMap->GetMixedFourByteLeadingRanges();
+ size_t nSegs = code_ranges.size();
if (nSegs == 1) {
- m_pCMap->SetCodingScheme((m_CodeRanges[0].m_CharSize == 2)
+ m_pCMap->SetCodingScheme((code_ranges[0].m_CharSize == 2)
? CPDF_CMap::TwoBytes
: CPDF_CMap::OneByte);
} else if (nSegs > 1) {
m_pCMap->SetCodingScheme(CPDF_CMap::MixedFourBytes);
- m_pCMap->SetMixedFourByteLeadingRanges(m_CodeRanges);
+ for (auto range : m_PendingRanges)
+ m_pCMap->AppendMixedFourByteLeadingRanges(range);
+ m_PendingRanges.clear();
}
m_Status = 0;
} else {
@@ -126,7 +129,7 @@ void CPDF_CMapParser::ParseWord(const ByteStringView& word) {
if (m_CodeSeq % 2) {
CPDF_CMap::CodeRange range;
if (GetCodeRange(range, m_LastWord.AsStringView(), word))
- m_CodeRanges.push_back(range);
+ m_PendingRanges.push_back(range);
}
m_CodeSeq++;
}