Index: fpdfsdk/cba_annotiterator.cpp |
diff --git a/fpdfsdk/cba_annotiterator.cpp b/fpdfsdk/cba_annotiterator.cpp |
index ef9ab2ad31e59620fbac064be846f12ae746b9a8..a447034cda3ae1aafd9894b5eb0dc99fb23aea0c 100644 |
--- a/fpdfsdk/cba_annotiterator.cpp |
+++ b/fpdfsdk/cba_annotiterator.cpp |
@@ -10,18 +10,22 @@ |
#include "fpdfsdk/cpdfsdk_annot.h" |
#include "fpdfsdk/cpdfsdk_pageview.h" |
-// static |
-bool CBA_AnnotIterator::CompareByLeftAscending(const CPDFSDK_Annot* p1, |
- const CPDFSDK_Annot* p2) { |
+namespace { |
+ |
+CFX_FloatRect GetAnnotRect(const CPDFSDK_Annot* pAnnot) { |
+ return pAnnot->GetPDFAnnot()->GetRect(); |
+} |
+ |
+bool CompareByLeftAscending(const CPDFSDK_Annot* p1, const CPDFSDK_Annot* p2) { |
return GetAnnotRect(p1).left < GetAnnotRect(p2).left; |
} |
-// static |
-bool CBA_AnnotIterator::CompareByTopDescending(const CPDFSDK_Annot* p1, |
- const CPDFSDK_Annot* p2) { |
+bool CompareByTopDescending(const CPDFSDK_Annot* p1, const CPDFSDK_Annot* p2) { |
return GetAnnotRect(p1).top > GetAnnotRect(p2).top; |
} |
+} // namespace |
+ |
CBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, |
CPDF_Annot::Subtype nAnnotSubtype) |
: m_eTabOrder(STRUCTURE), |
@@ -66,27 +70,45 @@ CPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot) { |
return *(--iter); |
} |
+void CBA_AnnotIterator::CollectAnnots(std::vector<CPDFSDK_Annot*>* pArray) { |
+ for (auto pAnnot : m_pPageView->GetAnnotList()) { |
+ if (pAnnot->GetAnnotSubtype() == m_nAnnotSubtype && |
+ !pAnnot->IsSignatureWidget()) { |
+ pArray->push_back(pAnnot); |
+ } |
+ } |
+} |
+ |
+CFX_FloatRect CBA_AnnotIterator::AddToAnnotsList( |
+ std::vector<CPDFSDK_Annot*>* sa, |
+ size_t idx) { |
+ CPDFSDK_Annot* pLeftTopAnnot = sa->at(idx); |
+ CFX_FloatRect rcLeftTop = GetAnnotRect(pLeftTopAnnot); |
+ m_Annots.push_back(pLeftTopAnnot); |
+ sa->erase(sa->begin() + idx); |
+ return rcLeftTop; |
+} |
+ |
+void CBA_AnnotIterator::AddSelectedToAnnots(std::vector<CPDFSDK_Annot*>* sa, |
+ std::vector<size_t>* aSelect) { |
+ for (size_t i = 0; i < aSelect->size(); ++i) |
+ m_Annots.push_back(sa->at(aSelect->at(i))); |
+ |
+ for (int i = aSelect->size() - 1; i >= 0; --i) |
+ sa->erase(sa->begin() + aSelect->at(i)); |
+} |
+ |
void CBA_AnnotIterator::GenerateResults() { |
switch (m_eTabOrder) { |
- case STRUCTURE: { |
- for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { |
- CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
- if (pAnnot->GetAnnotSubtype() == m_nAnnotSubtype && |
- !pAnnot->IsSignatureWidget()) |
- m_Annots.push_back(pAnnot); |
- } |
+ case STRUCTURE: |
+ CollectAnnots(&m_Annots); |
break; |
- } |
+ |
case ROW: { |
std::vector<CPDFSDK_Annot*> sa; |
- for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { |
- CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
- if (pAnnot->GetAnnotSubtype() == m_nAnnotSubtype && |
- !pAnnot->IsSignatureWidget()) |
- sa.push_back(pAnnot); |
- } |
- |
+ CollectAnnots(&sa); |
std::sort(sa.begin(), sa.end(), CompareByLeftAscending); |
+ |
while (!sa.empty()) { |
int nLeftTopIndex = -1; |
FX_FLOAT fTop = 0.0f; |
@@ -97,38 +119,28 @@ void CBA_AnnotIterator::GenerateResults() { |
fTop = rcAnnot.top; |
} |
} |
- if (nLeftTopIndex >= 0) { |
- CPDFSDK_Annot* pLeftTopAnnot = sa[nLeftTopIndex]; |
- CFX_FloatRect rcLeftTop = GetAnnotRect(pLeftTopAnnot); |
- m_Annots.push_back(pLeftTopAnnot); |
- sa.erase(sa.begin() + nLeftTopIndex); |
- |
- std::vector<int> aSelect; |
- for (size_t i = 0; i < sa.size(); ++i) { |
- CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); |
- FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f; |
- if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top) |
- aSelect.push_back(i); |
- } |
- for (size_t i = 0; i < aSelect.size(); ++i) |
- m_Annots.push_back(sa[aSelect[i]]); |
+ if (nLeftTopIndex < 0) |
+ continue; |
+ |
+ CFX_FloatRect rcLeftTop = AddToAnnotsList(&sa, nLeftTopIndex); |
- for (int i = aSelect.size() - 1; i >= 0; --i) |
- sa.erase(sa.begin() + aSelect[i]); |
+ std::vector<size_t> aSelect; |
+ for (size_t i = 0; i < sa.size(); ++i) { |
+ CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); |
+ FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f; |
+ if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top) |
+ aSelect.push_back(i); |
} |
+ AddSelectedToAnnots(&sa, &aSelect); |
} |
break; |
} |
+ |
case COLUMN: { |
std::vector<CPDFSDK_Annot*> sa; |
- for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { |
- CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
- if (pAnnot->GetAnnotSubtype() == m_nAnnotSubtype && |
- !pAnnot->IsSignatureWidget()) |
- sa.push_back(pAnnot); |
- } |
- |
+ CollectAnnots(&sa); |
std::sort(sa.begin(), sa.end(), CompareByTopDescending); |
+ |
while (!sa.empty()) { |
int nLeftTopIndex = -1; |
FX_FLOAT fLeft = -1.0f; |
@@ -142,32 +154,21 @@ void CBA_AnnotIterator::GenerateResults() { |
fLeft = rcAnnot.left; |
} |
} |
+ if (nLeftTopIndex < 0) |
+ continue; |
- if (nLeftTopIndex >= 0) { |
- CPDFSDK_Annot* pLeftTopAnnot = sa[nLeftTopIndex]; |
- CFX_FloatRect rcLeftTop = GetAnnotRect(pLeftTopAnnot); |
- m_Annots.push_back(pLeftTopAnnot); |
- sa.erase(sa.begin() + nLeftTopIndex); |
- |
- std::vector<int> aSelect; |
- for (size_t i = 0; i < sa.size(); ++i) { |
- CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); |
- FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f; |
- if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right) |
- aSelect.push_back(i); |
- } |
- for (size_t i = 0; i < aSelect.size(); ++i) |
- m_Annots.push_back(sa[aSelect[i]]); |
+ CFX_FloatRect rcLeftTop = AddToAnnotsList(&sa, nLeftTopIndex); |
- for (int i = aSelect.size() - 1; i >= 0; --i) |
- sa.erase(sa.begin() + aSelect[i]); |
+ std::vector<size_t> aSelect; |
+ for (size_t i = 0; i < sa.size(); ++i) { |
+ CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); |
+ FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f; |
+ if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right) |
+ aSelect.push_back(i); |
} |
+ AddSelectedToAnnots(&sa, &aSelect); |
} |
break; |
} |
} |
} |
- |
-CFX_FloatRect CBA_AnnotIterator::GetAnnotRect(const CPDFSDK_Annot* pAnnot) { |
- return pAnnot->GetPDFAnnot()->GetRect(); |
-} |