summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorHenrique Nakashima <hnakashima@chromium.org>2018-07-10 21:04:05 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-07-10 21:04:05 +0000
commit144107d3ca6ddd2724a460c4da4a20e6e1b7f1b7 (patch)
tree7fc11c898c7d5397f8b910d447eccfd04680f288 /core
parent416cbeab1d93b1261dfb4584e0c8e47d9cd4720f (diff)
downloadpdfium-144107d3ca6ddd2724a460c4da4a20e6e1b7f1b7.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.cpp19
-rw-r--r--core/fpdfapi/page/cpdf_contentmark.h14
-rw-r--r--core/fpdfapi/page/cpdf_contentmarkitem.cpp14
-rw-r--r--core/fpdfapi/page/cpdf_contentmarkitem.h7
-rw-r--r--core/fpdfapi/page/cpdf_streamcontentparser.cpp4
-rw-r--r--core/fpdfdoc/cpdf_occontext.cpp8
-rw-r--r--core/fpdftext/cpdf_textpage.cpp10
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");
}