Index: core/src/fpdfapi/fpdf_page/fpdf_page.cpp |
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page.cpp |
index 4194ff75eb73c3ed1690c29ca583c2ef58a5832a..b1de6d6de26e6f7276b7dc60b937e8fa35fdb140 100644 |
--- a/core/src/fpdfapi/fpdf_page/fpdf_page.cpp |
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page.cpp |
@@ -6,8 +6,11 @@ |
#include "core/src/fpdfapi/fpdf_page/pageint.h" |
+#include <algorithm> |
+ |
#include "core/include/fpdfapi/fpdf_module.h" |
#include "core/include/fpdfapi/fpdf_page.h" |
+#include "third_party/base/stl_util.h" |
CPDF_PageObject* CPDF_PageObject::Create(int type) { |
switch (type) { |
@@ -670,6 +673,19 @@ void CPDF_FormObject::CalcBoundingBox() { |
m_Right = form_rect.right; |
m_Top = form_rect.top; |
} |
+ |
+CPDF_PageObject* CPDF_PageObjectList::GetPageObjectByIndex(int index) { |
+ if (index < 0 || index >= pdfium::CollectionSize<int>(*this)) |
+ return nullptr; |
+ int current = 0; |
+ for (const auto& pObj : *this) { |
+ if (index == current) |
+ return pObj.get(); |
+ ++current; |
+ } |
+ return nullptr; |
+} |
+ |
CPDF_PageObjectHolder::CPDF_PageObjectHolder() |
: m_pFormDict(nullptr), |
m_pFormStream(nullptr), |
@@ -679,15 +695,8 @@ CPDF_PageObjectHolder::CPDF_PageObjectHolder() |
m_Transparency(0), |
m_bBackgroundAlphaNeeded(FALSE), |
m_bHasImageMask(FALSE), |
- m_ParseState(CONTENT_NOT_PARSED), |
- m_PageObjectList(128) {} |
+ m_ParseState(CONTENT_NOT_PARSED) {} |
-CPDF_PageObjectHolder::~CPDF_PageObjectHolder() { |
- FX_POSITION pos = m_PageObjectList.GetHeadPosition(); |
- while (pos) { |
- delete m_PageObjectList.GetNextObject(pos); |
- } |
-} |
void CPDF_PageObjectHolder::ContinueParse(IFX_Pause* pPause) { |
if (!m_pParser) { |
return; |
@@ -698,48 +707,29 @@ void CPDF_PageObjectHolder::ContinueParse(IFX_Pause* pPause) { |
m_pParser.reset(); |
} |
} |
-FX_POSITION CPDF_PageObjectList::InsertObject(FX_POSITION posInsertAfter, |
- CPDF_PageObject* pNewObject) { |
- if (!posInsertAfter) { |
- return AddHead(pNewObject); |
- } |
- return InsertAfter(posInsertAfter, pNewObject); |
-} |
-CPDF_PageObject* CPDF_PageObjectList::GetObjectByIndex(int index) const { |
- FX_POSITION pos = FindIndex(index); |
- return pos ? GetObjectAt(pos) : nullptr; |
-} |
+ |
void CPDF_PageObjectHolder::Transform(const CFX_Matrix& matrix) { |
- FX_POSITION pos = m_PageObjectList.GetHeadPosition(); |
- while (pos) { |
- m_PageObjectList.GetNextObject(pos)->Transform(matrix); |
- } |
+ for (auto& pObj : m_PageObjectList) |
+ pObj->Transform(matrix); |
} |
+ |
CFX_FloatRect CPDF_PageObjectHolder::CalcBoundingBox() const { |
- if (m_PageObjectList.GetCount() == 0) { |
+ if (m_PageObjectList.empty()) |
return CFX_FloatRect(0, 0, 0, 0); |
- } |
- FX_FLOAT left, right, top, bottom; |
- left = bottom = 1000000 * 1.0f; |
- right = top = -1000000 * 1.0f; |
- FX_POSITION pos = m_PageObjectList.GetHeadPosition(); |
- while (pos) { |
- CPDF_PageObject* pObj = (CPDF_PageObject*)m_PageObjectList.GetNext(pos); |
- if (left > pObj->m_Left) { |
- left = pObj->m_Left; |
- } |
- if (right < pObj->m_Right) { |
- right = pObj->m_Right; |
- } |
- if (top < pObj->m_Top) { |
- top = pObj->m_Top; |
- } |
- if (bottom > pObj->m_Bottom) { |
- bottom = pObj->m_Bottom; |
- } |
+ |
+ FX_FLOAT left = 1000000.0f; |
+ FX_FLOAT right = -1000000.0f; |
+ FX_FLOAT bottom = 1000000.0f; |
+ FX_FLOAT top = -1000000.0f; |
+ for (const auto& pObj : m_PageObjectList) { |
+ left = std::min(left, pObj->m_Left); |
+ right = std::max(right, pObj->m_Right); |
+ bottom = std::min(bottom, pObj->m_Bottom); |
+ top = std::max(top, pObj->m_Top); |
} |
return CFX_FloatRect(left, bottom, right, top); |
} |
+ |
void CPDF_PageObjectHolder::LoadTransInfo() { |
if (!m_pFormDict) { |
return; |
@@ -889,7 +879,9 @@ CPDF_Form::CPDF_Form(CPDF_Document* pDoc, |
m_Transparency = 0; |
LoadTransInfo(); |
} |
+ |
CPDF_Form::~CPDF_Form() {} |
+ |
void CPDF_Form::StartParse(CPDF_AllStates* pGraphicStates, |
CFX_Matrix* pParentMatrix, |
CPDF_Type3Char* pType3Char, |
@@ -903,6 +895,7 @@ void CPDF_Form::StartParse(CPDF_AllStates* pGraphicStates, |
level); |
m_ParseState = CONTENT_PARSING; |
} |
+ |
void CPDF_Form::ParseContent(CPDF_AllStates* pGraphicStates, |
CFX_Matrix* pParentMatrix, |
CPDF_Type3Char* pType3Char, |
@@ -911,16 +904,16 @@ void CPDF_Form::ParseContent(CPDF_AllStates* pGraphicStates, |
StartParse(pGraphicStates, pParentMatrix, pType3Char, pOptions, level); |
ContinueParse(NULL); |
} |
+ |
CPDF_Form* CPDF_Form::Clone() const { |
- CPDF_Form* pClone = |
+ CPDF_Form* pCloneForm = |
new CPDF_Form(m_pDocument, m_pPageResources, m_pFormStream, m_pResources); |
- FX_POSITION pos = m_PageObjectList.GetHeadPosition(); |
- while (pos) { |
- CPDF_PageObject* pObj = (CPDF_PageObject*)m_PageObjectList.GetNext(pos); |
- pClone->m_PageObjectList.AddTail(pObj->Clone()); |
- } |
- return pClone; |
+ for (const auto& pObj : m_PageObjectList) |
+ pCloneForm->m_PageObjectList.emplace_back(pObj->Clone()); |
+ |
+ return pCloneForm; |
} |
+ |
void CPDF_Page::GetDisplayMatrix(CFX_Matrix& matrix, |
int xPos, |
int yPos, |