Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Side by Side Diff: fpdfsdk/src/fsdk_baseform.cpp

Issue 1413973011: Fix incorrect CPDFSDK_PageView::CountAnnots(). (try 2) (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: nits Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « fpdfsdk/include/fsdk_mgr.h ('k') | fpdfsdk/src/fsdk_mgr.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/fsdk_mgr.h" 9 #include "../include/fsdk_mgr.h"
10 #include "../include/fsdk_baseannot.h" 10 #include "../include/fsdk_baseannot.h"
(...skipping 2409 matching lines...) Expand 10 before | Expand all | Expand 10 after
2420 CPDF_Rect rcAnnot2 = GetAnnotRect(p2); 2420 CPDF_Rect rcAnnot2 = GetAnnotRect(p2);
2421 2421
2422 if (rcAnnot1.top < rcAnnot2.top) 2422 if (rcAnnot1.top < rcAnnot2.top)
2423 return -1; 2423 return -1;
2424 if (rcAnnot1.top > rcAnnot2.top) 2424 if (rcAnnot1.top > rcAnnot2.top)
2425 return 1; 2425 return 1;
2426 return 0; 2426 return 0;
2427 } 2427 }
2428 2428
2429 void CBA_AnnotIterator::GenerateResults() { 2429 void CBA_AnnotIterator::GenerateResults() {
2430 ASSERT(m_pPageView != NULL);
2431
2432 switch (m_nTabs) { 2430 switch (m_nTabs) {
2433 case BAI_STRUCTURE: { 2431 case BAI_STRUCTURE: {
2434 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { 2432 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) {
2435 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); 2433 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
2436 ASSERT(pAnnot != NULL);
2437
2438 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) 2434 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType)
2439 m_Annots.Add(pAnnot); 2435 m_Annots.Add(pAnnot);
2440 } 2436 }
2441 } break; 2437 break;
2438 }
2442 case BAI_ROW: { 2439 case BAI_ROW: {
2443 CPDFSDK_SortAnnots sa; 2440 CPDFSDK_SortAnnots sa;
2444 2441 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) {
2445 { 2442 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
2446 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { 2443 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType)
2447 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); 2444 sa.Add(pAnnot);
2448 ASSERT(pAnnot != NULL);
2449
2450 if (pAnnot->GetType() == m_sType &&
2451 pAnnot->GetSubType() == m_sSubType)
2452 sa.Add(pAnnot);
2453 }
2454 } 2445 }
2455 2446
2456 if (sa.GetSize() > 0) { 2447 if (sa.GetSize() > 0)
2457 sa.Sort(CBA_AnnotIterator::CompareByLeft); 2448 sa.Sort(CBA_AnnotIterator::CompareByLeft);
2458 }
2459 2449
2460 while (sa.GetSize() > 0) { 2450 while (sa.GetSize() > 0) {
2461 int nLeftTopIndex = -1; 2451 int nLeftTopIndex = -1;
2452 FX_FLOAT fTop = 0.0f;
2462 2453
2463 { 2454 for (int i = sa.GetSize() - 1; i >= 0; i--) {
2464 FX_FLOAT fTop = 0.0f; 2455 CPDFSDK_Annot* pAnnot = sa.GetAt(i);
2456 ASSERT(pAnnot);
2465 2457
2466 for (int i = sa.GetSize() - 1; i >= 0; i--) { 2458 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
2467 CPDFSDK_Annot* pAnnot = sa.GetAt(i);
2468 ASSERT(pAnnot != NULL);
2469 2459
2470 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); 2460 if (rcAnnot.top > fTop) {
2471 2461 nLeftTopIndex = i;
2472 if (rcAnnot.top > fTop) { 2462 fTop = rcAnnot.top;
2473 nLeftTopIndex = i;
2474 fTop = rcAnnot.top;
2475 }
2476 } 2463 }
2477 } 2464 }
2478 2465
2479 if (nLeftTopIndex >= 0) { 2466 if (nLeftTopIndex >= 0) {
2480 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); 2467 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex);
2481 ASSERT(pLeftTopAnnot != NULL); 2468 ASSERT(pLeftTopAnnot);
2482 2469
2483 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); 2470 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot);
2484 2471
2485 m_Annots.Add(pLeftTopAnnot); 2472 m_Annots.Add(pLeftTopAnnot);
2486 sa.RemoveAt(nLeftTopIndex); 2473 sa.RemoveAt(nLeftTopIndex);
2487 2474
2488 CFX_ArrayTemplate<int> aSelect; 2475 CFX_ArrayTemplate<int> aSelect;
2489 2476
2490 { 2477 for (int i = 0, sz = sa.GetSize(); i < sz; ++i) {
2491 for (int i = 0, sz = sa.GetSize(); i < sz; i++) { 2478 CPDFSDK_Annot* pAnnot = sa.GetAt(i);
2492 CPDFSDK_Annot* pAnnot = sa.GetAt(i); 2479 ASSERT(pAnnot);
2493 ASSERT(pAnnot != NULL);
2494 2480
2495 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); 2481 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
2496 2482 FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f;
2497 FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f; 2483 if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top)
2498 2484 aSelect.Add(i);
2499 if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top)
2500 aSelect.Add(i);
2501 }
2502 } 2485 }
2503 2486
2504 { 2487 for (int i = 0, sz = aSelect.GetSize(); i < sz; ++i)
2505 for (int i = 0, sz = aSelect.GetSize(); i < sz; i++) { 2488 m_Annots.Add(sa[aSelect[i]]);
2506 m_Annots.Add(sa[aSelect[i]]);
2507 }
2508 }
2509 2489
2510 { 2490 for (int i = aSelect.GetSize() - 1; i >= 0; --i)
2511 for (int i = aSelect.GetSize() - 1; i >= 0; i--) {
2512 sa.RemoveAt(aSelect[i]); 2491 sa.RemoveAt(aSelect[i]);
2513 }
2514 }
2515 2492
2516 aSelect.RemoveAll(); 2493 aSelect.RemoveAll();
2517 } 2494 }
2518 } 2495 }
2519 sa.RemoveAll(); 2496 sa.RemoveAll();
2520 } break; 2497 break;
2498 }
2521 case BAI_COLUMN: { 2499 case BAI_COLUMN: {
2522 CPDFSDK_SortAnnots sa; 2500 CPDFSDK_SortAnnots sa;
2523 2501 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) {
2524 { 2502 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
2525 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { 2503 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType)
2526 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); 2504 sa.Add(pAnnot);
2527 ASSERT(pAnnot != NULL);
2528
2529 if (pAnnot->GetType() == m_sType &&
2530 pAnnot->GetSubType() == m_sSubType)
2531 sa.Add(pAnnot);
2532 }
2533 } 2505 }
2534 2506
2535 if (sa.GetSize() > 0) { 2507 if (sa.GetSize() > 0)
2536 sa.Sort(CBA_AnnotIterator::CompareByTop, FALSE); 2508 sa.Sort(CBA_AnnotIterator::CompareByTop, FALSE);
2537 }
2538 2509
2539 while (sa.GetSize() > 0) { 2510 while (sa.GetSize() > 0) {
2540 int nLeftTopIndex = -1; 2511 int nLeftTopIndex = -1;
2512 FX_FLOAT fLeft = -1.0f;
2541 2513
2542 { 2514 for (int i = sa.GetSize() - 1; i >= 0; --i) {
2543 FX_FLOAT fLeft = -1.0f; 2515 CPDFSDK_Annot* pAnnot = sa.GetAt(i);
2516 ASSERT(pAnnot);
2544 2517
2545 for (int i = sa.GetSize() - 1; i >= 0; i--) { 2518 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
2546 CPDFSDK_Annot* pAnnot = sa.GetAt(i);
2547 ASSERT(pAnnot != NULL);
2548 2519
2549 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); 2520 if (fLeft < 0) {
2550 2521 nLeftTopIndex = 0;
2551 if (fLeft < 0) { 2522 fLeft = rcAnnot.left;
2552 nLeftTopIndex = 0; 2523 } else if (rcAnnot.left < fLeft) {
2553 fLeft = rcAnnot.left; 2524 nLeftTopIndex = i;
2554 } else if (rcAnnot.left < fLeft) { 2525 fLeft = rcAnnot.left;
2555 nLeftTopIndex = i;
2556 fLeft = rcAnnot.left;
2557 }
2558 } 2526 }
2559 } 2527 }
2560 2528
2561 if (nLeftTopIndex >= 0) { 2529 if (nLeftTopIndex >= 0) {
2562 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); 2530 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex);
2563 ASSERT(pLeftTopAnnot != NULL); 2531 ASSERT(pLeftTopAnnot);
2564 2532
2565 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); 2533 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot);
2566 2534
2567 m_Annots.Add(pLeftTopAnnot); 2535 m_Annots.Add(pLeftTopAnnot);
2568 sa.RemoveAt(nLeftTopIndex); 2536 sa.RemoveAt(nLeftTopIndex);
2569 2537
2570 CFX_ArrayTemplate<int> aSelect; 2538 CFX_ArrayTemplate<int> aSelect;
2539 for (int i = 0, sz = sa.GetSize(); i < sz; ++i) {
2540 CPDFSDK_Annot* pAnnot = sa.GetAt(i);
2541 ASSERT(pAnnot);
2571 2542
2572 { 2543 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
2573 for (int i = 0, sz = sa.GetSize(); i < sz; i++) { 2544 FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f;
2574 CPDFSDK_Annot* pAnnot = sa.GetAt(i); 2545 if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right)
2575 ASSERT(pAnnot != NULL); 2546 aSelect.Add(i);
2576
2577 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
2578
2579 FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f;
2580
2581 if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right)
2582 aSelect.Add(i);
2583 }
2584 } 2547 }
2585 2548
2586 { 2549 for (int i = 0, sz = aSelect.GetSize(); i < sz; ++i)
2587 for (int i = 0, sz = aSelect.GetSize(); i < sz; i++) { 2550 m_Annots.Add(sa[aSelect[i]]);
2588 m_Annots.Add(sa[aSelect[i]]);
2589 }
2590 }
2591 2551
2592 { 2552 for (int i = aSelect.GetSize() - 1; i >= 0; --i)
2593 for (int i = aSelect.GetSize() - 1; i >= 0; i--) { 2553 sa.RemoveAt(aSelect[i]);
2594 sa.RemoveAt(aSelect[i]);
2595 }
2596 }
2597 2554
2598 aSelect.RemoveAll(); 2555 aSelect.RemoveAll();
2599 } 2556 }
2600 } 2557 }
2601 sa.RemoveAll(); 2558 sa.RemoveAll();
2602 } break; 2559 break;
2560 }
2603 } 2561 }
2604 } 2562 }
2605 2563
2606 CPDF_Rect CBA_AnnotIterator::GetAnnotRect(CPDFSDK_Annot* pAnnot) { 2564 CPDF_Rect CBA_AnnotIterator::GetAnnotRect(CPDFSDK_Annot* pAnnot) {
2607 ASSERT(pAnnot != NULL);
2608
2609 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
2610 ASSERT(pPDFAnnot != NULL);
2611
2612 CPDF_Rect rcAnnot; 2565 CPDF_Rect rcAnnot;
2613 pPDFAnnot->GetRect(rcAnnot); 2566 pAnnot->GetPDFAnnot()->GetRect(rcAnnot);
2614
2615 return rcAnnot; 2567 return rcAnnot;
2616 } 2568 }
OLDNEW
« no previous file with comments | « fpdfsdk/include/fsdk_mgr.h ('k') | fpdfsdk/src/fsdk_mgr.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698