Index: core/fpdfdoc/cpdf_annotlist.cpp |
diff --git a/core/fpdfdoc/cpdf_annotlist.cpp b/core/fpdfdoc/cpdf_annotlist.cpp |
index e6c93c1d1ebf2602454d8d984695cf8cc49e7db5..4c569892c2056c9b235d822756657811db36a800 100644 |
--- a/core/fpdfdoc/cpdf_annotlist.cpp |
+++ b/core/fpdfdoc/cpdf_annotlist.cpp |
@@ -16,6 +16,40 @@ |
#include "core/fpdfdoc/include/cpdf_occontext.h" |
#include "core/fxge/include/cfx_renderdevice.h" |
+namespace { |
+ |
+std::unique_ptr<CPDF_Annot> CreatePopupAnnot(CPDF_Annot* pAnnot, |
+ CPDF_Document* pDocument) { |
+ CPDF_Dictionary* pParentDict = pAnnot->GetAnnotDict(); |
+ if (!pParentDict) |
+ return std::unique_ptr<CPDF_Annot>(); |
+ |
+ CFX_ByteString sContents = pParentDict->GetStringBy("Contents"); |
+ if (sContents.IsEmpty()) |
+ return std::unique_ptr<CPDF_Annot>(); |
+ |
+ CPDF_Dictionary* pAnnotDict = new CPDF_Dictionary; |
+ pAnnotDict->SetAtName("Type", "Annot"); |
+ pAnnotDict->SetAtName("Subtype", "Popup"); |
+ pAnnotDict->SetAtString("T", pParentDict->GetStringBy("T")); |
+ pAnnotDict->SetAtString("Contents", sContents); |
+ |
+ CFX_FloatRect rect = pParentDict->GetRectBy("Rect"); |
+ rect.Normalize(); |
+ CFX_FloatRect popupRect(0, 0, 200, 200); |
+ popupRect.Translate(rect.left, rect.bottom - popupRect.Height()); |
+ |
+ pAnnotDict->SetAtRect("Rect", popupRect); |
+ pAnnotDict->SetAtInteger("F", 0); |
+ |
+ std::unique_ptr<CPDF_Annot> pPopupAnnot( |
+ new CPDF_Annot(pAnnotDict, pDocument)); |
+ pAnnot->SetPopupAnnot(pPopupAnnot.get()); |
+ return pPopupAnnot; |
+} |
+ |
+} // namespace |
+ |
CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) |
: m_pDocument(pPage->m_pDocument) { |
if (!pPage->m_pFormDict) |
@@ -42,6 +76,12 @@ CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) |
pAnnots->RemoveAt(i + 1); |
pDict = pAnnots->GetDictAt(i); |
} |
+ |
+ // Skip creating Popup annotation in the PDF document since PDFium provides |
+ // its own Popup annotations. |
+ if (pDict->GetStringBy("Subtype") == "Popup") |
+ continue; |
+ |
m_AnnotList.push_back( |
std::unique_ptr<CPDF_Annot>(new CPDF_Annot(pDict, m_pDocument))); |
if (bRegenerateAP && pDict->GetStringBy("Subtype") == "Widget" && |
@@ -49,6 +89,14 @@ CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) |
FPDF_GenerateAP(m_pDocument, pDict); |
} |
} |
+ |
+ size_t nAnnotListSize = m_AnnotList.size(); |
+ for (size_t i = 0; i < nAnnotListSize; ++i) { |
+ std::unique_ptr<CPDF_Annot> pPopupAnnot( |
+ CreatePopupAnnot(m_AnnotList[i].get(), m_pDocument)); |
+ if (pPopupAnnot) |
+ m_AnnotList.push_back(std::move(pPopupAnnot)); |
+ } |
} |
CPDF_AnnotList::~CPDF_AnnotList() {} |