OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 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 "../../third_party/base/nonstd_unique_ptr.h" | 7 #include "../../third_party/base/nonstd_unique_ptr.h" |
8 #include "../include/fsdk_define.h" | 8 #include "../include/fsdk_define.h" |
9 #include "../include/fpdfxfa/fpdfxfa_doc.h" | 9 #include "../include/fpdfxfa/fpdfxfa_doc.h" |
10 #include "../include/fpdfxfa/fpdfxfa_util.h" | 10 #include "../include/fpdfxfa/fpdfxfa_util.h" |
(...skipping 3098 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3109 CPDF_Rect rcAnnot2 = GetAnnotRect(p2); | 3109 CPDF_Rect rcAnnot2 = GetAnnotRect(p2); |
3110 | 3110 |
3111 if (rcAnnot1.top < rcAnnot2.top) | 3111 if (rcAnnot1.top < rcAnnot2.top) |
3112 return -1; | 3112 return -1; |
3113 if (rcAnnot1.top > rcAnnot2.top) | 3113 if (rcAnnot1.top > rcAnnot2.top) |
3114 return 1; | 3114 return 1; |
3115 return 0; | 3115 return 0; |
3116 } | 3116 } |
3117 | 3117 |
3118 void CBA_AnnotIterator::GenerateResults() { | 3118 void CBA_AnnotIterator::GenerateResults() { |
3119 ASSERT(m_pPageView != NULL); | |
3120 | |
3121 switch (m_nTabs) { | 3119 switch (m_nTabs) { |
3122 case BAI_STRUCTURE: { | 3120 case BAI_STRUCTURE: { |
3123 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { | 3121 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { |
3124 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | 3122 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
3125 ASSERT(pAnnot != NULL); | |
3126 | |
3127 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) | 3123 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) |
3128 m_Annots.Add(pAnnot); | 3124 m_Annots.Add(pAnnot); |
3129 } | 3125 } |
3130 } break; | 3126 break; |
| 3127 } |
3131 case BAI_ROW: { | 3128 case BAI_ROW: { |
3132 CPDFSDK_SortAnnots sa; | 3129 CPDFSDK_SortAnnots sa; |
3133 | 3130 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { |
3134 { | 3131 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
3135 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { | 3132 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) |
3136 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | 3133 sa.Add(pAnnot); |
3137 ASSERT(pAnnot != NULL); | |
3138 | |
3139 if (pAnnot->GetType() == m_sType && | |
3140 pAnnot->GetSubType() == m_sSubType) | |
3141 sa.Add(pAnnot); | |
3142 } | |
3143 } | 3134 } |
3144 | 3135 |
3145 if (sa.GetSize() > 0) { | 3136 if (sa.GetSize() > 0) |
3146 sa.Sort(CBA_AnnotIterator::CompareByLeft); | 3137 sa.Sort(CBA_AnnotIterator::CompareByLeft); |
3147 } | |
3148 | 3138 |
3149 while (sa.GetSize() > 0) { | 3139 while (sa.GetSize() > 0) { |
3150 int nLeftTopIndex = -1; | 3140 int nLeftTopIndex = -1; |
| 3141 FX_FLOAT fTop = 0.0f; |
3151 | 3142 |
3152 { | 3143 for (int i = sa.GetSize() - 1; i >= 0; i--) { |
3153 FX_FLOAT fTop = 0.0f; | 3144 CPDFSDK_Annot* pAnnot = sa.GetAt(i); |
| 3145 ASSERT(pAnnot); |
3154 | 3146 |
3155 for (int i = sa.GetSize() - 1; i >= 0; i--) { | 3147 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); |
3156 CPDFSDK_Annot* pAnnot = sa.GetAt(i); | |
3157 ASSERT(pAnnot != NULL); | |
3158 | 3148 |
3159 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); | 3149 if (rcAnnot.top > fTop) { |
3160 | 3150 nLeftTopIndex = i; |
3161 if (rcAnnot.top > fTop) { | 3151 fTop = rcAnnot.top; |
3162 nLeftTopIndex = i; | |
3163 fTop = rcAnnot.top; | |
3164 } | |
3165 } | 3152 } |
3166 } | 3153 } |
3167 | 3154 |
3168 if (nLeftTopIndex >= 0) { | 3155 if (nLeftTopIndex >= 0) { |
3169 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); | 3156 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); |
3170 ASSERT(pLeftTopAnnot != NULL); | 3157 ASSERT(pLeftTopAnnot); |
3171 | 3158 |
3172 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); | 3159 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); |
3173 | 3160 |
3174 m_Annots.Add(pLeftTopAnnot); | 3161 m_Annots.Add(pLeftTopAnnot); |
3175 sa.RemoveAt(nLeftTopIndex); | 3162 sa.RemoveAt(nLeftTopIndex); |
3176 | 3163 |
3177 CFX_ArrayTemplate<int> aSelect; | 3164 CFX_ArrayTemplate<int> aSelect; |
3178 | 3165 |
3179 { | 3166 for (int i = 0, sz = sa.GetSize(); i < sz; ++i) { |
3180 for (int i = 0, sz = sa.GetSize(); i < sz; i++) { | 3167 CPDFSDK_Annot* pAnnot = sa.GetAt(i); |
3181 CPDFSDK_Annot* pAnnot = sa.GetAt(i); | 3168 ASSERT(pAnnot); |
3182 ASSERT(pAnnot != NULL); | |
3183 | 3169 |
3184 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); | 3170 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); |
3185 | 3171 FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f; |
3186 FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f; | 3172 if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top) |
3187 | 3173 aSelect.Add(i); |
3188 if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top) | |
3189 aSelect.Add(i); | |
3190 } | |
3191 } | 3174 } |
3192 | 3175 |
3193 { | 3176 for (int i = 0, sz = aSelect.GetSize(); i < sz; ++i) |
3194 for (int i = 0, sz = aSelect.GetSize(); i < sz; i++) { | 3177 m_Annots.Add(sa[aSelect[i]]); |
3195 m_Annots.Add(sa[aSelect[i]]); | |
3196 } | |
3197 } | |
3198 | 3178 |
3199 { | 3179 for (int i = aSelect.GetSize() - 1; i >= 0; --i) |
3200 for (int i = aSelect.GetSize() - 1; i >= 0; i--) { | |
3201 sa.RemoveAt(aSelect[i]); | 3180 sa.RemoveAt(aSelect[i]); |
3202 } | |
3203 } | |
3204 | 3181 |
3205 aSelect.RemoveAll(); | 3182 aSelect.RemoveAll(); |
3206 } | 3183 } |
3207 } | 3184 } |
3208 sa.RemoveAll(); | 3185 sa.RemoveAll(); |
3209 } break; | 3186 break; |
| 3187 } |
3210 case BAI_COLUMN: { | 3188 case BAI_COLUMN: { |
3211 CPDFSDK_SortAnnots sa; | 3189 CPDFSDK_SortAnnots sa; |
3212 | 3190 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { |
3213 { | 3191 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
3214 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { | 3192 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) |
3215 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | 3193 sa.Add(pAnnot); |
3216 ASSERT(pAnnot != NULL); | |
3217 | |
3218 if (pAnnot->GetType() == m_sType && | |
3219 pAnnot->GetSubType() == m_sSubType) | |
3220 sa.Add(pAnnot); | |
3221 } | |
3222 } | 3194 } |
3223 | 3195 |
3224 if (sa.GetSize() > 0) { | 3196 if (sa.GetSize() > 0) |
3225 sa.Sort(CBA_AnnotIterator::CompareByTop, FALSE); | 3197 sa.Sort(CBA_AnnotIterator::CompareByTop, FALSE); |
3226 } | |
3227 | 3198 |
3228 while (sa.GetSize() > 0) { | 3199 while (sa.GetSize() > 0) { |
3229 int nLeftTopIndex = -1; | 3200 int nLeftTopIndex = -1; |
| 3201 FX_FLOAT fLeft = -1.0f; |
3230 | 3202 |
3231 { | 3203 for (int i = sa.GetSize() - 1; i >= 0; --i) { |
3232 FX_FLOAT fLeft = -1.0f; | 3204 CPDFSDK_Annot* pAnnot = sa.GetAt(i); |
| 3205 ASSERT(pAnnot); |
3233 | 3206 |
3234 for (int i = sa.GetSize() - 1; i >= 0; i--) { | 3207 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); |
3235 CPDFSDK_Annot* pAnnot = sa.GetAt(i); | |
3236 ASSERT(pAnnot != NULL); | |
3237 | 3208 |
3238 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); | 3209 if (fLeft < 0) { |
3239 | 3210 nLeftTopIndex = 0; |
3240 if (fLeft < 0) { | 3211 fLeft = rcAnnot.left; |
3241 nLeftTopIndex = 0; | 3212 } else if (rcAnnot.left < fLeft) { |
3242 fLeft = rcAnnot.left; | 3213 nLeftTopIndex = i; |
3243 } else if (rcAnnot.left < fLeft) { | 3214 fLeft = rcAnnot.left; |
3244 nLeftTopIndex = i; | |
3245 fLeft = rcAnnot.left; | |
3246 } | |
3247 } | 3215 } |
3248 } | 3216 } |
3249 | 3217 |
3250 if (nLeftTopIndex >= 0) { | 3218 if (nLeftTopIndex >= 0) { |
3251 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); | 3219 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); |
3252 ASSERT(pLeftTopAnnot != NULL); | 3220 ASSERT(pLeftTopAnnot); |
3253 | 3221 |
3254 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); | 3222 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); |
3255 | 3223 |
3256 m_Annots.Add(pLeftTopAnnot); | 3224 m_Annots.Add(pLeftTopAnnot); |
3257 sa.RemoveAt(nLeftTopIndex); | 3225 sa.RemoveAt(nLeftTopIndex); |
3258 | 3226 |
3259 CFX_ArrayTemplate<int> aSelect; | 3227 CFX_ArrayTemplate<int> aSelect; |
| 3228 for (int i = 0, sz = sa.GetSize(); i < sz; ++i) { |
| 3229 CPDFSDK_Annot* pAnnot = sa.GetAt(i); |
| 3230 ASSERT(pAnnot); |
3260 | 3231 |
3261 { | 3232 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); |
3262 for (int i = 0, sz = sa.GetSize(); i < sz; i++) { | 3233 FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f; |
3263 CPDFSDK_Annot* pAnnot = sa.GetAt(i); | 3234 if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right) |
3264 ASSERT(pAnnot != NULL); | 3235 aSelect.Add(i); |
3265 | |
3266 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); | |
3267 | |
3268 FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f; | |
3269 | |
3270 if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right) | |
3271 aSelect.Add(i); | |
3272 } | |
3273 } | 3236 } |
3274 | 3237 |
3275 { | 3238 for (int i = 0, sz = aSelect.GetSize(); i < sz; ++i) |
3276 for (int i = 0, sz = aSelect.GetSize(); i < sz; i++) { | 3239 m_Annots.Add(sa[aSelect[i]]); |
3277 m_Annots.Add(sa[aSelect[i]]); | |
3278 } | |
3279 } | |
3280 | 3240 |
3281 { | 3241 for (int i = aSelect.GetSize() - 1; i >= 0; --i) |
3282 for (int i = aSelect.GetSize() - 1; i >= 0; i--) { | 3242 sa.RemoveAt(aSelect[i]); |
3283 sa.RemoveAt(aSelect[i]); | |
3284 } | |
3285 } | |
3286 | 3243 |
3287 aSelect.RemoveAll(); | 3244 aSelect.RemoveAll(); |
3288 } | 3245 } |
3289 } | 3246 } |
3290 sa.RemoveAll(); | 3247 sa.RemoveAll(); |
3291 } break; | 3248 break; |
| 3249 } |
3292 } | 3250 } |
3293 } | 3251 } |
3294 | 3252 |
3295 CPDF_Rect CBA_AnnotIterator::GetAnnotRect(CPDFSDK_Annot* pAnnot) { | 3253 CPDF_Rect CBA_AnnotIterator::GetAnnotRect(CPDFSDK_Annot* pAnnot) { |
3296 ASSERT(pAnnot != NULL); | |
3297 | |
3298 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); | |
3299 ASSERT(pPDFAnnot != NULL); | |
3300 | |
3301 CPDF_Rect rcAnnot; | 3254 CPDF_Rect rcAnnot; |
3302 pPDFAnnot->GetRect(rcAnnot); | 3255 pAnnot->GetPDFAnnot()->GetRect(rcAnnot); |
3303 | |
3304 return rcAnnot; | 3256 return rcAnnot; |
3305 } | 3257 } |
OLD | NEW |