Index: fpdfsdk/src/fsdk_baseform.cpp |
diff --git a/fpdfsdk/src/fsdk_baseform.cpp b/fpdfsdk/src/fsdk_baseform.cpp |
index 218ee1d83a4fe335d83f1d65736be416b0d6461a..46aa1f3d85a29202050ef92082f01d2b520fdce6 100644 |
--- a/fpdfsdk/src/fsdk_baseform.cpp |
+++ b/fpdfsdk/src/fsdk_baseform.cpp |
@@ -6,6 +6,7 @@ |
#include "fpdfsdk/include/fsdk_baseform.h" |
+#include <algorithm> |
#include <memory> |
#include "fpdfsdk/include/formfiller/FFL_FormFiller.h" |
@@ -2079,177 +2080,125 @@ FX_COLORREF CPDFSDK_InterForm::GetHighlightColor(int nFieldType) { |
CBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, |
const CFX_ByteString& sType, |
const CFX_ByteString& sSubType) |
- : m_pPageView(pPageView), |
+ : m_eTabOrder(STRUCTURE), |
+ m_pPageView(pPageView), |
m_sType(sType), |
- m_sSubType(sSubType), |
- m_nTabs(BAI_STRUCTURE) { |
+ m_sSubType(sSubType) { |
CPDF_Page* pPDFPage = m_pPageView->GetPDFPage(); |
CFX_ByteString sTabs = pPDFPage->m_pFormDict->GetStringBy("Tabs"); |
- |
- if (sTabs == "R") { |
- m_nTabs = BAI_ROW; |
- } else if (sTabs == "C") { |
- m_nTabs = BAI_COLUMN; |
- } else { |
- m_nTabs = BAI_STRUCTURE; |
- } |
+ if (sTabs == "R") |
+ m_eTabOrder = ROW; |
+ else if (sTabs == "C") |
+ m_eTabOrder = COLUMN; |
GenerateResults(); |
} |
CBA_AnnotIterator::~CBA_AnnotIterator() { |
- m_Annots.RemoveAll(); |
} |
CPDFSDK_Annot* CBA_AnnotIterator::GetFirstAnnot() { |
- if (m_Annots.GetSize() > 0) |
- return m_Annots[0]; |
- |
- return NULL; |
+ return m_Annots.empty() ? nullptr : m_Annots.front(); |
} |
CPDFSDK_Annot* CBA_AnnotIterator::GetLastAnnot() { |
- if (m_Annots.GetSize() > 0) |
- return m_Annots[m_Annots.GetSize() - 1]; |
- |
- return NULL; |
+ return m_Annots.empty() ? nullptr : m_Annots.back(); |
} |
CPDFSDK_Annot* CBA_AnnotIterator::GetNextAnnot(CPDFSDK_Annot* pAnnot) { |
- for (int i = 0, sz = m_Annots.GetSize(); i < sz; ++i) { |
- if (m_Annots[i] == pAnnot) |
- return (i + 1 < sz) ? m_Annots[i + 1] : m_Annots[0]; |
- } |
- return NULL; |
+ auto iter = std::find(m_Annots.begin(), m_Annots.end(), pAnnot); |
+ if (iter == m_Annots.end()) |
+ return nullptr; |
+ ++iter; |
+ if (iter == m_Annots.end()) |
+ iter = m_Annots.begin(); |
+ return *iter; |
} |
CPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot) { |
- for (int i = 0, sz = m_Annots.GetSize(); i < sz; ++i) { |
- if (m_Annots[i] == pAnnot) |
- return (i - 1 >= 0) ? m_Annots[i - 1] : m_Annots[sz - 1]; |
- } |
- return NULL; |
+ auto iter = std::find(m_Annots.begin(), m_Annots.end(), pAnnot); |
+ if (iter == m_Annots.end()) |
+ return nullptr; |
+ if (iter == m_Annots.begin()) |
+ iter = m_Annots.end(); |
+ return *(--iter); |
} |
-int CBA_AnnotIterator::CompareByLeft(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) { |
- ASSERT(p1); |
- ASSERT(p2); |
- |
- CPDF_Rect rcAnnot1 = GetAnnotRect(p1); |
- CPDF_Rect rcAnnot2 = GetAnnotRect(p2); |
- |
- if (rcAnnot1.left < rcAnnot2.left) |
- return -1; |
- if (rcAnnot1.left > rcAnnot2.left) |
- return 1; |
- return 0; |
+// static |
+bool CBA_AnnotIterator::CompareByLeftAscending(const CPDFSDK_Annot* p1, |
+ const CPDFSDK_Annot* p2) { |
+ return GetAnnotRect(p1).left < GetAnnotRect(p2).left; |
} |
-int CBA_AnnotIterator::CompareByTop(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) { |
- ASSERT(p1); |
- ASSERT(p2); |
- |
- CPDF_Rect rcAnnot1 = GetAnnotRect(p1); |
- CPDF_Rect rcAnnot2 = GetAnnotRect(p2); |
- |
- if (rcAnnot1.top < rcAnnot2.top) |
- return -1; |
- if (rcAnnot1.top > rcAnnot2.top) |
- return 1; |
- return 0; |
+// static |
+bool CBA_AnnotIterator::CompareByTopDescending(const CPDFSDK_Annot* p1, |
+ const CPDFSDK_Annot* p2) { |
+ return GetAnnotRect(p1).top > GetAnnotRect(p2).top; |
} |
void CBA_AnnotIterator::GenerateResults() { |
- switch (m_nTabs) { |
- case BAI_STRUCTURE: { |
+ switch (m_eTabOrder) { |
+ case STRUCTURE: { |
for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { |
CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) |
- m_Annots.Add(pAnnot); |
+ m_Annots.push_back(pAnnot); |
} |
- break; |
- } |
- case BAI_ROW: { |
- CPDFSDK_SortAnnots sa; |
+ } 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->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) |
- sa.Add(pAnnot); |
+ sa.push_back(pAnnot); |
} |
- if (sa.GetSize() > 0) |
- sa.Sort(CBA_AnnotIterator::CompareByLeft); |
- |
- while (sa.GetSize() > 0) { |
+ std::sort(sa.begin(), sa.end(), CompareByLeftAscending); |
+ while (!sa.empty()) { |
int nLeftTopIndex = -1; |
FX_FLOAT fTop = 0.0f; |
- |
- for (int i = sa.GetSize() - 1; i >= 0; i--) { |
- CPDFSDK_Annot* pAnnot = sa.GetAt(i); |
- ASSERT(pAnnot); |
- |
- CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); |
- |
+ for (int i = sa.size() - 1; i >= 0; i--) { |
+ CPDF_Rect rcAnnot = GetAnnotRect(sa[i]); |
if (rcAnnot.top > fTop) { |
nLeftTopIndex = i; |
fTop = rcAnnot.top; |
} |
} |
- |
if (nLeftTopIndex >= 0) { |
- CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); |
- ASSERT(pLeftTopAnnot); |
- |
+ CPDFSDK_Annot* pLeftTopAnnot = sa[nLeftTopIndex]; |
CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); |
+ m_Annots.push_back(pLeftTopAnnot); |
+ sa.erase(sa.begin() + nLeftTopIndex); |
- m_Annots.Add(pLeftTopAnnot); |
- sa.RemoveAt(nLeftTopIndex); |
- |
- CFX_ArrayTemplate<int> aSelect; |
- |
- for (int i = 0, sz = sa.GetSize(); i < sz; ++i) { |
- CPDFSDK_Annot* pAnnot = sa.GetAt(i); |
- ASSERT(pAnnot); |
- |
- CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); |
+ std::vector<int> aSelect; |
+ for (int i = 0; i < sa.size(); ++i) { |
+ CPDF_Rect rcAnnot = GetAnnotRect(sa[i]); |
FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f; |
if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top) |
- aSelect.Add(i); |
+ aSelect.push_back(i); |
} |
+ for (int i = 0; i < aSelect.size(); ++i) |
+ m_Annots.push_back(sa[aSelect[i]]); |
- for (int i = 0, sz = aSelect.GetSize(); i < sz; ++i) |
- m_Annots.Add(sa[aSelect[i]]); |
- |
- for (int i = aSelect.GetSize() - 1; i >= 0; --i) |
- sa.RemoveAt(aSelect[i]); |
- |
- aSelect.RemoveAll(); |
+ for (int i = aSelect.size() - 1; i >= 0; --i) |
+ sa.erase(sa.begin() + aSelect[i]); |
} |
} |
- sa.RemoveAll(); |
- break; |
- } |
- case BAI_COLUMN: { |
- CPDFSDK_SortAnnots sa; |
+ } 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->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) |
- sa.Add(pAnnot); |
+ sa.push_back(pAnnot); |
} |
- if (sa.GetSize() > 0) |
- sa.Sort(CBA_AnnotIterator::CompareByTop, FALSE); |
- |
- while (sa.GetSize() > 0) { |
+ std::sort(sa.begin(), sa.end(), CompareByTopDescending); |
+ while (!sa.empty()) { |
int nLeftTopIndex = -1; |
FX_FLOAT fLeft = -1.0f; |
- |
- for (int i = sa.GetSize() - 1; i >= 0; --i) { |
- CPDFSDK_Annot* pAnnot = sa.GetAt(i); |
- ASSERT(pAnnot); |
- |
- CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); |
- |
+ for (int i = sa.size() - 1; i >= 0; --i) { |
+ CPDF_Rect rcAnnot = GetAnnotRect(sa[i]); |
if (fLeft < 0) { |
nLeftTopIndex = 0; |
fLeft = rcAnnot.left; |
@@ -2260,41 +2209,31 @@ void CBA_AnnotIterator::GenerateResults() { |
} |
if (nLeftTopIndex >= 0) { |
- CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); |
- ASSERT(pLeftTopAnnot); |
- |
+ CPDFSDK_Annot* pLeftTopAnnot = sa[nLeftTopIndex]; |
CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); |
+ m_Annots.push_back(pLeftTopAnnot); |
+ sa.erase(sa.begin() + nLeftTopIndex); |
- m_Annots.Add(pLeftTopAnnot); |
- sa.RemoveAt(nLeftTopIndex); |
- |
- CFX_ArrayTemplate<int> aSelect; |
- for (int i = 0, sz = sa.GetSize(); i < sz; ++i) { |
- CPDFSDK_Annot* pAnnot = sa.GetAt(i); |
- ASSERT(pAnnot); |
- |
- CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); |
+ std::vector<int> aSelect; |
+ for (int i = 0; i < sa.size(); ++i) { |
+ CPDF_Rect rcAnnot = GetAnnotRect(sa[i]); |
FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f; |
if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right) |
- aSelect.Add(i); |
+ aSelect.push_back(i); |
} |
+ for (int i = 0; i < aSelect.size(); ++i) |
+ m_Annots.push_back(sa[aSelect[i]]); |
- for (int i = 0, sz = aSelect.GetSize(); i < sz; ++i) |
- m_Annots.Add(sa[aSelect[i]]); |
- |
- for (int i = aSelect.GetSize() - 1; i >= 0; --i) |
- sa.RemoveAt(aSelect[i]); |
- |
- aSelect.RemoveAll(); |
+ for (int i = aSelect.size() - 1; i >= 0; --i) |
+ sa.erase(sa.begin() + aSelect[i]); |
} |
} |
- sa.RemoveAll(); |
break; |
} |
} |
} |
-CPDF_Rect CBA_AnnotIterator::GetAnnotRect(CPDFSDK_Annot* pAnnot) { |
+CPDF_Rect CBA_AnnotIterator::GetAnnotRect(const CPDFSDK_Annot* pAnnot) { |
CPDF_Rect rcAnnot; |
pAnnot->GetPDFAnnot()->GetRect(rcAnnot); |
return rcAnnot; |