| 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 "core/src/fpdftext/text_int.h" |
| 8 |
| 7 #include <algorithm> | 9 #include <algorithm> |
| 8 #include <cctype> | 10 #include <cctype> |
| 9 #include <cwctype> | 11 #include <cwctype> |
| 10 #include <memory> | 12 #include <memory> |
| 11 | 13 |
| 12 #include "core/include/fpdfapi/fpdf_module.h" | 14 #include "core/include/fpdfapi/fpdf_module.h" |
| 13 #include "core/include/fpdfapi/fpdf_page.h" | 15 #include "core/include/fpdfapi/fpdf_page.h" |
| 14 #include "core/include/fpdfapi/fpdf_pageobj.h" | 16 #include "core/include/fpdfapi/fpdf_pageobj.h" |
| 15 #include "core/include/fpdfapi/fpdf_resource.h" | 17 #include "core/include/fpdfapi/fpdf_resource.h" |
| 16 #include "core/include/fpdftext/fpdf_text.h" | 18 #include "core/include/fpdftext/fpdf_text.h" |
| 17 #include "core/include/fxcrt/fx_bidi.h" | 19 #include "core/include/fxcrt/fx_bidi.h" |
| 18 #include "core/include/fxcrt/fx_ext.h" | 20 #include "core/include/fxcrt/fx_ext.h" |
| 19 #include "core/include/fxcrt/fx_ucd.h" | 21 #include "core/include/fxcrt/fx_ucd.h" |
| 20 #include "text_int.h" | 22 #include "third_party/base/stl_util.h" |
| 21 | 23 |
| 22 namespace { | 24 namespace { |
| 23 | 25 |
| 24 FX_BOOL _IsIgnoreSpaceCharacter(FX_WCHAR curChar) { | 26 FX_BOOL _IsIgnoreSpaceCharacter(FX_WCHAR curChar) { |
| 25 if (curChar < 255) { | 27 if (curChar < 255) { |
| 26 return FALSE; | 28 return FALSE; |
| 27 } | 29 } |
| 28 if ((curChar >= 0x0600 && curChar <= 0x06FF) || | 30 if ((curChar >= 0x0600 && curChar <= 0x06FF) || |
| 29 (curChar >= 0xFE70 && curChar <= 0xFEFF) || | 31 (curChar >= 0xFE70 && curChar <= 0xFEFF) || |
| 30 (curChar >= 0xFB50 && curChar <= 0xFDFF) || | 32 (curChar >= 0xFB50 && curChar <= 0xFDFF) || |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 #define TEXT_LINEFEED_CHAR L'\n' | 101 #define TEXT_LINEFEED_CHAR L'\n' |
| 100 #define TEXT_RETURN_CHAR L'\r' | 102 #define TEXT_RETURN_CHAR L'\r' |
| 101 #define TEXT_EMPTY L"" | 103 #define TEXT_EMPTY L"" |
| 102 #define TEXT_BLANK L" " | 104 #define TEXT_BLANK L" " |
| 103 #define TEXT_RETURN_LINEFEED L"\r\n" | 105 #define TEXT_RETURN_LINEFEED L"\r\n" |
| 104 #define TEXT_LINEFEED L"\n" | 106 #define TEXT_LINEFEED L"\n" |
| 105 #define TEXT_CHARRATIO_GAPDELTA 0.070 | 107 #define TEXT_CHARRATIO_GAPDELTA 0.070 |
| 106 | 108 |
| 107 CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, int flags) | 109 CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, int flags) |
| 108 : m_pPage(pPage), | 110 : m_pPage(pPage), |
| 109 m_charList(512), | |
| 110 m_TempCharList(50), | |
| 111 m_parserflag(flags), | 111 m_parserflag(flags), |
| 112 m_pPreTextObj(nullptr), | 112 m_pPreTextObj(nullptr), |
| 113 m_bIsParsed(false), | 113 m_bIsParsed(false), |
| 114 m_TextlineDir(-1), | 114 m_TextlineDir(-1), |
| 115 m_CurlineRect(0, 0, 0, 0) { | 115 m_CurlineRect(0, 0, 0, 0) { |
| 116 m_TextBuf.EstimateSize(0, 10240); | 116 m_TextBuf.EstimateSize(0, 10240); |
| 117 pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int)pPage->GetPageWidth(), | 117 pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int)pPage->GetPageWidth(), |
| 118 (int)pPage->GetPageHeight(), 0); | 118 (int)pPage->GetPageHeight(), 0); |
| 119 } | 119 } |
| 120 | 120 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 132 default: | 132 default: |
| 133 return false; | 133 return false; |
| 134 } | 134 } |
| 135 } | 135 } |
| 136 FX_BOOL CPDF_TextPage::ParseTextPage() { | 136 FX_BOOL CPDF_TextPage::ParseTextPage() { |
| 137 m_bIsParsed = false; | 137 m_bIsParsed = false; |
| 138 if (!m_pPage) | 138 if (!m_pPage) |
| 139 return FALSE; | 139 return FALSE; |
| 140 | 140 |
| 141 m_TextBuf.Clear(); | 141 m_TextBuf.Clear(); |
| 142 m_charList.RemoveAll(); | 142 m_CharList.clear(); |
| 143 m_pPreTextObj = NULL; | 143 m_pPreTextObj = NULL; |
| 144 ProcessObject(); | 144 ProcessObject(); |
| 145 m_bIsParsed = true; | 145 m_bIsParsed = true; |
| 146 m_CharIndex.RemoveAll(); | 146 m_CharIndex.RemoveAll(); |
| 147 int nCount = m_charList.GetSize(); | 147 int nCount = pdfium::CollectionSize<int>(m_CharList); |
| 148 if (nCount) { | 148 if (nCount) { |
| 149 m_CharIndex.Add(0); | 149 m_CharIndex.Add(0); |
| 150 } | 150 } |
| 151 for (int i = 0; i < nCount; i++) { | 151 for (int i = 0; i < nCount; i++) { |
| 152 int indexSize = m_CharIndex.GetSize(); | 152 int indexSize = m_CharIndex.GetSize(); |
| 153 FX_BOOL bNormal = FALSE; | 153 FX_BOOL bNormal = FALSE; |
| 154 PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(i); | 154 const PAGECHAR_INFO& charinfo = m_CharList[i]; |
| 155 if (charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) { | 155 if (charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) { |
| 156 bNormal = TRUE; | 156 bNormal = TRUE; |
| 157 } else if (charinfo.m_Unicode == 0 || IsControlChar(charinfo)) { | 157 } else if (charinfo.m_Unicode == 0 || IsControlChar(charinfo)) { |
| 158 bNormal = FALSE; | 158 bNormal = FALSE; |
| 159 } else { | 159 } else { |
| 160 bNormal = TRUE; | 160 bNormal = TRUE; |
| 161 } | 161 } |
| 162 if (bNormal) { | 162 if (bNormal) { |
| 163 if (indexSize % 2) { | 163 if (indexSize % 2) { |
| 164 m_CharIndex.Add(1); | 164 m_CharIndex.Add(1); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 179 } | 179 } |
| 180 } | 180 } |
| 181 } | 181 } |
| 182 int indexSize = m_CharIndex.GetSize(); | 182 int indexSize = m_CharIndex.GetSize(); |
| 183 if (indexSize % 2) { | 183 if (indexSize % 2) { |
| 184 m_CharIndex.RemoveAt(indexSize - 1); | 184 m_CharIndex.RemoveAt(indexSize - 1); |
| 185 } | 185 } |
| 186 return TRUE; | 186 return TRUE; |
| 187 } | 187 } |
| 188 int CPDF_TextPage::CountChars() const { | 188 int CPDF_TextPage::CountChars() const { |
| 189 return m_charList.GetSize(); | 189 return pdfium::CollectionSize<int>(m_CharList); |
| 190 } | 190 } |
| 191 int CPDF_TextPage::CharIndexFromTextIndex(int TextIndex) const { | 191 int CPDF_TextPage::CharIndexFromTextIndex(int TextIndex) const { |
| 192 int indexSize = m_CharIndex.GetSize(); | 192 int indexSize = m_CharIndex.GetSize(); |
| 193 int count = 0; | 193 int count = 0; |
| 194 for (int i = 0; i < indexSize; i += 2) { | 194 for (int i = 0; i < indexSize; i += 2) { |
| 195 count += m_CharIndex.GetAt(i + 1); | 195 count += m_CharIndex.GetAt(i + 1); |
| 196 if (count > TextIndex) { | 196 if (count > TextIndex) { |
| 197 return TextIndex - count + m_CharIndex.GetAt(i + 1) + | 197 return TextIndex - count + m_CharIndex.GetAt(i + 1) + |
| 198 m_CharIndex.GetAt(i); | 198 m_CharIndex.GetAt(i); |
| 199 } | 199 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 217 } | 217 } |
| 218 void CPDF_TextPage::GetRectArray(int start, | 218 void CPDF_TextPage::GetRectArray(int start, |
| 219 int nCount, | 219 int nCount, |
| 220 CFX_RectArray& rectArray) const { | 220 CFX_RectArray& rectArray) const { |
| 221 if (start < 0 || nCount == 0) { | 221 if (start < 0 || nCount == 0) { |
| 222 return; | 222 return; |
| 223 } | 223 } |
| 224 if (!m_bIsParsed) { | 224 if (!m_bIsParsed) { |
| 225 return; | 225 return; |
| 226 } | 226 } |
| 227 PAGECHAR_INFO info_curchar; | |
| 228 CPDF_TextObject* pCurObj = NULL; | 227 CPDF_TextObject* pCurObj = NULL; |
| 229 CFX_FloatRect rect; | 228 CFX_FloatRect rect; |
| 230 int curPos = start; | 229 int curPos = start; |
| 231 FX_BOOL flagNewRect = TRUE; | 230 FX_BOOL flagNewRect = TRUE; |
| 232 if (nCount + start > m_charList.GetSize() || nCount == -1) { | 231 if (nCount + start > pdfium::CollectionSize<int>(m_CharList) || |
| 233 nCount = m_charList.GetSize() - start; | 232 nCount == -1) { |
| 233 nCount = pdfium::CollectionSize<int>(m_CharList) - start; |
| 234 } | 234 } |
| 235 while (nCount--) { | 235 while (nCount--) { |
| 236 info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(curPos++); | 236 PAGECHAR_INFO info_curchar = m_CharList[curPos++]; |
| 237 if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) { | 237 if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) { |
| 238 continue; | 238 continue; |
| 239 } | 239 } |
| 240 if (info_curchar.m_CharBox.Width() < 0.01 || | 240 if (info_curchar.m_CharBox.Width() < 0.01 || |
| 241 info_curchar.m_CharBox.Height() < 0.01) { | 241 info_curchar.m_CharBox.Height() < 0.01) { |
| 242 continue; | 242 continue; |
| 243 } | 243 } |
| 244 if (!pCurObj) { | 244 if (!pCurObj) { |
| 245 pCurObj = info_curchar.m_pTextObj; | 245 pCurObj = info_curchar.m_pTextObj; |
| 246 } | 246 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 } | 292 } |
| 293 if (rect.top < info_curchar.m_CharBox.top) { | 293 if (rect.top < info_curchar.m_CharBox.top) { |
| 294 rect.top = info_curchar.m_CharBox.top; | 294 rect.top = info_curchar.m_CharBox.top; |
| 295 } | 295 } |
| 296 if (rect.bottom > info_curchar.m_CharBox.bottom) { | 296 if (rect.bottom > info_curchar.m_CharBox.bottom) { |
| 297 rect.bottom = info_curchar.m_CharBox.bottom; | 297 rect.bottom = info_curchar.m_CharBox.bottom; |
| 298 } | 298 } |
| 299 } | 299 } |
| 300 } | 300 } |
| 301 rectArray.Add(rect); | 301 rectArray.Add(rect); |
| 302 return; | |
| 303 } | 302 } |
| 304 int CPDF_TextPage::GetIndexAtPos(CPDF_Point point, | 303 int CPDF_TextPage::GetIndexAtPos(CPDF_Point point, |
| 305 FX_FLOAT xTolerance, | 304 FX_FLOAT xTolerance, |
| 306 FX_FLOAT yTolerance) const { | 305 FX_FLOAT yTolerance) const { |
| 307 if (!m_bIsParsed) | 306 if (!m_bIsParsed) |
| 308 return -3; | 307 return -3; |
| 309 | 308 |
| 310 int pos = 0; | 309 int pos = 0; |
| 311 int NearPos = -1; | 310 int NearPos = -1; |
| 312 double xdif = 5000, ydif = 5000; | 311 double xdif = 5000; |
| 313 while (pos < m_charList.GetSize()) { | 312 double ydif = 5000; |
| 314 PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)(m_charList.GetAt(pos)); | 313 while (pos < pdfium::CollectionSize<int>(m_CharList)) { |
| 314 PAGECHAR_INFO charinfo = m_CharList[pos]; |
| 315 CFX_FloatRect charrect = charinfo.m_CharBox; | 315 CFX_FloatRect charrect = charinfo.m_CharBox; |
| 316 if (charrect.Contains(point.x, point.y)) { | 316 if (charrect.Contains(point.x, point.y)) { |
| 317 break; | 317 break; |
| 318 } | 318 } |
| 319 if (xTolerance > 0 || yTolerance > 0) { | 319 if (xTolerance > 0 || yTolerance > 0) { |
| 320 CFX_FloatRect charRectExt; | 320 CFX_FloatRect charRectExt; |
| 321 charrect.Normalize(); | 321 charrect.Normalize(); |
| 322 charRectExt.left = charrect.left - xTolerance / 2; | 322 charRectExt.left = charrect.left - xTolerance / 2; |
| 323 charRectExt.right = charrect.right + xTolerance / 2; | 323 charRectExt.right = charrect.right + xTolerance / 2; |
| 324 charRectExt.top = charrect.top + yTolerance / 2; | 324 charRectExt.top = charrect.top + yTolerance / 2; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 335 : FXSYS_fabs(point.y - charrect.top); | 335 : FXSYS_fabs(point.y - charrect.top); |
| 336 if (curYdif + curXdif < xdif + ydif) { | 336 if (curYdif + curXdif < xdif + ydif) { |
| 337 ydif = curYdif; | 337 ydif = curYdif; |
| 338 xdif = curXdif; | 338 xdif = curXdif; |
| 339 NearPos = pos; | 339 NearPos = pos; |
| 340 } | 340 } |
| 341 } | 341 } |
| 342 } | 342 } |
| 343 ++pos; | 343 ++pos; |
| 344 } | 344 } |
| 345 if (pos >= m_charList.GetSize()) { | 345 return pos < pdfium::CollectionSize<int>(m_CharList) ? pos : NearPos; |
| 346 pos = NearPos; | |
| 347 } | |
| 348 return pos; | |
| 349 } | 346 } |
| 347 |
| 350 CFX_WideString CPDF_TextPage::GetTextByRect(const CFX_FloatRect& rect) const { | 348 CFX_WideString CPDF_TextPage::GetTextByRect(const CFX_FloatRect& rect) const { |
| 349 if (!m_bIsParsed) |
| 350 return CFX_WideString(); |
| 351 |
| 352 FX_FLOAT posy = 0; |
| 353 bool IsContainPreChar = false; |
| 354 bool IsAddLineFeed = false; |
| 351 CFX_WideString strText; | 355 CFX_WideString strText; |
| 352 if (!m_bIsParsed) | 356 for (const auto& charinfo : m_CharList) { |
| 353 return strText; | |
| 354 | |
| 355 int nCount = m_charList.GetSize(); | |
| 356 int pos = 0; | |
| 357 FX_FLOAT posy = 0; | |
| 358 FX_BOOL IsContainPreChar = FALSE; | |
| 359 FX_BOOL ISAddLineFeed = FALSE; | |
| 360 while (pos < nCount) { | |
| 361 PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos++); | |
| 362 if (IsRectIntersect(rect, charinfo.m_CharBox)) { | 357 if (IsRectIntersect(rect, charinfo.m_CharBox)) { |
| 363 if (FXSYS_fabs(posy - charinfo.m_OriginY) > 0 && !IsContainPreChar && | 358 if (FXSYS_fabs(posy - charinfo.m_OriginY) > 0 && !IsContainPreChar && |
| 364 ISAddLineFeed) { | 359 IsAddLineFeed) { |
| 365 posy = charinfo.m_OriginY; | 360 posy = charinfo.m_OriginY; |
| 366 if (strText.GetLength() > 0) { | 361 if (strText.GetLength() > 0) { |
| 367 strText += L"\r\n"; | 362 strText += L"\r\n"; |
| 368 } | 363 } |
| 369 } | 364 } |
| 370 IsContainPreChar = TRUE; | 365 IsContainPreChar = true; |
| 371 ISAddLineFeed = FALSE; | 366 IsAddLineFeed = false; |
| 372 if (charinfo.m_Unicode) { | 367 if (charinfo.m_Unicode) { |
| 373 strText += charinfo.m_Unicode; | 368 strText += charinfo.m_Unicode; |
| 374 } | 369 } |
| 375 } else if (charinfo.m_Unicode == 32) { | 370 } else if (charinfo.m_Unicode == 32) { |
| 376 if (IsContainPreChar && charinfo.m_Unicode) { | 371 if (IsContainPreChar && charinfo.m_Unicode) { |
| 377 strText += charinfo.m_Unicode; | 372 strText += charinfo.m_Unicode; |
| 378 IsContainPreChar = FALSE; | 373 IsContainPreChar = false; |
| 379 ISAddLineFeed = FALSE; | 374 IsAddLineFeed = false; |
| 380 } | 375 } |
| 381 } else { | 376 } else { |
| 382 IsContainPreChar = FALSE; | 377 IsContainPreChar = false; |
| 383 ISAddLineFeed = TRUE; | 378 IsAddLineFeed = true; |
| 384 } | 379 } |
| 385 } | 380 } |
| 386 return strText; | 381 return strText; |
| 387 } | 382 } |
| 388 void CPDF_TextPage::GetRectsArrayByRect(const CFX_FloatRect& rect, | 383 void CPDF_TextPage::GetRectsArrayByRect(const CFX_FloatRect& rect, |
| 389 CFX_RectArray& resRectArray) const { | 384 CFX_RectArray& resRectArray) const { |
| 390 if (!m_bIsParsed) | 385 if (!m_bIsParsed) |
| 391 return; | 386 return; |
| 392 | 387 |
| 393 CFX_FloatRect curRect; | 388 CFX_FloatRect curRect; |
| 394 FX_BOOL flagNewRect = TRUE; | 389 bool flagNewRect = true; |
| 395 CPDF_TextObject* pCurObj = NULL; | 390 CPDF_TextObject* pCurObj = nullptr; |
| 396 int nCount = m_charList.GetSize(); | 391 for (auto info_curchar : m_CharList) { |
| 397 int pos = 0; | |
| 398 while (pos < nCount) { | |
| 399 PAGECHAR_INFO info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(pos++); | |
| 400 if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) { | 392 if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) { |
| 401 continue; | 393 continue; |
| 402 } | 394 } |
| 403 if (IsRectIntersect(rect, info_curchar.m_CharBox)) { | 395 if (!IsRectIntersect(rect, info_curchar.m_CharBox)) { |
| 404 if (!pCurObj) { | 396 continue; |
| 405 pCurObj = info_curchar.m_pTextObj; | 397 } |
| 406 } | 398 if (!pCurObj) { |
| 407 if (pCurObj != info_curchar.m_pTextObj) { | 399 pCurObj = info_curchar.m_pTextObj; |
| 408 resRectArray.Add(curRect); | 400 } |
| 409 pCurObj = info_curchar.m_pTextObj; | 401 if (pCurObj != info_curchar.m_pTextObj) { |
| 410 flagNewRect = TRUE; | 402 resRectArray.Add(curRect); |
| 411 } | 403 pCurObj = info_curchar.m_pTextObj; |
| 412 if (flagNewRect) { | 404 flagNewRect = true; |
| 413 curRect = info_curchar.m_CharBox; | 405 } |
| 414 flagNewRect = FALSE; | 406 if (flagNewRect) { |
| 415 curRect.Normalize(); | 407 curRect = info_curchar.m_CharBox; |
| 416 } else { | 408 curRect.Normalize(); |
| 417 info_curchar.m_CharBox.Normalize(); | 409 flagNewRect = false; |
| 418 if (curRect.left > info_curchar.m_CharBox.left) { | 410 } else { |
| 419 curRect.left = info_curchar.m_CharBox.left; | 411 info_curchar.m_CharBox.Normalize(); |
| 420 } | 412 curRect.left = std::min(curRect.left, info_curchar.m_CharBox.left); |
| 421 if (curRect.right < info_curchar.m_CharBox.right) { | 413 curRect.bottom = std::min(curRect.bottom, info_curchar.m_CharBox.bottom); |
| 422 curRect.right = info_curchar.m_CharBox.right; | 414 curRect.right = std::max(curRect.right, info_curchar.m_CharBox.right); |
| 423 } | 415 curRect.top = std::max(curRect.top, info_curchar.m_CharBox.top); |
| 424 if (curRect.top < info_curchar.m_CharBox.top) { | |
| 425 curRect.top = info_curchar.m_CharBox.top; | |
| 426 } | |
| 427 if (curRect.bottom > info_curchar.m_CharBox.bottom) { | |
| 428 curRect.bottom = info_curchar.m_CharBox.bottom; | |
| 429 } | |
| 430 } | |
| 431 } | 416 } |
| 432 } | 417 } |
| 433 resRectArray.Add(curRect); | 418 resRectArray.Add(curRect); |
| 434 return; | |
| 435 } | 419 } |
| 436 int CPDF_TextPage::GetIndexAtPos(FX_FLOAT x, | 420 int CPDF_TextPage::GetIndexAtPos(FX_FLOAT x, |
| 437 FX_FLOAT y, | 421 FX_FLOAT y, |
| 438 FX_FLOAT xTolerance, | 422 FX_FLOAT xTolerance, |
| 439 FX_FLOAT yTolerance) const { | 423 FX_FLOAT yTolerance) const { |
| 440 CPDF_Point point(x, y); | 424 CPDF_Point point(x, y); |
| 441 return GetIndexAtPos(point, xTolerance, yTolerance); | 425 return GetIndexAtPos(point, xTolerance, yTolerance); |
| 442 } | 426 } |
| 443 | 427 |
| 444 void CPDF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO* info) const { | 428 void CPDF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO* info) const { |
| 445 if (!m_bIsParsed) | 429 if (!m_bIsParsed) |
| 446 return; | 430 return; |
| 447 | 431 |
| 448 if (index < 0 || index >= m_charList.GetSize()) | 432 if (index < 0 || index >= pdfium::CollectionSize<int>(m_CharList)) |
| 449 return; | 433 return; |
| 450 | 434 |
| 451 const PAGECHAR_INFO* charinfo = | 435 const PAGECHAR_INFO& charinfo = m_CharList[index]; |
| 452 static_cast<PAGECHAR_INFO*>(m_charList.GetAt(index)); | 436 info->m_Charcode = charinfo.m_CharCode; |
| 453 info->m_Charcode = charinfo->m_CharCode; | 437 info->m_OriginX = charinfo.m_OriginX; |
| 454 info->m_OriginX = charinfo->m_OriginX; | 438 info->m_OriginY = charinfo.m_OriginY; |
| 455 info->m_OriginY = charinfo->m_OriginY; | 439 info->m_Unicode = charinfo.m_Unicode; |
| 456 info->m_Unicode = charinfo->m_Unicode; | 440 info->m_Flag = charinfo.m_Flag; |
| 457 info->m_Flag = charinfo->m_Flag; | 441 info->m_CharBox = charinfo.m_CharBox; |
| 458 info->m_CharBox = charinfo->m_CharBox; | 442 info->m_pTextObj = charinfo.m_pTextObj; |
| 459 info->m_pTextObj = charinfo->m_pTextObj; | 443 if (charinfo.m_pTextObj && charinfo.m_pTextObj->GetFont()) { |
| 460 if (charinfo->m_pTextObj && charinfo->m_pTextObj->GetFont()) { | 444 info->m_FontSize = charinfo.m_pTextObj->GetFontSize(); |
| 461 info->m_FontSize = charinfo->m_pTextObj->GetFontSize(); | |
| 462 } else { | 445 } else { |
| 463 info->m_FontSize = kDefaultFontSize; | 446 info->m_FontSize = kDefaultFontSize; |
| 464 } | 447 } |
| 465 info->m_Matrix.Copy(charinfo->m_Matrix); | 448 info->m_Matrix.Copy(charinfo.m_Matrix); |
| 466 } | 449 } |
| 467 | 450 |
| 468 void CPDF_TextPage::CheckMarkedContentObject(int32_t& start, | 451 void CPDF_TextPage::CheckMarkedContentObject(int32_t& start, |
| 469 int32_t& nCount) const { | 452 int32_t& nCount) const { |
| 470 PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start); | 453 PAGECHAR_INFO charinfo = m_CharList[start]; |
| 471 PAGECHAR_INFO charinfo2 = | 454 PAGECHAR_INFO charinfo2 = m_CharList[start + nCount - 1]; |
| 472 *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1); | |
| 473 if (FPDFTEXT_CHAR_PIECE != charinfo.m_Flag && | 455 if (FPDFTEXT_CHAR_PIECE != charinfo.m_Flag && |
| 474 FPDFTEXT_CHAR_PIECE != charinfo2.m_Flag) { | 456 FPDFTEXT_CHAR_PIECE != charinfo2.m_Flag) { |
| 475 return; | 457 return; |
| 476 } | 458 } |
| 477 if (FPDFTEXT_CHAR_PIECE == charinfo.m_Flag) { | 459 if (FPDFTEXT_CHAR_PIECE == charinfo.m_Flag) { |
| 478 PAGECHAR_INFO charinfo1 = charinfo; | 460 PAGECHAR_INFO charinfo1 = charinfo; |
| 479 int startIndex = start; | 461 int startIndex = start; |
| 480 while (FPDFTEXT_CHAR_PIECE == charinfo1.m_Flag && | 462 while (FPDFTEXT_CHAR_PIECE == charinfo1.m_Flag && |
| 481 charinfo1.m_Index == charinfo.m_Index) { | 463 charinfo1.m_Index == charinfo.m_Index) { |
| 482 startIndex--; | 464 startIndex--; |
| 483 if (startIndex < 0) { | 465 if (startIndex < 0) { |
| 484 break; | 466 break; |
| 485 } | 467 } |
| 486 charinfo1 = *(PAGECHAR_INFO*)m_charList.GetAt(startIndex); | 468 charinfo1 = m_CharList[startIndex]; |
| 487 } | 469 } |
| 488 startIndex++; | 470 startIndex++; |
| 489 start = startIndex; | 471 start = startIndex; |
| 490 } | 472 } |
| 491 if (FPDFTEXT_CHAR_PIECE == charinfo2.m_Flag) { | 473 if (FPDFTEXT_CHAR_PIECE == charinfo2.m_Flag) { |
| 492 PAGECHAR_INFO charinfo3 = charinfo2; | 474 PAGECHAR_INFO charinfo3 = charinfo2; |
| 493 int endIndex = start + nCount - 1; | 475 int endIndex = start + nCount - 1; |
| 494 while (FPDFTEXT_CHAR_PIECE == charinfo3.m_Flag && | 476 while (FPDFTEXT_CHAR_PIECE == charinfo3.m_Flag && |
| 495 charinfo3.m_Index == charinfo2.m_Index) { | 477 charinfo3.m_Index == charinfo2.m_Index) { |
| 496 endIndex++; | 478 endIndex++; |
| 497 if (endIndex >= m_charList.GetSize()) { | 479 if (endIndex >= pdfium::CollectionSize<int>(m_CharList)) { |
| 498 break; | 480 break; |
| 499 } | 481 } |
| 500 charinfo3 = *(PAGECHAR_INFO*)m_charList.GetAt(endIndex); | 482 charinfo3 = m_CharList[endIndex]; |
| 501 } | 483 } |
| 502 endIndex--; | 484 endIndex--; |
| 503 nCount = endIndex - start + 1; | 485 nCount = endIndex - start + 1; |
| 504 } | 486 } |
| 505 } | 487 } |
| 506 CFX_WideString CPDF_TextPage::GetPageText(int start, int nCount) const { | 488 CFX_WideString CPDF_TextPage::GetPageText(int start, int nCount) const { |
| 507 if (!m_bIsParsed || nCount == 0) | 489 if (!m_bIsParsed || nCount == 0) |
| 508 return L""; | 490 return L""; |
| 509 | 491 |
| 510 if (start < 0) | 492 if (start < 0) |
| 511 start = 0; | 493 start = 0; |
| 512 | 494 |
| 513 if (nCount == -1) { | 495 if (nCount == -1) { |
| 514 nCount = m_charList.GetSize() - start; | 496 nCount = pdfium::CollectionSize<int>(m_CharList) - start; |
| 515 return m_TextBuf.GetWideString().Mid(start, | 497 return m_TextBuf.GetWideString().Mid(start, |
| 516 m_TextBuf.GetWideString().GetLength()); | 498 m_TextBuf.GetWideString().GetLength()); |
| 517 } | 499 } |
| 518 if (nCount <= 0 || m_charList.GetSize() <= 0) { | 500 if (nCount <= 0 || m_CharList.empty()) { |
| 519 return L""; | 501 return L""; |
| 520 } | 502 } |
| 521 if (nCount + start > m_charList.GetSize() - 1) { | 503 if (nCount + start > pdfium::CollectionSize<int>(m_CharList) - 1) { |
| 522 nCount = m_charList.GetSize() - start; | 504 nCount = pdfium::CollectionSize<int>(m_CharList) - start; |
| 523 } | 505 } |
| 524 if (nCount <= 0) { | 506 if (nCount <= 0) { |
| 525 return L""; | 507 return L""; |
| 526 } | 508 } |
| 527 CheckMarkedContentObject(start, nCount); | 509 CheckMarkedContentObject(start, nCount); |
| 528 int startindex = 0; | 510 int startindex = 0; |
| 529 PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start); | 511 PAGECHAR_INFO charinfo = m_CharList[start]; |
| 530 int startOffset = 0; | 512 int startOffset = 0; |
| 531 while (charinfo.m_Index == -1) { | 513 while (charinfo.m_Index == -1) { |
| 532 startOffset++; | 514 startOffset++; |
| 533 if (startOffset > nCount || start + startOffset >= m_charList.GetSize()) { | 515 if (startOffset > nCount || |
| 516 start + startOffset >= pdfium::CollectionSize<int>(m_CharList)) { |
| 534 return L""; | 517 return L""; |
| 535 } | 518 } |
| 536 charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + startOffset); | 519 charinfo = m_CharList[start + startOffset]; |
| 537 } | 520 } |
| 538 startindex = charinfo.m_Index; | 521 startindex = charinfo.m_Index; |
| 539 charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1); | 522 charinfo = m_CharList[start + nCount - 1]; |
| 540 int nCountOffset = 0; | 523 int nCountOffset = 0; |
| 541 while (charinfo.m_Index == -1) { | 524 while (charinfo.m_Index == -1) { |
| 542 nCountOffset++; | 525 nCountOffset++; |
| 543 if (nCountOffset >= nCount) { | 526 if (nCountOffset >= nCount) { |
| 544 return L""; | 527 return L""; |
| 545 } | 528 } |
| 546 charinfo = | 529 charinfo = m_CharList[start + nCount - nCountOffset - 1]; |
| 547 *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - nCountOffset - 1); | |
| 548 } | 530 } |
| 549 nCount = start + nCount - nCountOffset - startindex; | 531 nCount = start + nCount - nCountOffset - startindex; |
| 550 if (nCount <= 0) { | 532 if (nCount <= 0) { |
| 551 return L""; | 533 return L""; |
| 552 } | 534 } |
| 553 return m_TextBuf.GetWideString().Mid(startindex, nCount); | 535 return m_TextBuf.GetWideString().Mid(startindex, nCount); |
| 554 } | 536 } |
| 555 int CPDF_TextPage::CountRects(int start, int nCount) { | 537 int CPDF_TextPage::CountRects(int start, int nCount) { |
| 556 if (!m_bIsParsed || start < 0) | 538 if (!m_bIsParsed || start < 0) |
| 557 return -1; | 539 return -1; |
| 558 | 540 |
| 559 if (nCount == -1 || nCount + start > m_charList.GetSize()) { | 541 if (nCount == -1 || |
| 560 nCount = m_charList.GetSize() - start; | 542 nCount + start > pdfium::CollectionSize<int>(m_CharList)) { |
| 543 nCount = pdfium::CollectionSize<int>(m_CharList) - start; |
| 561 } | 544 } |
| 562 m_SelRects.RemoveAll(); | 545 m_SelRects.RemoveAll(); |
| 563 GetRectArray(start, nCount, m_SelRects); | 546 GetRectArray(start, nCount, m_SelRects); |
| 564 return m_SelRects.GetSize(); | 547 return m_SelRects.GetSize(); |
| 565 } | 548 } |
| 566 void CPDF_TextPage::GetRect(int rectIndex, | 549 void CPDF_TextPage::GetRect(int rectIndex, |
| 567 FX_FLOAT& left, | 550 FX_FLOAT& left, |
| 568 FX_FLOAT& top, | 551 FX_FLOAT& top, |
| 569 FX_FLOAT& right, | 552 FX_FLOAT& right, |
| 570 FX_FLOAT& bottom) const { | 553 FX_FLOAT& bottom) const { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 return FALSE; | 625 return FALSE; |
| 643 | 626 |
| 644 CFX_FloatRect rect = m_SelRects.GetAt(rectIndex); | 627 CFX_FloatRect rect = m_SelRects.GetAt(rectIndex); |
| 645 return GetBaselineRotate(rect, Rotate); | 628 return GetBaselineRotate(rect, Rotate); |
| 646 } | 629 } |
| 647 int CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, | 630 int CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, |
| 648 FX_FLOAT top, | 631 FX_FLOAT top, |
| 649 FX_FLOAT right, | 632 FX_FLOAT right, |
| 650 FX_FLOAT bottom, | 633 FX_FLOAT bottom, |
| 651 FX_BOOL bContains) { | 634 FX_BOOL bContains) { |
| 652 m_Segment.RemoveAll(); | 635 m_Segments.RemoveAll(); |
| 653 if (!m_bIsParsed) | 636 if (!m_bIsParsed) |
| 654 return -1; | 637 return -1; |
| 655 | 638 |
| 656 CFX_FloatRect rect(left, bottom, right, top); | 639 CFX_FloatRect rect(left, bottom, right, top); |
| 657 rect.Normalize(); | 640 rect.Normalize(); |
| 658 int nCount = m_charList.GetSize(); | 641 |
| 659 int pos = 0; | |
| 660 FPDF_SEGMENT segment; | 642 FPDF_SEGMENT segment; |
| 661 segment.m_Start = 0; | 643 segment.m_Start = 0; |
| 662 segment.m_nCount = 0; | 644 segment.m_nCount = 0; |
| 645 |
| 646 int pos = 0; |
| 663 int segmentStatus = 0; | 647 int segmentStatus = 0; |
| 664 FX_BOOL IsContainPreChar = FALSE; | 648 FX_BOOL IsContainPreChar = FALSE; |
| 665 while (pos < nCount) { | 649 for (const auto& charinfo : m_CharList) { |
| 666 PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos); | |
| 667 if (bContains && rect.Contains(charinfo.m_CharBox)) { | 650 if (bContains && rect.Contains(charinfo.m_CharBox)) { |
| 668 if (segmentStatus == 0 || segmentStatus == 2) { | 651 if (segmentStatus == 0 || segmentStatus == 2) { |
| 669 segment.m_Start = pos; | 652 segment.m_Start = pos; |
| 670 segment.m_nCount = 1; | 653 segment.m_nCount = 1; |
| 671 segmentStatus = 1; | 654 segmentStatus = 1; |
| 672 } else if (segmentStatus == 1) { | 655 } else if (segmentStatus == 1) { |
| 673 segment.m_nCount++; | 656 segment.m_nCount++; |
| 674 } | 657 } |
| 675 IsContainPreChar = TRUE; | 658 IsContainPreChar = TRUE; |
| 676 } else if (!bContains && | 659 } else if (!bContains && |
| (...skipping 13 matching lines...) Expand all Loading... |
| 690 segment.m_Start = pos; | 673 segment.m_Start = pos; |
| 691 segment.m_nCount = 1; | 674 segment.m_nCount = 1; |
| 692 segmentStatus = 1; | 675 segmentStatus = 1; |
| 693 } else if (segmentStatus == 1) { | 676 } else if (segmentStatus == 1) { |
| 694 segment.m_nCount++; | 677 segment.m_nCount++; |
| 695 } | 678 } |
| 696 IsContainPreChar = FALSE; | 679 IsContainPreChar = FALSE; |
| 697 } else { | 680 } else { |
| 698 if (segmentStatus == 1) { | 681 if (segmentStatus == 1) { |
| 699 segmentStatus = 2; | 682 segmentStatus = 2; |
| 700 m_Segment.Add(segment); | 683 m_Segments.Add(segment); |
| 701 segment.m_Start = 0; | 684 segment.m_Start = 0; |
| 702 segment.m_nCount = 0; | 685 segment.m_nCount = 0; |
| 703 } | 686 } |
| 704 } | 687 } |
| 705 } else { | 688 } else { |
| 706 if (segmentStatus == 1) { | 689 if (segmentStatus == 1) { |
| 707 segmentStatus = 2; | 690 segmentStatus = 2; |
| 708 m_Segment.Add(segment); | 691 m_Segments.Add(segment); |
| 709 segment.m_Start = 0; | 692 segment.m_Start = 0; |
| 710 segment.m_nCount = 0; | 693 segment.m_nCount = 0; |
| 711 } | 694 } |
| 712 IsContainPreChar = FALSE; | 695 IsContainPreChar = FALSE; |
| 713 } | 696 } |
| 714 pos++; | 697 pos++; |
| 715 } | 698 } |
| 716 if (segmentStatus == 1) { | 699 if (segmentStatus == 1) { |
| 717 segmentStatus = 2; | 700 segmentStatus = 2; |
| 718 m_Segment.Add(segment); | 701 m_Segments.Add(segment); |
| 719 segment.m_Start = 0; | 702 segment.m_Start = 0; |
| 720 segment.m_nCount = 0; | 703 segment.m_nCount = 0; |
| 721 } | 704 } |
| 722 return m_Segment.GetSize(); | 705 return m_Segments.GetSize(); |
| 723 } | 706 } |
| 724 void CPDF_TextPage::GetBoundedSegment(int index, int& start, int& count) const { | 707 void CPDF_TextPage::GetBoundedSegment(int index, int& start, int& count) const { |
| 725 if (index < 0 || index >= m_Segment.GetSize()) { | 708 if (index < 0 || index >= m_Segments.GetSize()) { |
| 726 return; | 709 return; |
| 727 } | 710 } |
| 728 start = m_Segment.GetAt(index).m_Start; | 711 start = m_Segments.GetAt(index).m_Start; |
| 729 count = m_Segment.GetAt(index).m_nCount; | 712 count = m_Segments.GetAt(index).m_nCount; |
| 730 } | 713 } |
| 731 int CPDF_TextPage::GetWordBreak(int index, int direction) const { | 714 int CPDF_TextPage::GetWordBreak(int index, int direction) const { |
| 732 if (!m_bIsParsed) | 715 if (!m_bIsParsed) |
| 733 return -1; | 716 return -1; |
| 734 | 717 |
| 735 if (direction != FPDFTEXT_LEFT && direction != FPDFTEXT_RIGHT) | 718 if (direction != FPDFTEXT_LEFT && direction != FPDFTEXT_RIGHT) |
| 736 return -1; | 719 return -1; |
| 737 | 720 |
| 738 if (index < 0 || index >= m_charList.GetSize()) | 721 if (index < 0 || index >= pdfium::CollectionSize<int>(m_CharList)) |
| 739 return -1; | 722 return -1; |
| 740 | 723 |
| 741 PAGECHAR_INFO charinfo; | 724 const PAGECHAR_INFO& charinfo = m_CharList[index]; |
| 742 charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index); | |
| 743 if (charinfo.m_Index == -1 || charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) { | 725 if (charinfo.m_Index == -1 || charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) { |
| 744 return index; | 726 return index; |
| 745 } | 727 } |
| 746 if (!IsLetter(charinfo.m_Unicode)) { | 728 if (!IsLetter(charinfo.m_Unicode)) { |
| 747 return index; | 729 return index; |
| 748 } | 730 } |
| 749 int breakPos = index; | 731 int breakPos = index; |
| 750 if (direction == FPDFTEXT_LEFT) { | 732 if (direction == FPDFTEXT_LEFT) { |
| 751 while (--breakPos > 0) { | 733 while (--breakPos > 0) { |
| 752 charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos); | 734 if (!IsLetter(m_CharList[breakPos].m_Unicode)) |
| 753 if (!IsLetter(charinfo.m_Unicode)) { | 735 break; |
| 754 return breakPos; | |
| 755 } | |
| 756 } | 736 } |
| 757 } else if (direction == FPDFTEXT_RIGHT) { | 737 } else if (direction == FPDFTEXT_RIGHT) { |
| 758 while (++breakPos < m_charList.GetSize()) { | 738 while (++breakPos < pdfium::CollectionSize<int>(m_CharList)) { |
| 759 charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos); | 739 if (!IsLetter(m_CharList[breakPos].m_Unicode)) |
| 760 if (!IsLetter(charinfo.m_Unicode)) { | 740 break; |
| 761 return breakPos; | |
| 762 } | |
| 763 } | 741 } |
| 764 } | 742 } |
| 765 return breakPos; | 743 return breakPos; |
| 766 } | 744 } |
| 767 int32_t CPDF_TextPage::FindTextlineFlowDirection() { | 745 int32_t CPDF_TextPage::FindTextlineFlowDirection() { |
| 768 if (!m_pPage) { | 746 if (!m_pPage) { |
| 769 return -1; | 747 return -1; |
| 770 } | 748 } |
| 771 const int32_t nPageWidth = (int32_t)((CPDF_Page*)m_pPage)->GetPageWidth(); | 749 const int32_t nPageWidth = (int32_t)((CPDF_Page*)m_pPage)->GetPageWidth(); |
| 772 const int32_t nPageHeight = (int32_t)((CPDF_Page*)m_pPage)->GetPageHeight(); | 750 const int32_t nPageHeight = (int32_t)((CPDF_Page*)m_pPage)->GetPageHeight(); |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 942 } | 920 } |
| 943 } | 921 } |
| 944 return w; | 922 return w; |
| 945 } | 923 } |
| 946 void CPDF_TextPage::OnPiece(CFX_BidiChar* pBidi, CFX_WideString& str) { | 924 void CPDF_TextPage::OnPiece(CFX_BidiChar* pBidi, CFX_WideString& str) { |
| 947 int32_t start, count; | 925 int32_t start, count; |
| 948 CFX_BidiChar::Direction ret = pBidi->GetBidiInfo(&start, &count); | 926 CFX_BidiChar::Direction ret = pBidi->GetBidiInfo(&start, &count); |
| 949 if (ret == CFX_BidiChar::RIGHT) { | 927 if (ret == CFX_BidiChar::RIGHT) { |
| 950 for (int i = start + count - 1; i >= start; i--) { | 928 for (int i = start + count - 1; i >= start; i--) { |
| 951 m_TextBuf.AppendChar(str.GetAt(i)); | 929 m_TextBuf.AppendChar(str.GetAt(i)); |
| 952 m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i)); | 930 m_CharList.push_back(m_TempCharList[i]); |
| 953 } | 931 } |
| 954 } else { | 932 } else { |
| 955 int end = start + count; | 933 int end = start + count; |
| 956 for (int i = start; i < end; i++) { | 934 for (int i = start; i < end; i++) { |
| 957 m_TextBuf.AppendChar(str.GetAt(i)); | 935 m_TextBuf.AppendChar(str.GetAt(i)); |
| 958 m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i)); | 936 m_CharList.push_back(m_TempCharList[i]); |
| 959 } | 937 } |
| 960 } | 938 } |
| 961 } | 939 } |
| 962 void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i) { | 940 void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i) { |
| 963 PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i); | 941 PAGECHAR_INFO info = m_TempCharList[i]; |
| 964 FX_WCHAR wChar = str.GetAt(i); | 942 FX_WCHAR wChar = str.GetAt(i); |
| 965 if (!IsControlChar(Info)) { | 943 if (!IsControlChar(info)) { |
| 966 Info.m_Index = m_TextBuf.GetLength(); | 944 info.m_Index = m_TextBuf.GetLength(); |
| 967 if (wChar >= 0xFB00 && wChar <= 0xFB06) { | 945 if (wChar >= 0xFB00 && wChar <= 0xFB06) { |
| 968 FX_WCHAR* pDst = NULL; | 946 FX_WCHAR* pDst = NULL; |
| 969 FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst); | 947 FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst); |
| 970 if (nCount >= 1) { | 948 if (nCount >= 1) { |
| 971 pDst = FX_Alloc(FX_WCHAR, nCount); | 949 pDst = FX_Alloc(FX_WCHAR, nCount); |
| 972 FX_Unicode_GetNormalization(wChar, pDst); | 950 FX_Unicode_GetNormalization(wChar, pDst); |
| 973 for (int nIndex = 0; nIndex < nCount; nIndex++) { | 951 for (int nIndex = 0; nIndex < nCount; nIndex++) { |
| 974 PAGECHAR_INFO Info2 = Info; | 952 PAGECHAR_INFO info2 = info; |
| 975 Info2.m_Unicode = pDst[nIndex]; | 953 info2.m_Unicode = pDst[nIndex]; |
| 976 Info2.m_Flag = FPDFTEXT_CHAR_PIECE; | 954 info2.m_Flag = FPDFTEXT_CHAR_PIECE; |
| 977 m_TextBuf.AppendChar(Info2.m_Unicode); | 955 m_TextBuf.AppendChar(info2.m_Unicode); |
| 978 m_charList.Add(Info2); | 956 m_CharList.push_back(info2); |
| 979 } | 957 } |
| 980 FX_Free(pDst); | 958 FX_Free(pDst); |
| 981 return; | 959 return; |
| 982 } | 960 } |
| 983 } | 961 } |
| 984 m_TextBuf.AppendChar(wChar); | 962 m_TextBuf.AppendChar(wChar); |
| 985 } else { | 963 } else { |
| 986 Info.m_Index = -1; | 964 info.m_Index = -1; |
| 987 } | 965 } |
| 988 m_charList.Add(Info); | 966 m_CharList.push_back(info); |
| 989 } | 967 } |
| 990 void CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i) { | 968 void CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i) { |
| 991 PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i); | 969 PAGECHAR_INFO info = m_TempCharList[i]; |
| 992 if (!IsControlChar(Info)) { | 970 if (!IsControlChar(info)) { |
| 993 Info.m_Index = m_TextBuf.GetLength(); | 971 info.m_Index = m_TextBuf.GetLength(); |
| 994 FX_WCHAR wChar = FX_GetMirrorChar(str.GetAt(i), TRUE, FALSE); | 972 FX_WCHAR wChar = FX_GetMirrorChar(str.GetAt(i), TRUE, FALSE); |
| 995 FX_WCHAR* pDst = NULL; | 973 FX_WCHAR* pDst = NULL; |
| 996 FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst); | 974 FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst); |
| 997 if (nCount >= 1) { | 975 if (nCount >= 1) { |
| 998 pDst = FX_Alloc(FX_WCHAR, nCount); | 976 pDst = FX_Alloc(FX_WCHAR, nCount); |
| 999 FX_Unicode_GetNormalization(wChar, pDst); | 977 FX_Unicode_GetNormalization(wChar, pDst); |
| 1000 for (int nIndex = 0; nIndex < nCount; nIndex++) { | 978 for (int nIndex = 0; nIndex < nCount; nIndex++) { |
| 1001 PAGECHAR_INFO Info2 = Info; | 979 PAGECHAR_INFO info2 = info; |
| 1002 Info2.m_Unicode = pDst[nIndex]; | 980 info2.m_Unicode = pDst[nIndex]; |
| 1003 Info2.m_Flag = FPDFTEXT_CHAR_PIECE; | 981 info2.m_Flag = FPDFTEXT_CHAR_PIECE; |
| 1004 m_TextBuf.AppendChar(Info2.m_Unicode); | 982 m_TextBuf.AppendChar(info2.m_Unicode); |
| 1005 m_charList.Add(Info2); | 983 m_CharList.push_back(info2); |
| 1006 } | 984 } |
| 1007 FX_Free(pDst); | 985 FX_Free(pDst); |
| 1008 return; | 986 return; |
| 1009 } | 987 } |
| 1010 Info.m_Unicode = wChar; | 988 info.m_Unicode = wChar; |
| 1011 m_TextBuf.AppendChar(Info.m_Unicode); | 989 m_TextBuf.AppendChar(info.m_Unicode); |
| 1012 } else { | 990 } else { |
| 1013 Info.m_Index = -1; | 991 info.m_Index = -1; |
| 1014 } | 992 } |
| 1015 m_charList.Add(Info); | 993 m_CharList.push_back(info); |
| 1016 } | 994 } |
| 1017 void CPDF_TextPage::CloseTempLine() { | 995 void CPDF_TextPage::CloseTempLine() { |
| 1018 int count1 = m_TempCharList.GetSize(); | 996 if (m_TempCharList.empty()) { |
| 1019 if (count1 <= 0) { | |
| 1020 return; | 997 return; |
| 1021 } | 998 } |
| 1022 std::unique_ptr<CFX_BidiChar> pBidiChar(new CFX_BidiChar); | 999 std::unique_ptr<CFX_BidiChar> pBidiChar(new CFX_BidiChar); |
| 1023 CFX_WideString str = m_TempTextBuf.GetWideString(); | 1000 CFX_WideString str = m_TempTextBuf.GetWideString(); |
| 1024 CFX_WordArray order; | 1001 CFX_WordArray order; |
| 1025 FX_BOOL bR2L = FALSE; | 1002 FX_BOOL bR2L = FALSE; |
| 1026 int32_t start = 0, count = 0; | 1003 int32_t start = 0, count = 0; |
| 1027 int nR2L = 0, nL2R = 0; | 1004 int nR2L = 0, nL2R = 0; |
| 1028 FX_BOOL bPrevSpace = FALSE; | 1005 FX_BOOL bPrevSpace = FALSE; |
| 1029 for (int i = 0; i < str.GetLength(); i++) { | 1006 for (int i = 0; i < str.GetLength(); i++) { |
| 1030 if (str.GetAt(i) == 32) { | 1007 if (str.GetAt(i) == 32) { |
| 1031 if (bPrevSpace) { | 1008 if (bPrevSpace) { |
| 1032 m_TempTextBuf.Delete(i, 1); | 1009 m_TempTextBuf.Delete(i, 1); |
| 1033 m_TempCharList.Delete(i); | 1010 m_TempCharList.erase(m_TempCharList.begin() + i); |
| 1034 str.Delete(i); | 1011 str.Delete(i); |
| 1035 count1--; | |
| 1036 i--; | 1012 i--; |
| 1037 continue; | 1013 continue; |
| 1038 } | 1014 } |
| 1039 bPrevSpace = TRUE; | 1015 bPrevSpace = TRUE; |
| 1040 } else { | 1016 } else { |
| 1041 bPrevSpace = FALSE; | 1017 bPrevSpace = FALSE; |
| 1042 } | 1018 } |
| 1043 if (pBidiChar->AppendChar(str.GetAt(i))) { | 1019 if (pBidiChar->AppendChar(str.GetAt(i))) { |
| 1044 CFX_BidiChar::Direction ret = pBidiChar->GetBidiInfo(&start, &count); | 1020 CFX_BidiChar::Direction ret = pBidiChar->GetBidiInfo(&start, &count); |
| 1045 order.Add(start); | 1021 order.Add(start); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1126 break; | 1102 break; |
| 1127 } else { | 1103 } else { |
| 1128 j += 3; | 1104 j += 3; |
| 1129 } | 1105 } |
| 1130 } | 1106 } |
| 1131 if (j == 3) { | 1107 if (j == 3) { |
| 1132 i = -3; | 1108 i = -3; |
| 1133 bL2R = TRUE; | 1109 bL2R = TRUE; |
| 1134 continue; | 1110 continue; |
| 1135 } | 1111 } |
| 1136 int end = m_TempCharList.GetSize() - 1; | 1112 int end = pdfium::CollectionSize<int>(m_TempCharList) - 1; |
| 1137 if (j < count) { | 1113 if (j < count) { |
| 1138 end = order.GetAt(j) - 1; | 1114 end = order.GetAt(j) - 1; |
| 1139 } | 1115 } |
| 1140 i = j - 3; | 1116 i = j - 3; |
| 1141 for (int n = end; n >= start; n--) { | 1117 for (int n = end; n >= start; n--) { |
| 1142 AddCharInfoByRLDirection(str, n); | 1118 AddCharInfoByRLDirection(str, n); |
| 1143 } | 1119 } |
| 1144 } else { | 1120 } else { |
| 1145 int end = start + count1; | 1121 int end = start + count1; |
| 1146 for (int n = start; n < end; n++) { | 1122 for (int n = start; n < end; n++) { |
| 1147 AddCharInfoByLRDirection(str, n); | 1123 AddCharInfoByLRDirection(str, n); |
| 1148 } | 1124 } |
| 1149 } | 1125 } |
| 1150 } | 1126 } |
| 1151 } | 1127 } |
| 1152 order.RemoveAll(); | 1128 order.RemoveAll(); |
| 1153 m_TempCharList.RemoveAll(); | 1129 m_TempCharList.clear(); |
| 1154 m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength()); | 1130 m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength()); |
| 1155 } | 1131 } |
| 1156 void CPDF_TextPage::ProcessTextObject(CPDF_TextObject* pTextObj, | 1132 void CPDF_TextPage::ProcessTextObject(CPDF_TextObject* pTextObj, |
| 1157 const CFX_Matrix& formMatrix, | 1133 const CFX_Matrix& formMatrix, |
| 1158 FX_POSITION ObjPos) { | 1134 FX_POSITION ObjPos) { |
| 1159 CFX_FloatRect re(pTextObj->m_Left, pTextObj->m_Bottom, pTextObj->m_Right, | 1135 CFX_FloatRect re(pTextObj->m_Left, pTextObj->m_Bottom, pTextObj->m_Right, |
| 1160 pTextObj->m_Top); | 1136 pTextObj->m_Top); |
| 1161 if (FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f) { | 1137 if (FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f) { |
| 1162 return; | 1138 return; |
| 1163 } | 1139 } |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1360 charinfo.m_Unicode = wChar; | 1336 charinfo.m_Unicode = wChar; |
| 1361 charinfo.m_CharCode = pFont->CharCodeFromUnicode(wChar); | 1337 charinfo.m_CharCode = pFont->CharCodeFromUnicode(wChar); |
| 1362 charinfo.m_Flag = FPDFTEXT_CHAR_PIECE; | 1338 charinfo.m_Flag = FPDFTEXT_CHAR_PIECE; |
| 1363 charinfo.m_pTextObj = pTextObj; | 1339 charinfo.m_pTextObj = pTextObj; |
| 1364 charinfo.m_CharBox.top = charBox.top; | 1340 charinfo.m_CharBox.top = charBox.top; |
| 1365 charinfo.m_CharBox.left = charBox.left; | 1341 charinfo.m_CharBox.left = charBox.left; |
| 1366 charinfo.m_CharBox.right = charBox.right; | 1342 charinfo.m_CharBox.right = charBox.right; |
| 1367 charinfo.m_CharBox.bottom = charBox.bottom; | 1343 charinfo.m_CharBox.bottom = charBox.bottom; |
| 1368 charinfo.m_Matrix.Copy(matrix); | 1344 charinfo.m_Matrix.Copy(matrix); |
| 1369 m_TempTextBuf.AppendChar(wChar); | 1345 m_TempTextBuf.AppendChar(wChar); |
| 1370 m_TempCharList.Add(charinfo); | 1346 m_TempCharList.push_back(charinfo); |
| 1371 } | 1347 } |
| 1372 } | 1348 } |
| 1373 void CPDF_TextPage::FindPreviousTextObject(void) { | 1349 void CPDF_TextPage::FindPreviousTextObject() { |
| 1374 if (m_TempCharList.GetSize() < 1 && m_charList.GetSize() < 1) { | 1350 if (m_TempCharList.empty() && m_CharList.empty()) |
| 1375 return; | 1351 return; |
| 1376 } | 1352 |
| 1377 PAGECHAR_INFO preChar; | 1353 PAGECHAR_INFO preChar = |
| 1378 if (m_TempCharList.GetSize() >= 1) { | 1354 m_TempCharList.empty() ? m_CharList.back() : m_TempCharList.back(); |
| 1379 preChar = | 1355 |
| 1380 *(PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1); | 1356 if (preChar.m_pTextObj) |
| 1381 } else { | |
| 1382 preChar = *(PAGECHAR_INFO*)m_charList.GetAt(m_charList.GetSize() - 1); | |
| 1383 } | |
| 1384 if (preChar.m_pTextObj) { | |
| 1385 m_pPreTextObj = preChar.m_pTextObj; | 1357 m_pPreTextObj = preChar.m_pTextObj; |
| 1386 } | |
| 1387 } | 1358 } |
| 1388 void CPDF_TextPage::SwapTempTextBuf(int32_t iCharListStartAppend, | 1359 void CPDF_TextPage::SwapTempTextBuf(int32_t iCharListStartAppend, |
| 1389 int32_t iBufStartAppend) { | 1360 int32_t iBufStartAppend) { |
| 1390 int32_t i, j; | 1361 int32_t i = iCharListStartAppend; |
| 1391 i = iCharListStartAppend; | 1362 int32_t j = pdfium::CollectionSize<int32_t>(m_TempCharList) - 1; |
| 1392 j = m_TempCharList.GetSize() - 1; | |
| 1393 for (; i < j; i++, j--) { | 1363 for (; i < j; i++, j--) { |
| 1394 std::swap(m_TempCharList[i], m_TempCharList[j]); | 1364 std::swap(m_TempCharList[i], m_TempCharList[j]); |
| 1395 std::swap(m_TempCharList[i].m_Index, m_TempCharList[j].m_Index); | 1365 std::swap(m_TempCharList[i].m_Index, m_TempCharList[j].m_Index); |
| 1396 } | 1366 } |
| 1397 FX_WCHAR* pTempBuffer = m_TempTextBuf.GetBuffer(); | 1367 FX_WCHAR* pTempBuffer = m_TempTextBuf.GetBuffer(); |
| 1398 i = iBufStartAppend; | 1368 i = iBufStartAppend; |
| 1399 j = m_TempTextBuf.GetLength() - 1; | 1369 j = m_TempTextBuf.GetLength() - 1; |
| 1400 for (; i < j; i++, j--) { | 1370 for (; i < j; i++, j--) { |
| 1401 std::swap(pTempBuffer[i], pTempBuffer[j]); | 1371 std::swap(pTempBuffer[i], pTempBuffer[j]); |
| 1402 } | 1372 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1469 CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, | 1439 CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, |
| 1470 Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top)); | 1440 Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top)); |
| 1471 } | 1441 } |
| 1472 PAGECHAR_INFO generateChar; | 1442 PAGECHAR_INFO generateChar; |
| 1473 if (result == 1) { | 1443 if (result == 1) { |
| 1474 if (GenerateCharInfo(TEXT_BLANK_CHAR, generateChar)) { | 1444 if (GenerateCharInfo(TEXT_BLANK_CHAR, generateChar)) { |
| 1475 if (!formMatrix.IsIdentity()) { | 1445 if (!formMatrix.IsIdentity()) { |
| 1476 generateChar.m_Matrix.Copy(formMatrix); | 1446 generateChar.m_Matrix.Copy(formMatrix); |
| 1477 } | 1447 } |
| 1478 m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR); | 1448 m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR); |
| 1479 m_TempCharList.Add(generateChar); | 1449 m_TempCharList.push_back(generateChar); |
| 1480 } | 1450 } |
| 1481 } else if (result == 2) { | 1451 } else if (result == 2) { |
| 1482 CloseTempLine(); | 1452 CloseTempLine(); |
| 1483 if (m_TextBuf.GetSize()) { | 1453 if (m_TextBuf.GetSize()) { |
| 1484 if (GenerateCharInfo(TEXT_RETURN_CHAR, generateChar)) { | 1454 if (GenerateCharInfo(TEXT_RETURN_CHAR, generateChar)) { |
| 1485 m_TextBuf.AppendChar(TEXT_RETURN_CHAR); | 1455 m_TextBuf.AppendChar(TEXT_RETURN_CHAR); |
| 1486 if (!formMatrix.IsIdentity()) { | 1456 if (!formMatrix.IsIdentity()) { |
| 1487 generateChar.m_Matrix.Copy(formMatrix); | 1457 generateChar.m_Matrix.Copy(formMatrix); |
| 1488 } | 1458 } |
| 1489 m_charList.Add(generateChar); | 1459 m_CharList.push_back(generateChar); |
| 1490 } | 1460 } |
| 1491 if (GenerateCharInfo(TEXT_LINEFEED_CHAR, generateChar)) { | 1461 if (GenerateCharInfo(TEXT_LINEFEED_CHAR, generateChar)) { |
| 1492 m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR); | 1462 m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR); |
| 1493 if (!formMatrix.IsIdentity()) { | 1463 if (!formMatrix.IsIdentity()) { |
| 1494 generateChar.m_Matrix.Copy(formMatrix); | 1464 generateChar.m_Matrix.Copy(formMatrix); |
| 1495 } | 1465 } |
| 1496 m_charList.Add(generateChar); | 1466 m_CharList.push_back(generateChar); |
| 1497 } | 1467 } |
| 1498 } | 1468 } |
| 1499 } else if (result == 3) { | 1469 } else if (result == 3) { |
| 1500 int32_t nChars = pTextObj->CountChars(); | 1470 int32_t nChars = pTextObj->CountChars(); |
| 1501 if (nChars == 1) { | 1471 if (nChars == 1) { |
| 1502 CPDF_TextObjectItem item; | 1472 CPDF_TextObjectItem item; |
| 1503 pTextObj->GetCharInfo(0, &item); | 1473 pTextObj->GetCharInfo(0, &item); |
| 1504 CFX_WideString wstrItem = | 1474 CFX_WideString wstrItem = |
| 1505 pTextObj->GetFont()->UnicodeFromCharCode(item.m_CharCode); | 1475 pTextObj->GetFont()->UnicodeFromCharCode(item.m_CharCode); |
| 1506 if (wstrItem.IsEmpty()) { | 1476 if (wstrItem.IsEmpty()) { |
| 1507 wstrItem += (FX_WCHAR)item.m_CharCode; | 1477 wstrItem += (FX_WCHAR)item.m_CharCode; |
| 1508 } | 1478 } |
| 1509 FX_WCHAR curChar = wstrItem.GetAt(0); | 1479 FX_WCHAR curChar = wstrItem.GetAt(0); |
| 1510 if (0x2D == curChar || 0xAD == curChar) { | 1480 if (0x2D == curChar || 0xAD == curChar) { |
| 1511 return; | 1481 return; |
| 1512 } | 1482 } |
| 1513 } | 1483 } |
| 1514 while (m_TempTextBuf.GetSize() > 0 && | 1484 while (m_TempTextBuf.GetSize() > 0 && |
| 1515 m_TempTextBuf.GetWideString().GetAt(m_TempTextBuf.GetLength() - | 1485 m_TempTextBuf.GetWideString().GetAt(m_TempTextBuf.GetLength() - |
| 1516 1) == 0x20) { | 1486 1) == 0x20) { |
| 1517 m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); | 1487 m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); |
| 1518 m_TempCharList.Delete(m_TempCharList.GetSize() - 1); | 1488 m_TempCharList.pop_back(); |
| 1519 } | 1489 } |
| 1520 PAGECHAR_INFO* cha = | 1490 PAGECHAR_INFO* charinfo = &m_TempCharList.back(); |
| 1521 (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1); | |
| 1522 m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); | 1491 m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); |
| 1523 cha->m_Unicode = 0x2; | 1492 charinfo->m_Unicode = 0x2; |
| 1524 cha->m_Flag = FPDFTEXT_CHAR_HYPHEN; | 1493 charinfo->m_Flag = FPDFTEXT_CHAR_HYPHEN; |
| 1525 m_TempTextBuf.AppendChar(0xfffe); | 1494 m_TempTextBuf.AppendChar(0xfffe); |
| 1526 } | 1495 } |
| 1527 } else { | 1496 } else { |
| 1528 m_CurlineRect = | 1497 m_CurlineRect = |
| 1529 CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, | 1498 CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, |
| 1530 Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top); | 1499 Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top); |
| 1531 } | 1500 } |
| 1532 if (FPDFTEXT_MC_DELAY == bPreMKC) { | 1501 if (FPDFTEXT_MC_DELAY == bPreMKC) { |
| 1533 ProcessMarkedContent(Obj); | 1502 ProcessMarkedContent(Obj); |
| 1534 m_pPreTextObj = pTextObj; | 1503 m_pPreTextObj = pTextObj; |
| 1535 m_perMatrix.Copy(formMatrix); | 1504 m_perMatrix.Copy(formMatrix); |
| 1536 return; | 1505 return; |
| 1537 } | 1506 } |
| 1538 m_pPreTextObj = pTextObj; | 1507 m_pPreTextObj = pTextObj; |
| 1539 m_perMatrix.Copy(formMatrix); | 1508 m_perMatrix.Copy(formMatrix); |
| 1540 int nItems = pTextObj->CountItems(); | 1509 int nItems = pTextObj->CountItems(); |
| 1541 FX_FLOAT baseSpace = _CalculateBaseSpace(pTextObj, matrix); | 1510 FX_FLOAT baseSpace = _CalculateBaseSpace(pTextObj, matrix); |
| 1542 | 1511 |
| 1543 const FX_BOOL bR2L = IsRightToLeft(pTextObj, pFont, nItems); | 1512 const FX_BOOL bR2L = IsRightToLeft(pTextObj, pFont, nItems); |
| 1544 const FX_BOOL bIsBidiAndMirrorInverse = | 1513 const FX_BOOL bIsBidiAndMirrorInverse = |
| 1545 bR2L && (matrix.a * matrix.d - matrix.b * matrix.c) < 0; | 1514 bR2L && (matrix.a * matrix.d - matrix.b * matrix.c) < 0; |
| 1546 int32_t iBufStartAppend = m_TempTextBuf.GetLength(); | 1515 int32_t iBufStartAppend = m_TempTextBuf.GetLength(); |
| 1547 int32_t iCharListStartAppend = m_TempCharList.GetSize(); | 1516 int32_t iCharListStartAppend = |
| 1517 pdfium::CollectionSize<int32_t>(m_TempCharList); |
| 1548 | 1518 |
| 1549 FX_FLOAT spacing = 0; | 1519 FX_FLOAT spacing = 0; |
| 1550 for (int i = 0; i < nItems; i++) { | 1520 for (int i = 0; i < nItems; i++) { |
| 1551 CPDF_TextObjectItem item; | 1521 CPDF_TextObjectItem item; |
| 1552 PAGECHAR_INFO charinfo; | 1522 PAGECHAR_INFO charinfo; |
| 1553 charinfo.m_OriginX = 0; | 1523 charinfo.m_OriginX = 0; |
| 1554 charinfo.m_OriginY = 0; | 1524 charinfo.m_OriginY = 0; |
| 1555 pTextObj->GetItemInfo(i, &item); | 1525 pTextObj->GetItemInfo(i, &item); |
| 1556 if (item.m_CharCode == (FX_DWORD)-1) { | 1526 if (item.m_CharCode == (FX_DWORD)-1) { |
| 1557 CFX_WideString str = m_TempTextBuf.GetWideString(); | 1527 CFX_WideString str = m_TempTextBuf.GetWideString(); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1599 charinfo.m_pTextObj = pTextObj; | 1569 charinfo.m_pTextObj = pTextObj; |
| 1600 charinfo.m_Index = m_TextBuf.GetLength(); | 1570 charinfo.m_Index = m_TextBuf.GetLength(); |
| 1601 m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR); | 1571 m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR); |
| 1602 charinfo.m_CharCode = -1; | 1572 charinfo.m_CharCode = -1; |
| 1603 charinfo.m_Matrix.Copy(formMatrix); | 1573 charinfo.m_Matrix.Copy(formMatrix); |
| 1604 matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, | 1574 matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, |
| 1605 charinfo.m_OriginY); | 1575 charinfo.m_OriginY); |
| 1606 charinfo.m_CharBox = | 1576 charinfo.m_CharBox = |
| 1607 CFX_FloatRect(charinfo.m_OriginX, charinfo.m_OriginY, | 1577 CFX_FloatRect(charinfo.m_OriginX, charinfo.m_OriginY, |
| 1608 charinfo.m_OriginX, charinfo.m_OriginY); | 1578 charinfo.m_OriginX, charinfo.m_OriginY); |
| 1609 m_TempCharList.Add(charinfo); | 1579 m_TempCharList.push_back(charinfo); |
| 1610 } | 1580 } |
| 1611 if (item.m_CharCode == (FX_DWORD)-1) { | 1581 if (item.m_CharCode == (FX_DWORD)-1) { |
| 1612 continue; | 1582 continue; |
| 1613 } | 1583 } |
| 1614 } | 1584 } |
| 1615 spacing = 0; | 1585 spacing = 0; |
| 1616 CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode); | 1586 CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode); |
| 1617 FX_BOOL bNoUnicode = FALSE; | 1587 FX_BOOL bNoUnicode = FALSE; |
| 1618 FX_WCHAR wChar = wstrItem.GetAt(0); | 1588 FX_WCHAR wChar = wstrItem.GetAt(0); |
| 1619 if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) { | 1589 if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1651 charinfo.m_CharBox.bottom + pTextObj->GetFontSize(); | 1621 charinfo.m_CharBox.bottom + pTextObj->GetFontSize(); |
| 1652 } | 1622 } |
| 1653 if (fabsf(charinfo.m_CharBox.right - charinfo.m_CharBox.left) < 0.01f) { | 1623 if (fabsf(charinfo.m_CharBox.right - charinfo.m_CharBox.left) < 0.01f) { |
| 1654 charinfo.m_CharBox.right = | 1624 charinfo.m_CharBox.right = |
| 1655 charinfo.m_CharBox.left + pTextObj->GetCharWidth(charinfo.m_CharCode); | 1625 charinfo.m_CharBox.left + pTextObj->GetCharWidth(charinfo.m_CharCode); |
| 1656 } | 1626 } |
| 1657 matrix.TransformRect(charinfo.m_CharBox); | 1627 matrix.TransformRect(charinfo.m_CharBox); |
| 1658 charinfo.m_Matrix.Copy(matrix); | 1628 charinfo.m_Matrix.Copy(matrix); |
| 1659 if (wstrItem.IsEmpty()) { | 1629 if (wstrItem.IsEmpty()) { |
| 1660 charinfo.m_Unicode = 0; | 1630 charinfo.m_Unicode = 0; |
| 1661 m_TempCharList.Add(charinfo); | 1631 m_TempCharList.push_back(charinfo); |
| 1662 m_TempTextBuf.AppendChar(0xfffe); | 1632 m_TempTextBuf.AppendChar(0xfffe); |
| 1663 continue; | 1633 continue; |
| 1664 } else { | 1634 } else { |
| 1665 int nTotal = wstrItem.GetLength(); | 1635 int nTotal = wstrItem.GetLength(); |
| 1666 FX_BOOL bDel = FALSE; | 1636 FX_BOOL bDel = FALSE; |
| 1667 const int count = std::min(m_TempCharList.GetSize(), 7); | 1637 const int count = |
| 1638 std::min(pdfium::CollectionSize<int>(m_TempCharList), 7); |
| 1668 FX_FLOAT threshold = charinfo.m_Matrix.TransformXDistance( | 1639 FX_FLOAT threshold = charinfo.m_Matrix.TransformXDistance( |
| 1669 (FX_FLOAT)TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize()); | 1640 (FX_FLOAT)TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize()); |
| 1670 for (int n = m_TempCharList.GetSize(); | 1641 for (int n = pdfium::CollectionSize<int>(m_TempCharList); |
| 1671 n > m_TempCharList.GetSize() - count; n--) { | 1642 n > pdfium::CollectionSize<int>(m_TempCharList) - count; n--) { |
| 1672 PAGECHAR_INFO* charinfo1 = (PAGECHAR_INFO*)m_TempCharList.GetAt(n - 1); | 1643 const PAGECHAR_INFO& charinfo1 = m_TempCharList[n - 1]; |
| 1673 if (charinfo1->m_CharCode == charinfo.m_CharCode && | 1644 if (charinfo1.m_CharCode == charinfo.m_CharCode && |
| 1674 charinfo1->m_pTextObj->GetFont() == | 1645 charinfo1.m_pTextObj->GetFont() == charinfo.m_pTextObj->GetFont() && |
| 1675 charinfo.m_pTextObj->GetFont() && | 1646 FXSYS_fabs(charinfo1.m_OriginX - charinfo.m_OriginX) < threshold && |
| 1676 FXSYS_fabs(charinfo1->m_OriginX - charinfo.m_OriginX) < threshold && | 1647 FXSYS_fabs(charinfo1.m_OriginY - charinfo.m_OriginY) < threshold) { |
| 1677 FXSYS_fabs(charinfo1->m_OriginY - charinfo.m_OriginY) < threshold) { | |
| 1678 bDel = TRUE; | 1648 bDel = TRUE; |
| 1679 break; | 1649 break; |
| 1680 } | 1650 } |
| 1681 } | 1651 } |
| 1682 if (!bDel) { | 1652 if (!bDel) { |
| 1683 for (int nIndex = 0; nIndex < nTotal; nIndex++) { | 1653 for (int nIndex = 0; nIndex < nTotal; nIndex++) { |
| 1684 charinfo.m_Unicode = wstrItem.GetAt(nIndex); | 1654 charinfo.m_Unicode = wstrItem.GetAt(nIndex); |
| 1685 if (charinfo.m_Unicode) { | 1655 if (charinfo.m_Unicode) { |
| 1686 charinfo.m_Index = m_TextBuf.GetLength(); | 1656 charinfo.m_Index = m_TextBuf.GetLength(); |
| 1687 m_TempTextBuf.AppendChar(charinfo.m_Unicode); | 1657 m_TempTextBuf.AppendChar(charinfo.m_Unicode); |
| 1688 } else { | 1658 } else { |
| 1689 m_TempTextBuf.AppendChar(0xfffe); | 1659 m_TempTextBuf.AppendChar(0xfffe); |
| 1690 } | 1660 } |
| 1691 m_TempCharList.Add(charinfo); | 1661 m_TempCharList.push_back(charinfo); |
| 1692 } | 1662 } |
| 1693 } else if (i == 0) { | 1663 } else if (i == 0) { |
| 1694 CFX_WideString str = m_TempTextBuf.GetWideString(); | 1664 CFX_WideString str = m_TempTextBuf.GetWideString(); |
| 1695 if (!str.IsEmpty() && | 1665 if (!str.IsEmpty() && |
| 1696 str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) { | 1666 str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) { |
| 1697 m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); | 1667 m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); |
| 1698 m_TempCharList.Delete(m_TempCharList.GetSize() - 1); | 1668 m_TempCharList.pop_back(); |
| 1699 } | 1669 } |
| 1700 } | 1670 } |
| 1701 } | 1671 } |
| 1702 } | 1672 } |
| 1703 if (bIsBidiAndMirrorInverse) { | 1673 if (bIsBidiAndMirrorInverse) { |
| 1704 SwapTempTextBuf(iCharListStartAppend, iBufStartAppend); | 1674 SwapTempTextBuf(iCharListStartAppend, iBufStartAppend); |
| 1705 } | 1675 } |
| 1706 } | 1676 } |
| 1707 int32_t CPDF_TextPage::GetTextObjectWritingMode( | 1677 int32_t CPDF_TextPage::GetTextObjectWritingMode( |
| 1708 const CPDF_TextObject* pTextObj) { | 1678 const CPDF_TextObject* pTextObj) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1747 if (0x2D == wcTmp || 0xAD == wcTmp) { | 1717 if (0x2D == wcTmp || 0xAD == wcTmp) { |
| 1748 if (--nIndex > 0) { | 1718 if (--nIndex > 0) { |
| 1749 FX_WCHAR preChar = strCurText.GetAt((nIndex)); | 1719 FX_WCHAR preChar = strCurText.GetAt((nIndex)); |
| 1750 if (((preChar >= L'A' && preChar <= L'Z') || | 1720 if (((preChar >= L'A' && preChar <= L'Z') || |
| 1751 (preChar >= L'a' && preChar <= L'z')) && | 1721 (preChar >= L'a' && preChar <= L'z')) && |
| 1752 ((curChar >= L'A' && curChar <= L'Z') || | 1722 ((curChar >= L'A' && curChar <= L'Z') || |
| 1753 (curChar >= L'a' && curChar <= L'z'))) { | 1723 (curChar >= L'a' && curChar <= L'z'))) { |
| 1754 return TRUE; | 1724 return TRUE; |
| 1755 } | 1725 } |
| 1756 } | 1726 } |
| 1757 int size = m_TempCharList.GetSize(); | 1727 const PAGECHAR_INFO* preInfo; |
| 1758 PAGECHAR_INFO preChar; | 1728 if (!m_TempCharList.empty()) { |
| 1759 if (size) { | 1729 preInfo = &m_TempCharList.back(); |
| 1760 preChar = (PAGECHAR_INFO)m_TempCharList[size - 1]; | 1730 } else if (!m_CharList.empty()) { |
| 1731 preInfo = &m_CharList.back(); |
| 1761 } else { | 1732 } else { |
| 1762 size = m_charList.GetSize(); | 1733 return FALSE; |
| 1763 if (size == 0) { | |
| 1764 return FALSE; | |
| 1765 } | |
| 1766 preChar = (PAGECHAR_INFO)m_charList[size - 1]; | |
| 1767 } | 1734 } |
| 1768 if (FPDFTEXT_CHAR_PIECE == preChar.m_Flag && | 1735 if (FPDFTEXT_CHAR_PIECE == preInfo->m_Flag && |
| 1769 (0xAD == preChar.m_Unicode || 0x2D == preChar.m_Unicode)) { | 1736 (0xAD == preInfo->m_Unicode || 0x2D == preInfo->m_Unicode)) { |
| 1770 return TRUE; | 1737 return TRUE; |
| 1771 } | 1738 } |
| 1772 } | 1739 } |
| 1773 return FALSE; | 1740 return FALSE; |
| 1774 } | 1741 } |
| 1775 int CPDF_TextPage::ProcessInsertObject(const CPDF_TextObject* pObj, | 1742 int CPDF_TextPage::ProcessInsertObject(const CPDF_TextObject* pObj, |
| 1776 const CFX_Matrix& formMatrix) { | 1743 const CFX_Matrix& formMatrix) { |
| 1777 FindPreviousTextObject(); | 1744 FindPreviousTextObject(); |
| 1778 FX_BOOL bNewline = FALSE; | 1745 FX_BOOL bNewline = FALSE; |
| 1779 int WritingMode = GetTextObjectWritingMode(pObj); | 1746 int WritingMode = GetTextObjectWritingMode(pObj); |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1932 CPDF_TextObject* pTextObj2) { | 1899 CPDF_TextObject* pTextObj2) { |
| 1933 if (!pTextObj1 || !pTextObj2) { | 1900 if (!pTextObj1 || !pTextObj2) { |
| 1934 return FALSE; | 1901 return FALSE; |
| 1935 } | 1902 } |
| 1936 CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, | 1903 CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, |
| 1937 pTextObj2->m_Right, pTextObj2->m_Top); | 1904 pTextObj2->m_Right, pTextObj2->m_Top); |
| 1938 CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, | 1905 CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, |
| 1939 pTextObj1->m_Right, pTextObj1->m_Top); | 1906 pTextObj1->m_Right, pTextObj1->m_Top); |
| 1940 if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) { | 1907 if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) { |
| 1941 FX_FLOAT dbXdif = FXSYS_fabs(rcPreObj.left - rcCurObj.left); | 1908 FX_FLOAT dbXdif = FXSYS_fabs(rcPreObj.left - rcCurObj.left); |
| 1942 int nCount = m_charList.GetSize(); | 1909 size_t nCount = m_CharList.size(); |
| 1943 if (nCount >= 2) { | 1910 if (nCount >= 2) { |
| 1944 PAGECHAR_INFO perCharTemp = (PAGECHAR_INFO)m_charList[nCount - 2]; | 1911 PAGECHAR_INFO perCharTemp = m_CharList[nCount - 2]; |
| 1945 FX_FLOAT dbSpace = perCharTemp.m_CharBox.Width(); | 1912 FX_FLOAT dbSpace = perCharTemp.m_CharBox.Width(); |
| 1946 if (dbXdif > dbSpace) { | 1913 if (dbXdif > dbSpace) { |
| 1947 return FALSE; | 1914 return FALSE; |
| 1948 } | 1915 } |
| 1949 } | 1916 } |
| 1950 } | 1917 } |
| 1951 if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) { | 1918 if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) { |
| 1952 rcPreObj.Intersect(rcCurObj); | 1919 rcPreObj.Intersect(rcCurObj); |
| 1953 if (rcPreObj.IsEmpty()) { | 1920 if (rcPreObj.IsEmpty()) { |
| 1954 return FALSE; | 1921 return FALSE; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2005 } | 1972 } |
| 2006 if (IsSameTextObject((CPDF_TextObject*)pObj, pTextObj)) { | 1973 if (IsSameTextObject((CPDF_TextObject*)pObj, pTextObj)) { |
| 2007 return TRUE; | 1974 return TRUE; |
| 2008 } | 1975 } |
| 2009 i++; | 1976 i++; |
| 2010 } | 1977 } |
| 2011 return FALSE; | 1978 return FALSE; |
| 2012 } | 1979 } |
| 2013 | 1980 |
| 2014 FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info) { | 1981 FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info) { |
| 2015 int size = m_TempCharList.GetSize(); | 1982 const PAGECHAR_INFO* preChar; |
| 2016 PAGECHAR_INFO preChar; | 1983 if (!m_TempCharList.empty()) { |
| 2017 if (size) { | 1984 preChar = &m_TempCharList.back(); |
| 2018 preChar = (PAGECHAR_INFO)m_TempCharList[size - 1]; | 1985 } else if (!m_CharList.empty()) { |
| 1986 preChar = &m_CharList.back(); |
| 2019 } else { | 1987 } else { |
| 2020 size = m_charList.GetSize(); | 1988 return FALSE; |
| 2021 if (size == 0) { | |
| 2022 return FALSE; | |
| 2023 } | |
| 2024 preChar = (PAGECHAR_INFO)m_charList[size - 1]; | |
| 2025 } | 1989 } |
| 2026 info.m_Index = m_TextBuf.GetLength(); | 1990 info.m_Index = m_TextBuf.GetLength(); |
| 2027 info.m_Unicode = unicode; | 1991 info.m_Unicode = unicode; |
| 2028 info.m_pTextObj = NULL; | 1992 info.m_pTextObj = NULL; |
| 2029 info.m_CharCode = -1; | 1993 info.m_CharCode = -1; |
| 2030 info.m_Flag = FPDFTEXT_CHAR_GENERATED; | 1994 info.m_Flag = FPDFTEXT_CHAR_GENERATED; |
| 2031 int preWidth = 0; | 1995 int preWidth = 0; |
| 2032 if (preChar.m_pTextObj && preChar.m_CharCode != (FX_DWORD)-1) | 1996 if (preChar->m_pTextObj && preChar->m_CharCode != (FX_DWORD)-1) |
| 2033 preWidth = GetCharWidth(preChar.m_CharCode, preChar.m_pTextObj->GetFont()); | 1997 preWidth = |
| 1998 GetCharWidth(preChar->m_CharCode, preChar->m_pTextObj->GetFont()); |
| 2034 | 1999 |
| 2035 FX_FLOAT fFontSize = preChar.m_pTextObj ? preChar.m_pTextObj->GetFontSize() | 2000 FX_FLOAT fFontSize = preChar->m_pTextObj ? preChar->m_pTextObj->GetFontSize() |
| 2036 : preChar.m_CharBox.Height(); | 2001 : preChar->m_CharBox.Height(); |
| 2037 if (!fFontSize) | 2002 if (!fFontSize) |
| 2038 fFontSize = kDefaultFontSize; | 2003 fFontSize = kDefaultFontSize; |
| 2039 | 2004 |
| 2040 info.m_OriginX = preChar.m_OriginX + preWidth * (fFontSize) / 1000; | 2005 info.m_OriginX = preChar->m_OriginX + preWidth * (fFontSize) / 1000; |
| 2041 info.m_OriginY = preChar.m_OriginY; | 2006 info.m_OriginY = preChar->m_OriginY; |
| 2042 info.m_CharBox = CFX_FloatRect(info.m_OriginX, info.m_OriginY, info.m_OriginX, | 2007 info.m_CharBox = CFX_FloatRect(info.m_OriginX, info.m_OriginY, info.m_OriginX, |
| 2043 info.m_OriginY); | 2008 info.m_OriginY); |
| 2044 return TRUE; | 2009 return TRUE; |
| 2045 } | 2010 } |
| 2046 | 2011 |
| 2047 FX_BOOL CPDF_TextPage::IsRectIntersect(const CFX_FloatRect& rect1, | 2012 FX_BOOL CPDF_TextPage::IsRectIntersect(const CFX_FloatRect& rect1, |
| 2048 const CFX_FloatRect& rect2) { | 2013 const CFX_FloatRect& rect2) { |
| 2049 CFX_FloatRect rect = rect1; | 2014 CFX_FloatRect rect = rect1; |
| 2050 rect.Intersect(rect2); | 2015 rect.Intersect(rect2); |
| 2051 return !rect.IsEmpty(); | 2016 return !rect.IsEmpty(); |
| (...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2669 if (!m_bIsParsed || index < 0 || index >= m_LinkList.GetSize()) { | 2634 if (!m_bIsParsed || index < 0 || index >= m_LinkList.GetSize()) { |
| 2670 return; | 2635 return; |
| 2671 } | 2636 } |
| 2672 CPDF_LinkExt* link = NULL; | 2637 CPDF_LinkExt* link = NULL; |
| 2673 link = m_LinkList.GetAt(index); | 2638 link = m_LinkList.GetAt(index); |
| 2674 if (!link) { | 2639 if (!link) { |
| 2675 return; | 2640 return; |
| 2676 } | 2641 } |
| 2677 m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects); | 2642 m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects); |
| 2678 } | 2643 } |
| OLD | NEW |