| Index: fpdfsdk/cpdfsdk_annotiterator.cpp
 | 
| diff --git a/fpdfsdk/cpdfsdk_annotiterator.cpp b/fpdfsdk/cpdfsdk_annotiterator.cpp
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..01a4e15379aee71c9ed3cf28c2a5a043d5e5b232
 | 
| --- /dev/null
 | 
| +++ b/fpdfsdk/cpdfsdk_annotiterator.cpp
 | 
| @@ -0,0 +1,54 @@
 | 
| +// Copyright 2016 PDFium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 | 
| +
 | 
| +#include "fpdfsdk/include/cpdfsdk_annotiterator.h"
 | 
| +
 | 
| +#include <algorithm>
 | 
| +
 | 
| +#include "fpdfsdk/include/cpdfsdk_annot.h"
 | 
| +#include "fpdfsdk/include/fsdk_mgr.h"
 | 
| +
 | 
| +CPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView* pPageView,
 | 
| +                                             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* pTopMostAnnot = pPageView->GetFocusAnnot();
 | 
| +  if (!pTopMostAnnot)
 | 
| +    return;
 | 
| +
 | 
| +  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_AnnotIterator::~CPDFSDK_AnnotIterator() {}
 | 
| +
 | 
| +CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot() {
 | 
| +  if (m_pos < m_iteratorAnnotList.size())
 | 
| +    return m_iteratorAnnotList[m_pos++];
 | 
| +  return nullptr;
 | 
| +}
 | 
| +
 | 
| +CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot() {
 | 
| +  if (m_pos < m_iteratorAnnotList.size())
 | 
| +    return m_iteratorAnnotList[m_iteratorAnnotList.size() - ++m_pos];
 | 
| +  return nullptr;
 | 
| +}
 | 
| +
 | 
| +CPDFSDK_Annot* CPDFSDK_AnnotIterator::Next() {
 | 
| +  return m_bReverse ? PrevAnnot() : NextAnnot();
 | 
| +}
 | 
| 
 |