Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "fpdfsdk/cba_annotiterator.h" | 7 #include "fpdfsdk/cba_annotiterator.h" |
| 8 | 8 |
| 9 #include "core/fpdfapi/page/cpdf_page.h" | 9 #include "core/fpdfapi/page/cpdf_page.h" |
| 10 #include "fpdfsdk/cpdfsdk_annot.h" | 10 #include "fpdfsdk/cpdfsdk_annot.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 59 | 59 |
| 60 CPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot) { | 60 CPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot) { |
| 61 auto iter = std::find(m_Annots.begin(), m_Annots.end(), pAnnot); | 61 auto iter = std::find(m_Annots.begin(), m_Annots.end(), pAnnot); |
| 62 if (iter == m_Annots.end()) | 62 if (iter == m_Annots.end()) |
| 63 return nullptr; | 63 return nullptr; |
| 64 if (iter == m_Annots.begin()) | 64 if (iter == m_Annots.begin()) |
| 65 iter = m_Annots.end(); | 65 iter = m_Annots.end(); |
| 66 return *(--iter); | 66 return *(--iter); |
| 67 } | 67 } |
| 68 | 68 |
| 69 void CBA_AnnotIterator::CollectAnnots(std::vector<CPDFSDK_Annot*>* pArray) { | |
| 70 for (auto pAnnot : m_pPageView->GetAnnotList()) { | |
| 71 if (pAnnot->GetAnnotSubtype() == m_nAnnotSubtype && | |
| 72 !pAnnot->IsSignatureWidget()) { | |
| 73 pArray->push_back(pAnnot); | |
| 74 } | |
| 75 } | |
| 76 } | |
| 77 | |
| 78 CFX_FloatRect CBA_AnnotIterator::AddToAnnotsList( | |
| 79 std::vector<CPDFSDK_Annot*>& sa, | |
| 80 size_t idx) { | |
| 81 CPDFSDK_Annot* pLeftTopAnnot = sa[idx]; | |
| 82 CFX_FloatRect rcLeftTop = GetAnnotRect(pLeftTopAnnot); | |
| 83 m_Annots.push_back(pLeftTopAnnot); | |
| 84 sa.erase(sa.begin() + idx); | |
| 85 return rcLeftTop; | |
| 86 } | |
| 87 | |
| 88 void CBA_AnnotIterator::AddSelectedToAnnots(std::vector<CPDFSDK_Annot*>& sa, | |
| 89 std::vector<size_t>& aSelect) { | |
| 90 for (size_t i = 0; i < aSelect.size(); ++i) | |
| 91 m_Annots.push_back(sa[aSelect[i]]); | |
| 92 | |
| 93 for (int i = aSelect.size() - 1; i >= 0; --i) | |
| 94 sa.erase(sa.begin() + aSelect[i]); | |
| 95 } | |
| 96 | |
| 69 void CBA_AnnotIterator::GenerateResults() { | 97 void CBA_AnnotIterator::GenerateResults() { |
| 70 switch (m_eTabOrder) { | 98 switch (m_eTabOrder) { |
| 71 case STRUCTURE: { | 99 case STRUCTURE: |
| 72 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { | 100 CollectAnnots(&m_Annots); |
| 73 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | |
| 74 if (pAnnot->GetAnnotSubtype() == m_nAnnotSubtype && | |
| 75 !pAnnot->IsSignatureWidget()) | |
| 76 m_Annots.push_back(pAnnot); | |
| 77 } | |
| 78 break; | 101 break; |
| 79 } | 102 |
| 80 case ROW: { | 103 case ROW: { |
| 81 std::vector<CPDFSDK_Annot*> sa; | 104 std::vector<CPDFSDK_Annot*> sa; |
| 82 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { | 105 CollectAnnots(&sa); |
| 83 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | |
| 84 if (pAnnot->GetAnnotSubtype() == m_nAnnotSubtype && | |
| 85 !pAnnot->IsSignatureWidget()) | |
| 86 sa.push_back(pAnnot); | |
| 87 } | |
| 88 | 106 |
| 89 std::sort(sa.begin(), sa.end(), CompareByLeftAscending); | 107 std::sort(sa.begin(), sa.end(), CompareByLeftAscending); |
|
Tom Sepez
2016/10/05 17:59:52
super-super-super-nit: I'd put the blank line aft
dsinclair
2016/10/05 18:26:56
Done.
| |
| 90 while (!sa.empty()) { | 108 while (!sa.empty()) { |
| 91 int nLeftTopIndex = -1; | 109 int nLeftTopIndex = -1; |
| 92 FX_FLOAT fTop = 0.0f; | 110 FX_FLOAT fTop = 0.0f; |
| 93 for (int i = sa.size() - 1; i >= 0; i--) { | 111 for (int i = sa.size() - 1; i >= 0; i--) { |
| 94 CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); | 112 CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); |
| 95 if (rcAnnot.top > fTop) { | 113 if (rcAnnot.top > fTop) { |
| 96 nLeftTopIndex = i; | 114 nLeftTopIndex = i; |
| 97 fTop = rcAnnot.top; | 115 fTop = rcAnnot.top; |
| 98 } | 116 } |
| 99 } | 117 } |
| 100 if (nLeftTopIndex >= 0) { | 118 if (nLeftTopIndex < 0) |
| 101 CPDFSDK_Annot* pLeftTopAnnot = sa[nLeftTopIndex]; | 119 continue; |
| 102 CFX_FloatRect rcLeftTop = GetAnnotRect(pLeftTopAnnot); | |
| 103 m_Annots.push_back(pLeftTopAnnot); | |
| 104 sa.erase(sa.begin() + nLeftTopIndex); | |
| 105 | 120 |
| 106 std::vector<int> aSelect; | 121 CFX_FloatRect rcLeftTop = AddToAnnotsList(sa, nLeftTopIndex); |
| 107 for (size_t i = 0; i < sa.size(); ++i) { | |
| 108 CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); | |
| 109 FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f; | |
| 110 if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top) | |
| 111 aSelect.push_back(i); | |
| 112 } | |
| 113 for (size_t i = 0; i < aSelect.size(); ++i) | |
| 114 m_Annots.push_back(sa[aSelect[i]]); | |
| 115 | 122 |
| 116 for (int i = aSelect.size() - 1; i >= 0; --i) | 123 std::vector<size_t> aSelect; |
| 117 sa.erase(sa.begin() + aSelect[i]); | 124 for (size_t i = 0; i < sa.size(); ++i) { |
| 125 CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); | |
| 126 FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f; | |
| 127 if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top) | |
| 128 aSelect.push_back(i); | |
| 118 } | 129 } |
| 130 AddSelectedToAnnots(sa, aSelect); | |
| 119 } | 131 } |
| 120 break; | 132 break; |
| 121 } | 133 } |
| 134 | |
| 122 case COLUMN: { | 135 case COLUMN: { |
| 123 std::vector<CPDFSDK_Annot*> sa; | 136 std::vector<CPDFSDK_Annot*> sa; |
| 124 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { | 137 CollectAnnots(&sa); |
| 125 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | |
| 126 if (pAnnot->GetAnnotSubtype() == m_nAnnotSubtype && | |
| 127 !pAnnot->IsSignatureWidget()) | |
| 128 sa.push_back(pAnnot); | |
| 129 } | |
| 130 | 138 |
| 131 std::sort(sa.begin(), sa.end(), CompareByTopDescending); | 139 std::sort(sa.begin(), sa.end(), CompareByTopDescending); |
| 132 while (!sa.empty()) { | 140 while (!sa.empty()) { |
| 133 int nLeftTopIndex = -1; | 141 int nLeftTopIndex = -1; |
| 134 FX_FLOAT fLeft = -1.0f; | 142 FX_FLOAT fLeft = -1.0f; |
| 135 for (int i = sa.size() - 1; i >= 0; --i) { | 143 for (int i = sa.size() - 1; i >= 0; --i) { |
| 136 CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); | 144 CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); |
| 137 if (fLeft < 0) { | 145 if (fLeft < 0) { |
| 138 nLeftTopIndex = 0; | 146 nLeftTopIndex = 0; |
| 139 fLeft = rcAnnot.left; | 147 fLeft = rcAnnot.left; |
| 140 } else if (rcAnnot.left < fLeft) { | 148 } else if (rcAnnot.left < fLeft) { |
| 141 nLeftTopIndex = i; | 149 nLeftTopIndex = i; |
| 142 fLeft = rcAnnot.left; | 150 fLeft = rcAnnot.left; |
| 143 } | 151 } |
| 144 } | 152 } |
| 153 if (nLeftTopIndex < 0) | |
| 154 continue; | |
| 145 | 155 |
| 146 if (nLeftTopIndex >= 0) { | 156 CFX_FloatRect rcLeftTop = AddToAnnotsList(sa, nLeftTopIndex); |
| 147 CPDFSDK_Annot* pLeftTopAnnot = sa[nLeftTopIndex]; | |
| 148 CFX_FloatRect rcLeftTop = GetAnnotRect(pLeftTopAnnot); | |
| 149 m_Annots.push_back(pLeftTopAnnot); | |
| 150 sa.erase(sa.begin() + nLeftTopIndex); | |
| 151 | 157 |
| 152 std::vector<int> aSelect; | 158 std::vector<size_t> aSelect; |
| 153 for (size_t i = 0; i < sa.size(); ++i) { | 159 for (size_t i = 0; i < sa.size(); ++i) { |
| 154 CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); | 160 CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); |
| 155 FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f; | 161 FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f; |
| 156 if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right) | 162 if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right) |
| 157 aSelect.push_back(i); | 163 aSelect.push_back(i); |
| 158 } | |
| 159 for (size_t i = 0; i < aSelect.size(); ++i) | |
| 160 m_Annots.push_back(sa[aSelect[i]]); | |
| 161 | |
| 162 for (int i = aSelect.size() - 1; i >= 0; --i) | |
| 163 sa.erase(sa.begin() + aSelect[i]); | |
| 164 } | 164 } |
| 165 AddSelectedToAnnots(sa, aSelect); | |
| 165 } | 166 } |
| 166 break; | 167 break; |
| 167 } | 168 } |
| 168 } | 169 } |
| 169 } | 170 } |
| 170 | 171 |
| 171 CFX_FloatRect CBA_AnnotIterator::GetAnnotRect(const CPDFSDK_Annot* pAnnot) { | 172 CFX_FloatRect CBA_AnnotIterator::GetAnnotRect(const CPDFSDK_Annot* pAnnot) { |
| 172 return pAnnot->GetPDFAnnot()->GetRect(); | 173 return pAnnot->GetPDFAnnot()->GetRect(); |
| 173 } | 174 } |
| OLD | NEW |