diff options
author | Henrique Nakashima <hnakashima@chromium.org> | 2018-07-10 21:04:05 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-07-10 21:04:05 +0000 |
commit | 144107d3ca6ddd2724a460c4da4a20e6e1b7f1b7 (patch) | |
tree | 7fc11c898c7d5397f8b910d447eccfd04680f288 /core | |
parent | 416cbeab1d93b1261dfb4584e0c8e47d9cd4720f (diff) | |
download | pdfium-chromium/3488.tar.xz |
Create API for adding content marks and setting their params.chromium/3488
This CL creates the following new functions in the public API:
- FPDFPageObj_AddMark
- FPDFPageObjMark_SetIntParam
- FPDFPageObjMark_SetStringParam
Bug: pdfium:1037
Change-Id: Icabf3fdd8e8153b9156bab807a3708d38a9365d8
Reviewed-on: https://pdfium-review.googlesource.com/37330
Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Diffstat (limited to 'core')
-rw-r--r-- | core/fpdfapi/page/cpdf_contentmark.cpp | 19 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_contentmark.h | 14 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_contentmarkitem.cpp | 14 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_contentmarkitem.h | 7 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_streamcontentparser.cpp | 4 | ||||
-rw-r--r-- | core/fpdfdoc/cpdf_occontext.cpp | 8 | ||||
-rw-r--r-- | core/fpdftext/cpdf_textpage.cpp | 10 |
7 files changed, 50 insertions, 26 deletions
diff --git a/core/fpdfapi/page/cpdf_contentmark.cpp b/core/fpdfapi/page/cpdf_contentmark.cpp index 6021dc893d..912cc0ea03 100644 --- a/core/fpdfapi/page/cpdf_contentmark.cpp +++ b/core/fpdfapi/page/cpdf_contentmark.cpp @@ -29,7 +29,12 @@ size_t CPDF_ContentMark::CountItems() const { return m_pMarkData->CountItems(); } -const CPDF_ContentMarkItem& CPDF_ContentMark::GetItem(size_t i) const { +CPDF_ContentMarkItem* CPDF_ContentMark::GetItem(size_t i) { + ASSERT(i < CountItems()); + return m_pMarkData->GetItem(i); +} + +const CPDF_ContentMarkItem* CPDF_ContentMark::GetItem(size_t i) const { ASSERT(i < CountItems()); return m_pMarkData->GetItem(i); } @@ -42,7 +47,7 @@ int CPDF_ContentMark::GetMarkedContentID() const { } void CPDF_ContentMark::AddMark(ByteString name, - const CPDF_Dictionary* pDict, + CPDF_Dictionary* pDict, bool bDirect) { if (!m_pMarkData) m_pMarkData.Reset(new MarkData()); @@ -70,9 +75,13 @@ size_t CPDF_ContentMark::MarkData::CountItems() const { return m_Marks.size(); } -const CPDF_ContentMarkItem& CPDF_ContentMark::MarkData::GetItem( +CPDF_ContentMarkItem* CPDF_ContentMark::MarkData::GetItem(size_t index) { + return m_Marks[index].Get(); +} + +const CPDF_ContentMarkItem* CPDF_ContentMark::MarkData::GetItem( size_t index) const { - return *m_Marks[index]; + return m_Marks[index].Get(); } int CPDF_ContentMark::MarkData::GetMarkedContentID() const { @@ -85,7 +94,7 @@ int CPDF_ContentMark::MarkData::GetMarkedContentID() const { } void CPDF_ContentMark::MarkData::AddMark(ByteString name, - const CPDF_Dictionary* pDict, + CPDF_Dictionary* pDict, bool bDirect) { auto pItem = pdfium::MakeRetain<CPDF_ContentMarkItem>(); pItem->SetName(std::move(name)); diff --git a/core/fpdfapi/page/cpdf_contentmark.h b/core/fpdfapi/page/cpdf_contentmark.h index ac21151ede..e0ae1bf549 100644 --- a/core/fpdfapi/page/cpdf_contentmark.h +++ b/core/fpdfapi/page/cpdf_contentmark.h @@ -24,9 +24,12 @@ class CPDF_ContentMark { std::unique_ptr<CPDF_ContentMark> Clone(); int GetMarkedContentID() const; size_t CountItems() const; - const CPDF_ContentMarkItem& GetItem(size_t i) const; - void AddMark(ByteString name, const CPDF_Dictionary* pDict, bool bDirect); + // The returned pointer is never null. + CPDF_ContentMarkItem* GetItem(size_t i); + const CPDF_ContentMarkItem* GetItem(size_t i) const; + + void AddMark(ByteString name, CPDF_Dictionary* pDict, bool bDirect); void DeleteLastMark(); private: @@ -37,12 +40,11 @@ class CPDF_ContentMark { ~MarkData() override; size_t CountItems() const; - const CPDF_ContentMarkItem& GetItem(size_t index) const; + CPDF_ContentMarkItem* GetItem(size_t index); + const CPDF_ContentMarkItem* GetItem(size_t index) const; int GetMarkedContentID() const; - void AddMark(ByteString name, - const CPDF_Dictionary* pDict, - bool bDictNeedClone); + void AddMark(ByteString name, CPDF_Dictionary* pDict, bool bDictNeedClone); void DeleteLastMark(); private: diff --git a/core/fpdfapi/page/cpdf_contentmarkitem.cpp b/core/fpdfapi/page/cpdf_contentmarkitem.cpp index 4f56eea919..dd9f7e884c 100644 --- a/core/fpdfapi/page/cpdf_contentmarkitem.cpp +++ b/core/fpdfapi/page/cpdf_contentmarkitem.cpp @@ -26,6 +26,18 @@ const CPDF_Dictionary* CPDF_ContentMarkItem::GetParam() const { } } +CPDF_Dictionary* CPDF_ContentMarkItem::GetParam() { + switch (m_ParamType) { + case PropertiesDict: + return m_pPropertiesDict.Get(); + case DirectDict: + return m_pDirectDict.get(); + case None: + default: + return nullptr; + } +} + bool CPDF_ContentMarkItem::HasMCID() const { const CPDF_Dictionary* pDict = GetParam(); return pDict && pDict->KeyExist("MCID"); @@ -37,7 +49,7 @@ void CPDF_ContentMarkItem::SetDirectDict( m_pDirectDict = std::move(pDict); } -void CPDF_ContentMarkItem::SetPropertiesDict(const CPDF_Dictionary* pDict) { +void CPDF_ContentMarkItem::SetPropertiesDict(CPDF_Dictionary* pDict) { m_ParamType = PropertiesDict; m_pPropertiesDict = pDict; } diff --git a/core/fpdfapi/page/cpdf_contentmarkitem.h b/core/fpdfapi/page/cpdf_contentmarkitem.h index 72548cef9c..343db9d1a6 100644 --- a/core/fpdfapi/page/cpdf_contentmarkitem.h +++ b/core/fpdfapi/page/cpdf_contentmarkitem.h @@ -27,17 +27,18 @@ class CPDF_ContentMarkItem : public Retainable { ByteString GetName() const { return m_MarkName; } ParamType GetParamType() const { return m_ParamType; } const CPDF_Dictionary* GetParam() const; + CPDF_Dictionary* GetParam(); bool HasMCID() const; void SetName(const ByteString& name) { m_MarkName = name; } void SetDirectDict(std::unique_ptr<CPDF_Dictionary> pDict); - void SetPropertiesDict(const CPDF_Dictionary* pDict); + void SetPropertiesDict(CPDF_Dictionary* pDict); private: ByteString m_MarkName; ParamType m_ParamType = None; - UnownedPtr<const CPDF_Dictionary> m_pPropertiesDict; - std::unique_ptr<const CPDF_Dictionary> m_pDirectDict; + UnownedPtr<CPDF_Dictionary> m_pPropertiesDict; + std::unique_ptr<CPDF_Dictionary> m_pDirectDict; }; #endif // CORE_FPDFAPI_PAGE_CPDF_CONTENTMARKITEM_H_ diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp index ba7388cf15..01fb347a9a 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp +++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp @@ -603,7 +603,7 @@ void CPDF_StreamContentParser::Handle_EOFillStrokePath() { void CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary() { ByteString tag = GetString(1); - const CPDF_Object* pProperty = GetObject(0); + CPDF_Object* pProperty = GetObject(0); if (!pProperty) return; @@ -614,7 +614,7 @@ void CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary() { return; bDirect = false; } - if (const CPDF_Dictionary* pDict = pProperty->AsDictionary()) { + 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); diff --git a/core/fpdfdoc/cpdf_occontext.cpp b/core/fpdfdoc/cpdf_occontext.cpp index 2aac2131a1..727696bdae 100644 --- a/core/fpdfdoc/cpdf_occontext.cpp +++ b/core/fpdfdoc/cpdf_occontext.cpp @@ -182,10 +182,10 @@ bool CPDF_OCContext::GetOCGVisible(const CPDF_Dictionary* pOCGDict) { bool CPDF_OCContext::CheckObjectVisible(const CPDF_PageObject* pObj) { for (size_t i = 0; i < pObj->m_ContentMark.CountItems(); ++i) { - const CPDF_ContentMarkItem& item = pObj->m_ContentMark.GetItem(i); - if (item.GetName() == "OC" && - item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict && - !CheckOCGVisible(item.GetParam())) { + const CPDF_ContentMarkItem* item = pObj->m_ContentMark.GetItem(i); + if (item->GetName() == "OC" && + item->GetParamType() == CPDF_ContentMarkItem::PropertiesDict && + !CheckOCGVisible(item->GetParam())) { return false; } } diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp index 4c3196427a..2894160437 100644 --- a/core/fpdftext/cpdf_textpage.cpp +++ b/core/fpdftext/cpdf_textpage.cpp @@ -846,8 +846,8 @@ FPDFText_MarkedContent CPDF_TextPage::PreMarkedContent(PDFTEXT_Obj Obj) { bool bExist = false; const CPDF_Dictionary* pDict = nullptr; for (size_t i = 0; i < nContentMark; ++i) { - const CPDF_ContentMarkItem& item = pTextObj->m_ContentMark.GetItem(i); - pDict = item.GetParam(); + const CPDF_ContentMarkItem* item = pTextObj->m_ContentMark.GetItem(i); + pDict = item->GetParam(); if (!pDict) continue; const CPDF_String* temp = ToString(pDict->GetObjectFor("ActualText")); @@ -862,7 +862,7 @@ FPDFText_MarkedContent CPDF_TextPage::PreMarkedContent(PDFTEXT_Obj Obj) { if (m_pPreTextObj) { const CPDF_ContentMark& mark = m_pPreTextObj->m_ContentMark; if (mark.CountItems() == nContentMark && - mark.GetItem(nContentMark - 1).GetParam() == pDict) { + mark.GetItem(nContentMark - 1)->GetParam() == pDict) { return FPDFText_MarkedContent::Done; } } @@ -904,8 +904,8 @@ void CPDF_TextPage::ProcessMarkedContent(PDFTEXT_Obj Obj) { WideString actText; for (size_t n = 0; n < nContentMark; n++) { - const CPDF_ContentMarkItem& item = pTextObj->m_ContentMark.GetItem(n); - const CPDF_Dictionary* pDict = item.GetParam(); + const CPDF_ContentMarkItem* item = pTextObj->m_ContentMark.GetItem(n); + const CPDF_Dictionary* pDict = item->GetParam(); if (pDict) actText = pDict->GetUnicodeTextFor("ActualText"); } |