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

Side by Side Diff: core/fpdftext/fpdf_text_int.cpp

Issue 1906903002: Replace CFX_RectArray with std::vector<CFX_FloatRect> (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Remove unused method Created 4 years, 8 months 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 | « no previous file | core/fpdftext/include/cpdf_linkextract.h » ('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 <algorithm> 7 #include <algorithm>
8 #include <cctype> 8 #include <cctype>
9 #include <cwctype> 9 #include <cwctype>
10 #include <memory> 10 #include <memory>
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 if (m_CharIndex[i + 1] + m_CharIndex[i] > CharIndex) { 253 if (m_CharIndex[i + 1] + m_CharIndex[i] > CharIndex) {
254 if (CharIndex - m_CharIndex[i] < 0) 254 if (CharIndex - m_CharIndex[i] < 0)
255 return -1; 255 return -1;
256 256
257 return CharIndex - m_CharIndex[i] + count - m_CharIndex[i + 1]; 257 return CharIndex - m_CharIndex[i] + count - m_CharIndex[i + 1];
258 } 258 }
259 } 259 }
260 return -1; 260 return -1;
261 } 261 }
262 262
263 void CPDF_TextPage::GetRectArray(int start, 263 std::vector<CFX_FloatRect> CPDF_TextPage::GetRectArray(int start,
264 int nCount, 264 int nCount) const {
265 CFX_RectArray* rectArray) const { 265 if (start < 0 || nCount == 0 || !m_bIsParsed)
266 if (start < 0 || nCount == 0) { 266 return std::vector<CFX_FloatRect>();
267 return; 267
268 }
269 if (!m_bIsParsed) {
270 return;
271 }
272 CPDF_TextObject* pCurObj = NULL;
273 CFX_FloatRect rect;
274 int curPos = start;
275 FX_BOOL flagNewRect = TRUE;
276 if (nCount + start > pdfium::CollectionSize<int>(m_CharList) || 268 if (nCount + start > pdfium::CollectionSize<int>(m_CharList) ||
277 nCount == -1) { 269 nCount == -1) {
278 nCount = pdfium::CollectionSize<int>(m_CharList) - start; 270 nCount = pdfium::CollectionSize<int>(m_CharList) - start;
279 } 271 }
272
273 std::vector<CFX_FloatRect> rectArray;
274 CPDF_TextObject* pCurObj = nullptr;
275 CFX_FloatRect rect;
276 int curPos = start;
277 FX_BOOL flagNewRect = TRUE;
280 while (nCount--) { 278 while (nCount--) {
281 PAGECHAR_INFO info_curchar = m_CharList[curPos++]; 279 PAGECHAR_INFO info_curchar = m_CharList[curPos++];
282 if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) { 280 if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {
283 continue; 281 continue;
284 } 282 }
285 if (info_curchar.m_CharBox.Width() < 0.01 || 283 if (info_curchar.m_CharBox.Width() < 0.01 ||
286 info_curchar.m_CharBox.Height() < 0.01) { 284 info_curchar.m_CharBox.Height() < 0.01) {
287 continue; 285 continue;
288 } 286 }
289 if (!pCurObj) { 287 if (!pCurObj) {
290 pCurObj = info_curchar.m_pTextObj; 288 pCurObj = info_curchar.m_pTextObj;
291 } 289 }
292 if (pCurObj != info_curchar.m_pTextObj) { 290 if (pCurObj != info_curchar.m_pTextObj) {
293 rectArray->Add(rect); 291 rectArray.push_back(rect);
294 pCurObj = info_curchar.m_pTextObj; 292 pCurObj = info_curchar.m_pTextObj;
295 flagNewRect = TRUE; 293 flagNewRect = TRUE;
296 } 294 }
297 if (flagNewRect) { 295 if (flagNewRect) {
298 FX_FLOAT orgX = info_curchar.m_OriginX, orgY = info_curchar.m_OriginY; 296 FX_FLOAT orgX = info_curchar.m_OriginX, orgY = info_curchar.m_OriginY;
299 CFX_Matrix matrix, matrix_reverse; 297 CFX_Matrix matrix, matrix_reverse;
300 info_curchar.m_pTextObj->GetTextMatrix(&matrix); 298 info_curchar.m_pTextObj->GetTextMatrix(&matrix);
301 matrix.Concat(info_curchar.m_Matrix); 299 matrix.Concat(info_curchar.m_Matrix);
302 matrix_reverse.SetReverse(matrix); 300 matrix_reverse.SetReverse(matrix);
303 matrix_reverse.Transform(orgX, orgY); 301 matrix_reverse.Transform(orgX, orgY);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 rect.right = info_curchar.m_CharBox.right; 334 rect.right = info_curchar.m_CharBox.right;
337 } 335 }
338 if (rect.top < info_curchar.m_CharBox.top) { 336 if (rect.top < info_curchar.m_CharBox.top) {
339 rect.top = info_curchar.m_CharBox.top; 337 rect.top = info_curchar.m_CharBox.top;
340 } 338 }
341 if (rect.bottom > info_curchar.m_CharBox.bottom) { 339 if (rect.bottom > info_curchar.m_CharBox.bottom) {
342 rect.bottom = info_curchar.m_CharBox.bottom; 340 rect.bottom = info_curchar.m_CharBox.bottom;
343 } 341 }
344 } 342 }
345 } 343 }
346 rectArray->Add(rect); 344 rectArray.push_back(rect);
345 return rectArray;
347 } 346 }
348 347
349 int CPDF_TextPage::GetIndexAtPos(CFX_FloatPoint point, 348 int CPDF_TextPage::GetIndexAtPos(CFX_FloatPoint point,
350 FX_FLOAT xTolerance, 349 FX_FLOAT xTolerance,
351 FX_FLOAT yTolerance) const { 350 FX_FLOAT yTolerance) const {
352 if (!m_bIsParsed) 351 if (!m_bIsParsed)
353 return -3; 352 return -3;
354 353
355 int pos = 0; 354 int pos = 0;
356 int NearPos = -1; 355 int NearPos = -1;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 IsAddLineFeed = false; 419 IsAddLineFeed = false;
421 } 420 }
422 } else { 421 } else {
423 IsContainPreChar = false; 422 IsContainPreChar = false;
424 IsAddLineFeed = true; 423 IsAddLineFeed = true;
425 } 424 }
426 } 425 }
427 return strText; 426 return strText;
428 } 427 }
429 428
430 void CPDF_TextPage::GetRectsArrayByRect(const CFX_FloatRect& rect, 429 std::vector<CFX_FloatRect> CPDF_TextPage::GetRectsArrayByRect(
431 CFX_RectArray& resRectArray) const { 430 const CFX_FloatRect& rect) const {
432 if (!m_bIsParsed) 431 if (!m_bIsParsed)
433 return; 432 return std::vector<CFX_FloatRect>();
434 433
435 CFX_FloatRect curRect; 434 CFX_FloatRect curRect;
435 std::vector<CFX_FloatRect> result;
436 bool flagNewRect = true; 436 bool flagNewRect = true;
437 CPDF_TextObject* pCurObj = nullptr; 437 CPDF_TextObject* pCurObj = nullptr;
438 for (auto info_curchar : m_CharList) { 438 for (auto info_curchar : m_CharList) {
439 if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) { 439 if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {
440 continue; 440 continue;
441 } 441 }
442 if (!IsRectIntersect(rect, info_curchar.m_CharBox)) { 442 if (!IsRectIntersect(rect, info_curchar.m_CharBox)) {
443 continue; 443 continue;
444 } 444 }
445 if (!pCurObj) { 445 if (!pCurObj) {
446 pCurObj = info_curchar.m_pTextObj; 446 pCurObj = info_curchar.m_pTextObj;
447 } 447 }
448 if (pCurObj != info_curchar.m_pTextObj) { 448 if (pCurObj != info_curchar.m_pTextObj) {
449 resRectArray.Add(curRect); 449 result.push_back(curRect);
450 pCurObj = info_curchar.m_pTextObj; 450 pCurObj = info_curchar.m_pTextObj;
451 flagNewRect = true; 451 flagNewRect = true;
452 } 452 }
453 if (flagNewRect) { 453 if (flagNewRect) {
454 curRect = info_curchar.m_CharBox; 454 curRect = info_curchar.m_CharBox;
455 curRect.Normalize(); 455 curRect.Normalize();
456 flagNewRect = false; 456 flagNewRect = false;
457 } else { 457 } else {
458 info_curchar.m_CharBox.Normalize(); 458 info_curchar.m_CharBox.Normalize();
459 curRect.left = std::min(curRect.left, info_curchar.m_CharBox.left); 459 curRect.left = std::min(curRect.left, info_curchar.m_CharBox.left);
460 curRect.bottom = std::min(curRect.bottom, info_curchar.m_CharBox.bottom); 460 curRect.bottom = std::min(curRect.bottom, info_curchar.m_CharBox.bottom);
461 curRect.right = std::max(curRect.right, info_curchar.m_CharBox.right); 461 curRect.right = std::max(curRect.right, info_curchar.m_CharBox.right);
462 curRect.top = std::max(curRect.top, info_curchar.m_CharBox.top); 462 curRect.top = std::max(curRect.top, info_curchar.m_CharBox.top);
463 } 463 }
464 } 464 }
465 resRectArray.Add(curRect); 465 result.push_back(curRect);
466 return result;
466 } 467 }
467 468
468 int CPDF_TextPage::GetIndexAtPos(FX_FLOAT x, 469 int CPDF_TextPage::GetIndexAtPos(FX_FLOAT x,
469 FX_FLOAT y, 470 FX_FLOAT y,
470 FX_FLOAT xTolerance, 471 FX_FLOAT xTolerance,
471 FX_FLOAT yTolerance) const { 472 FX_FLOAT yTolerance) const {
472 CFX_FloatPoint point(x, y); 473 CFX_FloatPoint point(x, y);
473 return GetIndexAtPos(point, xTolerance, yTolerance); 474 return GetIndexAtPos(point, xTolerance, yTolerance);
474 } 475 }
475 476
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 } 585 }
585 586
586 int CPDF_TextPage::CountRects(int start, int nCount) { 587 int CPDF_TextPage::CountRects(int start, int nCount) {
587 if (!m_bIsParsed || start < 0) 588 if (!m_bIsParsed || start < 0)
588 return -1; 589 return -1;
589 590
590 if (nCount == -1 || 591 if (nCount == -1 ||
591 nCount + start > pdfium::CollectionSize<int>(m_CharList)) { 592 nCount + start > pdfium::CollectionSize<int>(m_CharList)) {
592 nCount = pdfium::CollectionSize<int>(m_CharList) - start; 593 nCount = pdfium::CollectionSize<int>(m_CharList) - start;
593 } 594 }
594 m_SelRects.RemoveAll(); 595 m_SelRects = GetRectArray(start, nCount);
595 GetRectArray(start, nCount, &m_SelRects); 596 return pdfium::CollectionSize<int>(m_SelRects);
596 return m_SelRects.GetSize();
597 } 597 }
598 598
599 void CPDF_TextPage::GetRect(int rectIndex, 599 void CPDF_TextPage::GetRect(int rectIndex,
600 FX_FLOAT& left, 600 FX_FLOAT& left,
601 FX_FLOAT& top, 601 FX_FLOAT& top,
602 FX_FLOAT& right, 602 FX_FLOAT& right,
603 FX_FLOAT& bottom) const { 603 FX_FLOAT& bottom) const {
604 if (!m_bIsParsed) 604 if (!m_bIsParsed)
605 return; 605 return;
606 606
607 if (rectIndex < 0 || rectIndex >= m_SelRects.GetSize()) 607 if (rectIndex < 0 || rectIndex >= pdfium::CollectionSize<int>(m_SelRects))
608 return; 608 return;
609 609
610 left = m_SelRects.GetAt(rectIndex).left; 610 left = m_SelRects[rectIndex].left;
611 top = m_SelRects.GetAt(rectIndex).top; 611 top = m_SelRects[rectIndex].top;
612 right = m_SelRects.GetAt(rectIndex).right; 612 right = m_SelRects[rectIndex].right;
613 bottom = m_SelRects.GetAt(rectIndex).bottom; 613 bottom = m_SelRects[rectIndex].bottom;
614 } 614 }
615 615
616 FX_BOOL CPDF_TextPage::GetBaselineRotate(int start, int end, int& Rotate) { 616 FX_BOOL CPDF_TextPage::GetBaselineRotate(int start, int end, int& Rotate) {
617 if (end == start) { 617 if (end == start) {
618 return FALSE; 618 return FALSE;
619 } 619 }
620 FPDF_CHAR_INFO info_start; 620 FPDF_CHAR_INFO info_start;
621 FPDF_CHAR_INFO info_end; 621 FPDF_CHAR_INFO info_end;
622 GetCharInfo(start, &info_start); 622 GetCharInfo(start, &info_start);
623 GetCharInfo(end, &info_end); 623 GetCharInfo(end, &info_end);
(...skipping 1366 matching lines...) Expand 10 before | Expand all | Expand 10 after
1990 m_IsFind = TRUE; 1990 m_IsFind = TRUE;
1991 m_resStart = 0; 1991 m_resStart = 0;
1992 m_resEnd = -1; 1992 m_resEnd = -1;
1993 return TRUE; 1993 return TRUE;
1994 } 1994 }
1995 1995
1996 FX_BOOL CPDF_TextPageFind::FindNext() { 1996 FX_BOOL CPDF_TextPageFind::FindNext() {
1997 if (!m_pTextPage) { 1997 if (!m_pTextPage) {
1998 return FALSE; 1998 return FALSE;
1999 } 1999 }
2000 m_resArray.RemoveAll(); 2000 m_resArray.clear();
2001 if (m_findNextStart == -1) { 2001 if (m_findNextStart == -1) {
2002 return FALSE; 2002 return FALSE;
2003 } 2003 }
2004 if (m_strText.IsEmpty()) { 2004 if (m_strText.IsEmpty()) {
2005 m_IsFind = FALSE; 2005 m_IsFind = FALSE;
2006 return m_IsFind; 2006 return m_IsFind;
2007 } 2007 }
2008 int strLen = m_strText.GetLength(); 2008 int strLen = m_strText.GetLength();
2009 if (m_findNextStart > strLen - 1) { 2009 if (m_findNextStart > strLen - 1) {
2010 m_IsFind = FALSE; 2010 m_IsFind = FALSE;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2082 nStartPos = m_resStart + m_csFindWhatArray[1].GetLength(); 2082 nStartPos = m_resStart + m_csFindWhatArray[1].GetLength();
2083 } else { 2083 } else {
2084 nStartPos = m_resStart + m_csFindWhatArray[0].GetLength(); 2084 nStartPos = m_resStart + m_csFindWhatArray[0].GetLength();
2085 } 2085 }
2086 } 2086 }
2087 } 2087 }
2088 m_resEnd = nResultPos + m_csFindWhatArray.back().GetLength() - 1; 2088 m_resEnd = nResultPos + m_csFindWhatArray.back().GetLength() - 1;
2089 m_IsFind = TRUE; 2089 m_IsFind = TRUE;
2090 int resStart = GetCharIndex(m_resStart); 2090 int resStart = GetCharIndex(m_resStart);
2091 int resEnd = GetCharIndex(m_resEnd); 2091 int resEnd = GetCharIndex(m_resEnd);
2092 m_pTextPage->GetRectArray(resStart, resEnd - resStart + 1, &m_resArray); 2092 m_resArray = m_pTextPage->GetRectArray(resStart, resEnd - resStart + 1);
2093 if (m_flags & FPDFTEXT_CONSECUTIVE) { 2093 if (m_flags & FPDFTEXT_CONSECUTIVE) {
2094 m_findNextStart = m_resStart + 1; 2094 m_findNextStart = m_resStart + 1;
2095 m_findPreStart = m_resEnd - 1; 2095 m_findPreStart = m_resEnd - 1;
2096 } else { 2096 } else {
2097 m_findNextStart = m_resEnd + 1; 2097 m_findNextStart = m_resEnd + 1;
2098 m_findPreStart = m_resStart - 1; 2098 m_findPreStart = m_resStart - 1;
2099 } 2099 }
2100 return m_IsFind; 2100 return m_IsFind;
2101 } 2101 }
2102 2102
2103 FX_BOOL CPDF_TextPageFind::FindPrev() { 2103 FX_BOOL CPDF_TextPageFind::FindPrev() {
2104 if (!m_pTextPage) { 2104 if (!m_pTextPage) {
2105 return FALSE; 2105 return FALSE;
2106 } 2106 }
2107 m_resArray.RemoveAll(); 2107 m_resArray.clear();
2108 if (m_strText.IsEmpty() || m_findPreStart < 0) { 2108 if (m_strText.IsEmpty() || m_findPreStart < 0) {
2109 m_IsFind = FALSE; 2109 m_IsFind = FALSE;
2110 return m_IsFind; 2110 return m_IsFind;
2111 } 2111 }
2112 CPDF_TextPageFind findEngine(m_pTextPage); 2112 CPDF_TextPageFind findEngine(m_pTextPage);
2113 FX_BOOL ret = findEngine.FindFirst(m_findWhat, m_flags); 2113 FX_BOOL ret = findEngine.FindFirst(m_findWhat, m_flags);
2114 if (!ret) { 2114 if (!ret) {
2115 m_IsFind = FALSE; 2115 m_IsFind = FALSE;
2116 return m_IsFind; 2116 return m_IsFind;
2117 } 2117 }
(...skipping 10 matching lines...) Expand all
2128 MatchedCount = MatchedCount1; 2128 MatchedCount = MatchedCount1;
2129 } 2129 }
2130 } 2130 }
2131 if (order == -1) { 2131 if (order == -1) {
2132 m_IsFind = FALSE; 2132 m_IsFind = FALSE;
2133 return m_IsFind; 2133 return m_IsFind;
2134 } 2134 }
2135 m_resStart = m_pTextPage->TextIndexFromCharIndex(order); 2135 m_resStart = m_pTextPage->TextIndexFromCharIndex(order);
2136 m_resEnd = m_pTextPage->TextIndexFromCharIndex(order + MatchedCount - 1); 2136 m_resEnd = m_pTextPage->TextIndexFromCharIndex(order + MatchedCount - 1);
2137 m_IsFind = TRUE; 2137 m_IsFind = TRUE;
2138 m_pTextPage->GetRectArray(order, MatchedCount, &m_resArray); 2138 m_resArray = m_pTextPage->GetRectArray(order, MatchedCount);
2139 if (m_flags & FPDFTEXT_CONSECUTIVE) { 2139 if (m_flags & FPDFTEXT_CONSECUTIVE) {
2140 m_findNextStart = m_resStart + 1; 2140 m_findNextStart = m_resStart + 1;
2141 m_findPreStart = m_resEnd - 1; 2141 m_findPreStart = m_resEnd - 1;
2142 } else { 2142 } else {
2143 m_findNextStart = m_resEnd + 1; 2143 m_findNextStart = m_resEnd + 1;
2144 m_findPreStart = m_resStart - 1; 2144 m_findPreStart = m_resStart - 1;
2145 } 2145 }
2146 return m_IsFind; 2146 return m_IsFind;
2147 } 2147 }
2148 2148
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
2272 CFX_WideString CPDF_TextPageFind::MakeReverse(const CFX_WideString& str) { 2272 CFX_WideString CPDF_TextPageFind::MakeReverse(const CFX_WideString& str) {
2273 CFX_WideString str2; 2273 CFX_WideString str2;
2274 str2.clear(); 2274 str2.clear();
2275 int nlen = str.GetLength(); 2275 int nlen = str.GetLength();
2276 for (int i = nlen - 1; i >= 0; i--) { 2276 for (int i = nlen - 1; i >= 0; i--) {
2277 str2 += str.GetAt(i); 2277 str2 += str.GetAt(i);
2278 } 2278 }
2279 return str2; 2279 return str2;
2280 } 2280 }
2281 2281
2282 void CPDF_TextPageFind::GetRectArray(CFX_RectArray& rects) const {
2283 rects.Copy(m_resArray);
2284 }
2285
2286 int CPDF_TextPageFind::GetCurOrder() const { 2282 int CPDF_TextPageFind::GetCurOrder() const {
2287 return GetCharIndex(m_resStart); 2283 return GetCharIndex(m_resStart);
2288 } 2284 }
2289 2285
2290 int CPDF_TextPageFind::GetMatchedCount() const { 2286 int CPDF_TextPageFind::GetMatchedCount() const {
2291 int resStart = GetCharIndex(m_resStart); 2287 int resStart = GetCharIndex(m_resStart);
2292 int resEnd = GetCharIndex(m_resEnd); 2288 int resEnd = GetCharIndex(m_resEnd);
2293 return resEnd - resStart + 1; 2289 return resEnd - resStart + 1;
2294 } 2290 }
2295 2291
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
2439 if (str.Find(L"mailto:") == -1) 2435 if (str.Find(L"mailto:") == -1)
2440 str = L"mailto:" + str; 2436 str = L"mailto:" + str;
2441 2437
2442 return true; 2438 return true;
2443 } 2439 }
2444 2440
2445 CFX_WideString CPDF_LinkExtract::GetURL(size_t index) const { 2441 CFX_WideString CPDF_LinkExtract::GetURL(size_t index) const {
2446 return index < m_LinkArray.size() ? m_LinkArray[index].m_strUrl : L""; 2442 return index < m_LinkArray.size() ? m_LinkArray[index].m_strUrl : L"";
2447 } 2443 }
2448 2444
2449 void CPDF_LinkExtract::GetRects(size_t index, CFX_RectArray* pRects) const { 2445 std::vector<CFX_FloatRect> CPDF_LinkExtract::GetRects(size_t index) const {
2450 if (index < m_LinkArray.size()) { 2446 if (index >= m_LinkArray.size())
2451 m_pTextPage->GetRectArray(m_LinkArray[index].m_Start, 2447 return std::vector<CFX_FloatRect>();
2452 m_LinkArray[index].m_Count, pRects); 2448
2453 } 2449 return m_pTextPage->GetRectArray(m_LinkArray[index].m_Start,
2450 m_LinkArray[index].m_Count);
2454 } 2451 }
OLDNEW
« no previous file with comments | « no previous file | core/fpdftext/include/cpdf_linkextract.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698