diff options
author | Henrique Nakashima <hnakashima@chromium.org> | 2018-07-11 18:58:42 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-07-11 18:58:42 +0000 |
commit | 8ac090c4a57bc27044adc7abe8143ce45388b021 (patch) | |
tree | 1e7edcced6de44e83e11b63578bc1f8b00399f34 | |
parent | b165ffb64e59998ec6d5f76c82bd2fe53734b3cd (diff) | |
download | pdfium-8ac090c4a57bc27044adc7abe8143ce45388b021.tar.xz |
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 <thestig@chromium.org>
Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
-rw-r--r-- | core/fpdfapi/page/cpdf_contentmark.cpp | 50 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_contentmark.h | 10 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_streamcontentparser.cpp | 12 | ||||
-rw-r--r-- | fpdfsdk/fpdf_editpage.cpp | 2 |
4 files changed, 52 insertions, 22 deletions
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<CPDF_ContentMarkItem>(); 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<CPDF_ContentMarkItem>(); + 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<CPDF_ContentMarkItem>(); + 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<RetainPtr<CPDF_ContentMarkItem>> m_Marks; }; + void EnsureMarkDataExists(); + RetainPtr<MarkData> 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<CPDF_ContentMark> 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<CPDF_ContentMark> 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)); } diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp index 4151de5dfd..8d8c315b07 100644 --- a/fpdfsdk/fpdf_editpage.cpp +++ b/fpdfsdk/fpdf_editpage.cpp @@ -326,7 +326,7 @@ FPDFPageObj_AddMark(FPDF_PAGEOBJECT page_object, FPDF_BYTESTRING name) { return nullptr; auto* mark = &CPDFPageObjectFromFPDFPageObject(page_object)->m_ContentMark; - mark->AddMark(name, nullptr, true); + mark->AddMark(name); unsigned long index = mark->CountItems() - 1; return FPDFPageObjectMarkFromCPDFContentMarkItem(mark->GetItem(index)); |