From 8ac090c4a57bc27044adc7abe8143ce45388b021 Mon Sep 17 00:00:00 2001 From: Henrique Nakashima Date: Wed, 11 Jul 2018 18:58:42 +0000 Subject: Split CPDF_ContentMark::AddMark() into three versions. One version is for a mark without a dictionary. The second is for a mark with a direct dictionary. The third is for a mark with indirect properties. Bug: pdfium:1118 Change-Id: Ice0ff11d5ba4eaf2ccdf57be49b9140ba5c9b159 Reviewed-on: https://pdfium-review.googlesource.com/37550 Reviewed-by: Lei Zhang Commit-Queue: Henrique Nakashima --- core/fpdfapi/page/cpdf_contentmark.cpp | 50 ++++++++++++++++++-------- core/fpdfapi/page/cpdf_contentmark.h | 10 ++++-- core/fpdfapi/page/cpdf_streamcontentparser.cpp | 12 ++++--- 3 files changed, 51 insertions(+), 21 deletions(-) (limited to 'core/fpdfapi/page') diff --git a/core/fpdfapi/page/cpdf_contentmark.cpp b/core/fpdfapi/page/cpdf_contentmark.cpp index 912cc0ea03..08b38f20c2 100644 --- a/core/fpdfapi/page/cpdf_contentmark.cpp +++ b/core/fpdfapi/page/cpdf_contentmark.cpp @@ -46,13 +46,26 @@ int CPDF_ContentMark::GetMarkedContentID() const { return m_pMarkData->GetMarkedContentID(); } -void CPDF_ContentMark::AddMark(ByteString name, - CPDF_Dictionary* pDict, - bool bDirect) { +void CPDF_ContentMark::AddMark(ByteString name) { + EnsureMarkDataExists(); + m_pMarkData->AddMark(std::move(name)); +} + +void CPDF_ContentMark::AddMarkWithDirectDict(ByteString name, + CPDF_Dictionary* pDict) { + EnsureMarkDataExists(); + m_pMarkData->AddMarkWithDirectDict(std::move(name), pDict); +} + +void CPDF_ContentMark::AddMarkWithPropertiesDict(ByteString name, + CPDF_Dictionary* pDict) { + EnsureMarkDataExists(); + m_pMarkData->AddMarkWithPropertiesDict(std::move(name), pDict); +} + +void CPDF_ContentMark::EnsureMarkDataExists() { if (!m_pMarkData) m_pMarkData.Reset(new MarkData()); - - m_pMarkData->AddMark(std::move(name), pDict, bDirect); } void CPDF_ContentMark::DeleteLastMark() { @@ -93,17 +106,26 @@ int CPDF_ContentMark::MarkData::GetMarkedContentID() const { return -1; } -void CPDF_ContentMark::MarkData::AddMark(ByteString name, - CPDF_Dictionary* pDict, - bool bDirect) { +void CPDF_ContentMark::MarkData::AddMark(ByteString name) { auto pItem = pdfium::MakeRetain(); pItem->SetName(std::move(name)); - if (pDict) { - if (bDirect) - pItem->SetDirectDict(ToDictionary(pDict->Clone())); - else - pItem->SetPropertiesDict(pDict); - } + m_Marks.push_back(pItem); +} + +void CPDF_ContentMark::MarkData::AddMarkWithDirectDict(ByteString name, + CPDF_Dictionary* pDict) { + auto pItem = pdfium::MakeRetain(); + pItem->SetName(std::move(name)); + pItem->SetDirectDict(ToDictionary(pDict->Clone())); + m_Marks.push_back(pItem); +} + +void CPDF_ContentMark::MarkData::AddMarkWithPropertiesDict( + ByteString name, + CPDF_Dictionary* pDict) { + auto pItem = pdfium::MakeRetain(); + pItem->SetName(std::move(name)); + pItem->SetPropertiesDict(pDict); m_Marks.push_back(pItem); } diff --git a/core/fpdfapi/page/cpdf_contentmark.h b/core/fpdfapi/page/cpdf_contentmark.h index e0ae1bf549..b9b10b0a48 100644 --- a/core/fpdfapi/page/cpdf_contentmark.h +++ b/core/fpdfapi/page/cpdf_contentmark.h @@ -29,7 +29,9 @@ class CPDF_ContentMark { CPDF_ContentMarkItem* GetItem(size_t i); const CPDF_ContentMarkItem* GetItem(size_t i) const; - void AddMark(ByteString name, CPDF_Dictionary* pDict, bool bDirect); + void AddMark(ByteString name); + void AddMarkWithDirectDict(ByteString name, CPDF_Dictionary* pDict); + void AddMarkWithPropertiesDict(ByteString name, CPDF_Dictionary* pDict); void DeleteLastMark(); private: @@ -44,13 +46,17 @@ class CPDF_ContentMark { const CPDF_ContentMarkItem* GetItem(size_t index) const; int GetMarkedContentID() const; - void AddMark(ByteString name, CPDF_Dictionary* pDict, bool bDictNeedClone); + void AddMark(ByteString name); + void AddMarkWithDirectDict(ByteString name, CPDF_Dictionary* pDict); + void AddMarkWithPropertiesDict(ByteString name, CPDF_Dictionary* pDict); void DeleteLastMark(); private: std::vector> m_Marks; }; + void EnsureMarkDataExists(); + RetainPtr m_pMarkData; }; diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp index 01fb347a9a..ae55390eb2 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp +++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp @@ -607,17 +607,19 @@ void CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary() { if (!pProperty) return; - bool bDirect = true; - if (pProperty->IsName()) { + bool bIndirect = pProperty->IsName(); + if (bIndirect) { pProperty = FindResourceObj("Properties", pProperty->GetString()); if (!pProperty) return; - bDirect = false; } if (CPDF_Dictionary* pDict = pProperty->AsDictionary()) { std::unique_ptr new_marks = m_ContentMarksStack.top()->Clone(); - new_marks->AddMark(std::move(tag), pDict, bDirect); + if (bIndirect) + new_marks->AddMarkWithPropertiesDict(std::move(tag), pDict); + else + new_marks->AddMarkWithDirectDict(std::move(tag), pDict); m_ContentMarksStack.push(std::move(new_marks)); } } @@ -685,7 +687,7 @@ void CPDF_StreamContentParser::Handle_BeginImage() { void CPDF_StreamContentParser::Handle_BeginMarkedContent() { std::unique_ptr new_marks = m_ContentMarksStack.top()->Clone(); - new_marks->AddMark(GetString(0), nullptr, false); + new_marks->AddMark(GetString(0)); m_ContentMarksStack.push(std::move(new_marks)); } -- cgit v1.2.3