Index: fpdfsdk/src/fsdk_annothandler.cpp |
diff --git a/fpdfsdk/src/fsdk_annothandler.cpp b/fpdfsdk/src/fsdk_annothandler.cpp |
index bb999e1f08c420f768f0b7fa9935eac71794dd2c..b1b2e2cc7624c1e4f702749476e2405ef8685542 100644 |
--- a/fpdfsdk/src/fsdk_annothandler.cpp |
+++ b/fpdfsdk/src/fsdk_annothandler.cpp |
@@ -4,6 +4,8 @@ |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
+#include <algorithm> |
+ |
#include "../include/fsdk_define.h" |
#include "../include/fsdk_mgr.h" |
#include "../include/formfiller/FFL_FormFiller.h" |
@@ -649,164 +651,45 @@ FX_BOOL CPDFSDK_BFAnnotHandler::HitTest(CPDFSDK_PageView* pPageView, |
return rect.Contains(point.x, point.y); |
} |
-// CReader_AnnotIteratorEx |
- |
CPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView* pPageView, |
- FX_BOOL bReverse, |
- FX_BOOL bIgnoreTopmost /*=FALSE*/, |
- FX_BOOL bCircle /*=FALSE*/, |
- CFX_PtrArray* pList /*=NULL*/) { |
- ASSERT(pPageView); |
- m_bReverse = bReverse; |
- m_bIgnoreTopmost = bIgnoreTopmost; |
- m_bCircle = bCircle; |
- m_pIteratorAnnotList.RemoveAll(); |
- InitIteratorAnnotList(pPageView, pList); |
-} |
- |
-CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot(const CPDFSDK_Annot* pCurrent) { |
- int index = -1; |
- int nCount = m_pIteratorAnnotList.GetSize(); |
- if (pCurrent) { |
- for (int i = 0; i < nCount; i++) { |
- CPDFSDK_Annot* pReaderAnnot = |
- (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(i); |
- if (pReaderAnnot == pCurrent) { |
- index = i; |
- break; |
- } |
- } |
- } |
- return NextAnnot(index); |
-} |
-CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot(const CPDFSDK_Annot* pCurrent) { |
- int index = -1; |
- int nCount = m_pIteratorAnnotList.GetSize(); |
- if (pCurrent) { |
- for (int i = 0; i < nCount; i++) { |
- CPDFSDK_Annot* pReaderAnnot = |
- (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(i); |
- if (pReaderAnnot == pCurrent) { |
- index = i; |
- break; |
- } |
- } |
- } |
- return PrevAnnot(index); |
-} |
-CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot(int& index) { |
- int nCount = m_pIteratorAnnotList.GetSize(); |
- if (nCount <= 0) |
- index = -1; |
- else { |
- if (index < 0) { |
- index = 0; |
- } else { |
- if (m_bCircle) { |
- index = (index < nCount - 1) ? (index + 1) : 0; |
- } else { |
- index = (index < nCount - 1) ? (index + 1) : -1; |
- } |
- } |
- } |
- return (index < 0) ? NULL : (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(index); |
-} |
- |
-CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot(int& index) { |
- int nCount = m_pIteratorAnnotList.GetSize(); |
- if (nCount <= 0) |
- index = -1; |
- else { |
- if (index < 0) { |
- index = nCount - 1; |
- } else { |
- if (m_bCircle) { |
- index = (index > 0) ? (index - 1) : nCount - 1; |
- } else { |
- index = (index > 0) ? (index - 1) : -1; |
- } |
- } |
- } |
- return (index < 0) ? NULL : (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(index); |
-} |
+ bool bReverse) |
+ : m_bReverse(bReverse), m_pos(0) { |
+ const std::vector<CPDFSDK_Annot*>& annots = pPageView->GetAnnotList(); |
+ m_iteratorAnnotList.insert(m_iteratorAnnotList.begin(), annots.rbegin(), |
+ annots.rend()); |
+ std::stable_sort(m_iteratorAnnotList.begin(), m_iteratorAnnotList.end(), |
+ [](CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) { |
+ return p1->GetLayoutOrder() < p2->GetLayoutOrder(); |
+ }); |
-CPDFSDK_Annot* CPDFSDK_AnnotIterator::Next(const CPDFSDK_Annot* pCurrent) { |
- return (m_bReverse) ? PrevAnnot(pCurrent) : NextAnnot(pCurrent); |
-} |
+ CPDFSDK_Annot* pTopMostAnnot = pPageView->GetFocusAnnot(); |
+ if (!pTopMostAnnot) |
+ return; |
-CPDFSDK_Annot* CPDFSDK_AnnotIterator::Prev(const CPDFSDK_Annot* pCurrent) { |
- return (m_bReverse) ? NextAnnot(pCurrent) : PrevAnnot(pCurrent); |
+ auto it = std::find(m_iteratorAnnotList.begin(), m_iteratorAnnotList.end(), |
+ pTopMostAnnot); |
+ if (it != m_iteratorAnnotList.end()) { |
+ CPDFSDK_Annot* pReaderAnnot = *it; |
+ m_iteratorAnnotList.erase(it); |
+ m_iteratorAnnotList.insert(m_iteratorAnnotList.begin(), pReaderAnnot); |
+ } |
} |
-CPDFSDK_Annot* CPDFSDK_AnnotIterator::Next(int& index) { |
- return (m_bReverse) ? PrevAnnot(index) : NextAnnot(index); |
+CPDFSDK_AnnotIterator::~CPDFSDK_AnnotIterator() { |
} |
-CPDFSDK_Annot* CPDFSDK_AnnotIterator::Prev(int& index) { |
- return (m_bReverse) ? NextAnnot(index) : PrevAnnot(index); |
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot() { |
+ if (m_pos < m_iteratorAnnotList.size()) |
+ return m_iteratorAnnotList[m_pos++]; |
+ return nullptr; |
} |
-void CPDFSDK_AnnotIterator::InsertSort(CFX_PtrArray& arrayList, |
- AI_COMPARE pCompare) { |
- for (int i = 1; i < arrayList.GetSize(); i++) { |
- if (pCompare((CPDFSDK_Annot*)(arrayList[i]), |
- (CPDFSDK_Annot*)(arrayList[i - 1])) < 0) { |
- int j = i - 1; |
- CPDFSDK_Annot* pTemp = (CPDFSDK_Annot*)arrayList[i]; |
- |
- do { |
- arrayList[j + 1] = arrayList[j]; |
- } while (--j >= 0 && pCompare(pTemp, (CPDFSDK_Annot*)arrayList[j]) < 0); |
- |
- arrayList[j + 1] = pTemp; |
- } |
- } |
-} |
- |
-int LyOrderCompare(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) { |
- if (p1->GetLayoutOrder() < p2->GetLayoutOrder()) |
- return -1; |
- if (p1->GetLayoutOrder() > p2->GetLayoutOrder()) |
- return 1; |
- return 0; |
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot() { |
+ if (m_pos < m_iteratorAnnotList.size()) |
+ return m_iteratorAnnotList[m_iteratorAnnotList.size() - ++m_pos]; |
+ return nullptr; |
} |
-FX_BOOL CPDFSDK_AnnotIterator::InitIteratorAnnotList( |
- CPDFSDK_PageView* pPageView, |
- CFX_PtrArray* pAnnotList) { |
- ASSERT(pPageView); |
- |
- if (pAnnotList == NULL) { |
- pAnnotList = pPageView->GetAnnotList(); |
- } |
- |
- m_pIteratorAnnotList.RemoveAll(); |
- if (!pAnnotList) |
- return FALSE; |
- |
- CPDFSDK_Annot* pTopMostAnnot = |
- (m_bIgnoreTopmost) ? NULL : pPageView->GetFocusAnnot(); |
- |
- int nCount = pAnnotList->GetSize(); |
- |
- for (int i = nCount - 1; i >= 0; i--) { |
- CPDFSDK_Annot* pReaderAnnot = (CPDFSDK_Annot*)pAnnotList->GetAt(i); |
- m_pIteratorAnnotList.Add(pReaderAnnot); |
- } |
- |
- InsertSort(m_pIteratorAnnotList, &LyOrderCompare); |
- |
- if (pTopMostAnnot) { |
- for (int i = 0; i < nCount; i++) { |
- CPDFSDK_Annot* pReaderAnnot = |
- (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(i); |
- if (pReaderAnnot == pTopMostAnnot) { |
- m_pIteratorAnnotList.RemoveAt(i); |
- m_pIteratorAnnotList.InsertAt(0, pReaderAnnot); |
- break; |
- } |
- } |
- } |
- |
- return TRUE; |
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::Next() { |
+ return m_bReverse ? PrevAnnot() : NextAnnot(); |
} |