| 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/include/cba_annotiterator.h" | 7 #include "fpdfsdk/include/cba_annotiterator.h" |
| 8 | 8 |
| 9 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h" | 9 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h" |
| 10 #include "fpdfsdk/include/cpdfsdk_annot.h" | 10 #include "fpdfsdk/include/cpdfsdk_annot.h" |
| 11 #include "fpdfsdk/include/fsdk_mgr.h" | 11 #include "fpdfsdk/include/fsdk_mgr.h" |
| 12 | 12 |
| 13 // static | 13 // static |
| 14 bool CBA_AnnotIterator::CompareByLeftAscending(const CPDFSDK_Annot* p1, | 14 bool CBA_AnnotIterator::CompareByLeftAscending(const CPDFSDK_Annot* p1, |
| 15 const CPDFSDK_Annot* p2) { | 15 const CPDFSDK_Annot* p2) { |
| 16 return GetAnnotRect(p1).left < GetAnnotRect(p2).left; | 16 return GetAnnotRect(p1).left < GetAnnotRect(p2).left; |
| 17 } | 17 } |
| 18 | 18 |
| 19 // static | 19 // static |
| 20 bool CBA_AnnotIterator::CompareByTopDescending(const CPDFSDK_Annot* p1, | 20 bool CBA_AnnotIterator::CompareByTopDescending(const CPDFSDK_Annot* p1, |
| 21 const CPDFSDK_Annot* p2) { | 21 const CPDFSDK_Annot* p2) { |
| 22 return GetAnnotRect(p1).top > GetAnnotRect(p2).top; | 22 return GetAnnotRect(p1).top > GetAnnotRect(p2).top; |
| 23 } | 23 } |
| 24 | 24 |
| 25 CBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, | 25 CBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, |
| 26 const CFX_ByteString& sType, | 26 const CFX_ByteString& sAnnotSubtype) |
| 27 const CFX_ByteString& sSubType) | |
| 28 : m_eTabOrder(STRUCTURE), | 27 : m_eTabOrder(STRUCTURE), |
| 29 m_pPageView(pPageView), | 28 m_pPageView(pPageView), |
| 30 m_sType(sType), | 29 m_sAnnotSubtype(sAnnotSubtype) { |
| 31 m_sSubType(sSubType) { | |
| 32 CPDF_Page* pPDFPage = m_pPageView->GetPDFPage(); | 30 CPDF_Page* pPDFPage = m_pPageView->GetPDFPage(); |
| 33 CFX_ByteString sTabs = pPDFPage->m_pFormDict->GetStringBy("Tabs"); | 31 CFX_ByteString sTabs = pPDFPage->m_pFormDict->GetStringBy("Tabs"); |
| 34 if (sTabs == "R") | 32 if (sTabs == "R") |
| 35 m_eTabOrder = ROW; | 33 m_eTabOrder = ROW; |
| 36 else if (sTabs == "C") | 34 else if (sTabs == "C") |
| 37 m_eTabOrder = COLUMN; | 35 m_eTabOrder = COLUMN; |
| 38 | 36 |
| 39 GenerateResults(); | 37 GenerateResults(); |
| 40 } | 38 } |
| 41 | 39 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 66 if (iter == m_Annots.begin()) | 64 if (iter == m_Annots.begin()) |
| 67 iter = m_Annots.end(); | 65 iter = m_Annots.end(); |
| 68 return *(--iter); | 66 return *(--iter); |
| 69 } | 67 } |
| 70 | 68 |
| 71 void CBA_AnnotIterator::GenerateResults() { | 69 void CBA_AnnotIterator::GenerateResults() { |
| 72 switch (m_eTabOrder) { | 70 switch (m_eTabOrder) { |
| 73 case STRUCTURE: { | 71 case STRUCTURE: { |
| 74 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { | 72 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { |
| 75 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | 73 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
| 76 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) | 74 if (pAnnot->GetAnnotSubtype() == m_sAnnotSubtype && |
| 75 !pAnnot->IsSignatureWidget()) |
| 77 m_Annots.push_back(pAnnot); | 76 m_Annots.push_back(pAnnot); |
| 78 } | 77 } |
| 79 break; | 78 break; |
| 80 } | 79 } |
| 81 case ROW: { | 80 case ROW: { |
| 82 std::vector<CPDFSDK_Annot*> sa; | 81 std::vector<CPDFSDK_Annot*> sa; |
| 83 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { | 82 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { |
| 84 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | 83 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
| 85 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) | 84 if (pAnnot->GetAnnotSubtype() == m_sAnnotSubtype && |
| 85 !pAnnot->IsSignatureWidget()) |
| 86 sa.push_back(pAnnot); | 86 sa.push_back(pAnnot); |
| 87 } | 87 } |
| 88 | 88 |
| 89 std::sort(sa.begin(), sa.end(), CompareByLeftAscending); | 89 std::sort(sa.begin(), sa.end(), CompareByLeftAscending); |
| 90 while (!sa.empty()) { | 90 while (!sa.empty()) { |
| 91 int nLeftTopIndex = -1; | 91 int nLeftTopIndex = -1; |
| 92 FX_FLOAT fTop = 0.0f; | 92 FX_FLOAT fTop = 0.0f; |
| 93 for (int i = sa.size() - 1; i >= 0; i--) { | 93 for (int i = sa.size() - 1; i >= 0; i--) { |
| 94 CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); | 94 CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); |
| 95 if (rcAnnot.top > fTop) { | 95 if (rcAnnot.top > fTop) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 116 for (int i = aSelect.size() - 1; i >= 0; --i) | 116 for (int i = aSelect.size() - 1; i >= 0; --i) |
| 117 sa.erase(sa.begin() + aSelect[i]); | 117 sa.erase(sa.begin() + aSelect[i]); |
| 118 } | 118 } |
| 119 } | 119 } |
| 120 break; | 120 break; |
| 121 } | 121 } |
| 122 case COLUMN: { | 122 case COLUMN: { |
| 123 std::vector<CPDFSDK_Annot*> sa; | 123 std::vector<CPDFSDK_Annot*> sa; |
| 124 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { | 124 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { |
| 125 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | 125 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
| 126 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) | 126 if (pAnnot->GetAnnotSubtype() == m_sAnnotSubtype && |
| 127 !pAnnot->IsSignatureWidget()) |
| 127 sa.push_back(pAnnot); | 128 sa.push_back(pAnnot); |
| 128 } | 129 } |
| 129 | 130 |
| 130 std::sort(sa.begin(), sa.end(), CompareByTopDescending); | 131 std::sort(sa.begin(), sa.end(), CompareByTopDescending); |
| 131 while (!sa.empty()) { | 132 while (!sa.empty()) { |
| 132 int nLeftTopIndex = -1; | 133 int nLeftTopIndex = -1; |
| 133 FX_FLOAT fLeft = -1.0f; | 134 FX_FLOAT fLeft = -1.0f; |
| 134 for (int i = sa.size() - 1; i >= 0; --i) { | 135 for (int i = sa.size() - 1; i >= 0; --i) { |
| 135 CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); | 136 CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); |
| 136 if (fLeft < 0) { | 137 if (fLeft < 0) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 163 } | 164 } |
| 164 } | 165 } |
| 165 break; | 166 break; |
| 166 } | 167 } |
| 167 } | 168 } |
| 168 } | 169 } |
| 169 | 170 |
| 170 CFX_FloatRect CBA_AnnotIterator::GetAnnotRect(const CPDFSDK_Annot* pAnnot) { | 171 CFX_FloatRect CBA_AnnotIterator::GetAnnotRect(const CPDFSDK_Annot* pAnnot) { |
| 171 return pAnnot->GetPDFAnnot()->GetRect(); | 172 return pAnnot->GetPDFAnnot()->GetRect(); |
| 172 } | 173 } |
| OLD | NEW |