Chromium Code Reviews| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <cctype> | 8 #include <cctype> |
| 9 #include <cwctype> | 9 #include <cwctype> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 104 #define TEXT_LINEFEED_CHAR L'\n' | 104 #define TEXT_LINEFEED_CHAR L'\n' |
| 105 #define TEXT_RETURN_CHAR L'\r' | 105 #define TEXT_RETURN_CHAR L'\r' |
| 106 #define TEXT_EMPTY L"" | 106 #define TEXT_EMPTY L"" |
| 107 #define TEXT_BLANK L" " | 107 #define TEXT_BLANK L" " |
| 108 #define TEXT_RETURN_LINEFEED L"\r\n" | 108 #define TEXT_RETURN_LINEFEED L"\r\n" |
| 109 #define TEXT_LINEFEED L"\n" | 109 #define TEXT_LINEFEED L"\n" |
| 110 #define TEXT_CHARRATIO_GAPDELTA 0.070 | 110 #define TEXT_CHARRATIO_GAPDELTA 0.070 |
| 111 | 111 |
| 112 CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, int flags) | 112 CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, int flags) |
| 113 : m_pPage(pPage), | 113 : m_pPage(pPage), |
| 114 m_charList(512), | |
| 115 m_TempCharList(50), | |
| 116 m_parserflag(flags), | 114 m_parserflag(flags), |
| 117 m_pPreTextObj(nullptr), | 115 m_pPreTextObj(nullptr), |
| 118 m_bIsParsed(false), | 116 m_bIsParsed(false), |
| 119 m_TextlineDir(-1), | 117 m_TextlineDir(-1), |
| 120 m_CurlineRect(0, 0, 0, 0) { | 118 m_CurlineRect(0, 0, 0, 0) { |
| 121 m_TextBuf.EstimateSize(0, 10240); | 119 m_TextBuf.EstimateSize(0, 10240); |
| 122 pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int)pPage->GetPageWidth(), | 120 pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int)pPage->GetPageWidth(), |
| 123 (int)pPage->GetPageHeight(), 0); | 121 (int)pPage->GetPageHeight(), 0); |
| 124 } | 122 } |
| 125 | 123 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 140 default: | 138 default: |
| 141 return false; | 139 return false; |
| 142 } | 140 } |
| 143 } | 141 } |
| 144 FX_BOOL CPDF_TextPage::ParseTextPage() { | 142 FX_BOOL CPDF_TextPage::ParseTextPage() { |
| 145 m_bIsParsed = false; | 143 m_bIsParsed = false; |
| 146 if (!m_pPage) | 144 if (!m_pPage) |
| 147 return FALSE; | 145 return FALSE; |
| 148 | 146 |
| 149 m_TextBuf.Clear(); | 147 m_TextBuf.Clear(); |
| 150 m_charList.RemoveAll(); | 148 m_CharList.clear(); |
| 151 m_pPreTextObj = NULL; | 149 m_pPreTextObj = NULL; |
| 152 ProcessObject(); | 150 ProcessObject(); |
| 153 m_bIsParsed = true; | 151 m_bIsParsed = true; |
| 154 if (!m_ParseOptions.m_bGetCharCodeOnly) { | 152 if (!m_ParseOptions.m_bGetCharCodeOnly) { |
| 155 m_CharIndex.RemoveAll(); | 153 m_CharIndex.RemoveAll(); |
| 156 int nCount = m_charList.GetSize(); | 154 int nCount = m_CharList.size(); |
| 157 if (nCount) { | 155 if (nCount) { |
| 158 m_CharIndex.Add(0); | 156 m_CharIndex.Add(0); |
| 159 } | 157 } |
| 160 for (int i = 0; i < nCount; i++) { | 158 for (int i = 0; i < nCount; i++) { |
| 161 int indexSize = m_CharIndex.GetSize(); | 159 int indexSize = m_CharIndex.GetSize(); |
| 162 FX_BOOL bNormal = FALSE; | 160 FX_BOOL bNormal = FALSE; |
| 163 PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(i); | 161 PAGECHAR_INFO charinfo = m_CharList[i]; |
| 164 if (charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) { | 162 if (charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) { |
| 165 bNormal = TRUE; | 163 bNormal = TRUE; |
| 166 } else if (charinfo.m_Unicode == 0 || IsControlChar(charinfo)) { | 164 } else if (charinfo.m_Unicode == 0 || IsControlChar(charinfo)) { |
| 167 bNormal = FALSE; | 165 bNormal = FALSE; |
| 168 } else { | 166 } else { |
| 169 bNormal = TRUE; | 167 bNormal = TRUE; |
| 170 } | 168 } |
| 171 if (bNormal) { | 169 if (bNormal) { |
| 172 if (indexSize % 2) { | 170 if (indexSize % 2) { |
| 173 m_CharIndex.Add(1); | 171 m_CharIndex.Add(1); |
| 174 } else { | 172 } else { |
| 175 if (indexSize <= 0) { | 173 if (indexSize <= 0) { |
| 176 continue; | 174 continue; |
| 177 } | 175 } |
| 178 m_CharIndex.SetAt(indexSize - 1, | 176 m_CharIndex.SetAt(indexSize - 1, |
| 179 m_CharIndex.GetAt(indexSize - 1) + 1); | 177 m_CharIndex.GetAt(indexSize - 1) + 1); |
| 180 } | 178 } |
| 181 } else { | 179 } else { |
| 182 if (indexSize % 2) { | 180 if (indexSize % 2) { |
| 183 if (indexSize <= 0) { | 181 if (indexSize <= 0) { |
| 184 continue; | 182 continue; |
| 185 } | 183 } |
| 186 m_CharIndex.SetAt(indexSize - 1, i + 1); | 184 m_CharIndex.SetAt(indexSize - 1, i + 1); |
|
Tom Sepez
2016/01/22 20:52:05
For instance, m_CharIndex is a "word array" (array
| |
| 187 } else { | 185 } else { |
| 188 m_CharIndex.Add(i + 1); | 186 m_CharIndex.Add(i + 1); |
| 189 } | 187 } |
| 190 } | 188 } |
| 191 } | 189 } |
| 192 int indexSize = m_CharIndex.GetSize(); | 190 int indexSize = m_CharIndex.GetSize(); |
| 193 if (indexSize % 2) { | 191 if (indexSize % 2) { |
| 194 m_CharIndex.RemoveAt(indexSize - 1); | 192 m_CharIndex.RemoveAt(indexSize - 1); |
| 195 } | 193 } |
| 196 } | 194 } |
| 197 return TRUE; | 195 return TRUE; |
| 198 } | 196 } |
| 199 int CPDF_TextPage::CountChars() const { | 197 int CPDF_TextPage::CountChars() const { |
| 200 if (m_ParseOptions.m_bGetCharCodeOnly) { | 198 if (m_ParseOptions.m_bGetCharCodeOnly) { |
| 201 return m_TextBuf.GetSize(); | 199 return m_TextBuf.GetSize(); |
| 202 } | 200 } |
| 203 return m_charList.GetSize(); | 201 return m_CharList.size(); |
| 204 } | 202 } |
| 205 int CPDF_TextPage::CharIndexFromTextIndex(int TextIndex) const { | 203 int CPDF_TextPage::CharIndexFromTextIndex(int TextIndex) const { |
| 206 int indexSize = m_CharIndex.GetSize(); | 204 int indexSize = m_CharIndex.GetSize(); |
| 207 int count = 0; | 205 int count = 0; |
| 208 for (int i = 0; i < indexSize; i += 2) { | 206 for (int i = 0; i < indexSize; i += 2) { |
| 209 count += m_CharIndex.GetAt(i + 1); | 207 count += m_CharIndex.GetAt(i + 1); |
| 210 if (count > TextIndex) { | 208 if (count > TextIndex) { |
| 211 return TextIndex - count + m_CharIndex.GetAt(i + 1) + | 209 return TextIndex - count + m_CharIndex.GetAt(i + 1) + |
| 212 m_CharIndex.GetAt(i); | 210 m_CharIndex.GetAt(i); |
| 213 } | 211 } |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 234 CFX_RectArray& rectArray) const { | 232 CFX_RectArray& rectArray) const { |
| 235 if (m_ParseOptions.m_bGetCharCodeOnly) { | 233 if (m_ParseOptions.m_bGetCharCodeOnly) { |
| 236 return; | 234 return; |
| 237 } | 235 } |
| 238 if (start < 0 || nCount == 0) { | 236 if (start < 0 || nCount == 0) { |
| 239 return; | 237 return; |
| 240 } | 238 } |
| 241 if (!m_bIsParsed) { | 239 if (!m_bIsParsed) { |
| 242 return; | 240 return; |
| 243 } | 241 } |
| 244 PAGECHAR_INFO info_curchar; | |
| 245 CPDF_TextObject* pCurObj = NULL; | 242 CPDF_TextObject* pCurObj = NULL; |
| 246 CFX_FloatRect rect; | 243 CFX_FloatRect rect; |
| 247 int curPos = start; | 244 int curPos = start; |
| 248 FX_BOOL flagNewRect = TRUE; | 245 FX_BOOL flagNewRect = TRUE; |
| 249 if (nCount + start > m_charList.GetSize() || nCount == -1) { | 246 if (nCount + start > m_CharList.size() || nCount == -1) { |
| 250 nCount = m_charList.GetSize() - start; | 247 nCount = m_CharList.size() - start; |
| 251 } | 248 } |
| 252 while (nCount--) { | 249 while (nCount--) { |
| 253 info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(curPos++); | 250 PAGECHAR_INFO info_curchar = m_CharList[curPos++]; |
| 254 if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) { | 251 if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) { |
| 255 continue; | 252 continue; |
| 256 } | 253 } |
| 257 if (info_curchar.m_CharBox.Width() < 0.01 || | 254 if (info_curchar.m_CharBox.Width() < 0.01 || |
| 258 info_curchar.m_CharBox.Height() < 0.01) { | 255 info_curchar.m_CharBox.Height() < 0.01) { |
| 259 continue; | 256 continue; |
| 260 } | 257 } |
| 261 if (!pCurObj) { | 258 if (!pCurObj) { |
| 262 pCurObj = info_curchar.m_pTextObj; | 259 pCurObj = info_curchar.m_pTextObj; |
| 263 } | 260 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 320 } | 317 } |
| 321 int CPDF_TextPage::GetIndexAtPos(CPDF_Point point, | 318 int CPDF_TextPage::GetIndexAtPos(CPDF_Point point, |
| 322 FX_FLOAT xTolerance, | 319 FX_FLOAT xTolerance, |
| 323 FX_FLOAT yTolerance) const { | 320 FX_FLOAT yTolerance) const { |
| 324 if (m_ParseOptions.m_bGetCharCodeOnly || !m_bIsParsed) | 321 if (m_ParseOptions.m_bGetCharCodeOnly || !m_bIsParsed) |
| 325 return -3; | 322 return -3; |
| 326 | 323 |
| 327 int pos = 0; | 324 int pos = 0; |
| 328 int NearPos = -1; | 325 int NearPos = -1; |
| 329 double xdif = 5000, ydif = 5000; | 326 double xdif = 5000, ydif = 5000; |
| 330 while (pos < m_charList.GetSize()) { | 327 while (pos < m_CharList.size()) { |
| 331 PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)(m_charList.GetAt(pos)); | 328 PAGECHAR_INFO charinfo = m_CharList[pos]; |
| 332 CFX_FloatRect charrect = charinfo.m_CharBox; | 329 CFX_FloatRect charrect = charinfo.m_CharBox; |
| 333 if (charrect.Contains(point.x, point.y)) { | 330 if (charrect.Contains(point.x, point.y)) { |
| 334 break; | 331 break; |
| 335 } | 332 } |
| 336 if (xTolerance > 0 || yTolerance > 0) { | 333 if (xTolerance > 0 || yTolerance > 0) { |
| 337 CFX_FloatRect charRectExt; | 334 CFX_FloatRect charRectExt; |
| 338 charrect.Normalize(); | 335 charrect.Normalize(); |
| 339 charRectExt.left = charrect.left - xTolerance / 2; | 336 charRectExt.left = charrect.left - xTolerance / 2; |
| 340 charRectExt.right = charrect.right + xTolerance / 2; | 337 charRectExt.right = charrect.right + xTolerance / 2; |
| 341 charRectExt.top = charrect.top + yTolerance / 2; | 338 charRectExt.top = charrect.top + yTolerance / 2; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 352 : FXSYS_fabs(point.y - charrect.top); | 349 : FXSYS_fabs(point.y - charrect.top); |
| 353 if (curYdif + curXdif < xdif + ydif) { | 350 if (curYdif + curXdif < xdif + ydif) { |
| 354 ydif = curYdif; | 351 ydif = curYdif; |
| 355 xdif = curXdif; | 352 xdif = curXdif; |
| 356 NearPos = pos; | 353 NearPos = pos; |
| 357 } | 354 } |
| 358 } | 355 } |
| 359 } | 356 } |
| 360 ++pos; | 357 ++pos; |
| 361 } | 358 } |
| 362 if (pos >= m_charList.GetSize()) { | 359 if (pos >= m_CharList.size()) { |
| 363 pos = NearPos; | 360 pos = NearPos; |
| 364 } | 361 } |
| 365 return pos; | 362 return pos; |
| 366 } | 363 } |
| 367 CFX_WideString CPDF_TextPage::GetTextByRect(const CFX_FloatRect& rect) const { | 364 CFX_WideString CPDF_TextPage::GetTextByRect(const CFX_FloatRect& rect) const { |
| 368 CFX_WideString strText; | 365 CFX_WideString strText; |
| 369 if (m_ParseOptions.m_bGetCharCodeOnly || !m_bIsParsed) | 366 if (m_ParseOptions.m_bGetCharCodeOnly || !m_bIsParsed) |
| 370 return strText; | 367 return strText; |
| 371 | 368 |
| 372 int nCount = m_charList.GetSize(); | 369 int nCount = m_CharList.size(); |
|
Oliver Chang
2016/01/22 20:17:56
could we change this to a size_t?
| |
| 373 int pos = 0; | 370 int pos = 0; |
| 374 FX_FLOAT posy = 0; | 371 FX_FLOAT posy = 0; |
| 375 FX_BOOL IsContainPreChar = FALSE; | 372 FX_BOOL IsContainPreChar = FALSE; |
| 376 FX_BOOL ISAddLineFeed = FALSE; | 373 FX_BOOL ISAddLineFeed = FALSE; |
| 377 while (pos < nCount) { | 374 while (pos < nCount) { |
| 378 PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos++); | 375 PAGECHAR_INFO charinfo = m_CharList[pos++]; |
| 379 if (IsRectIntersect(rect, charinfo.m_CharBox)) { | 376 if (IsRectIntersect(rect, charinfo.m_CharBox)) { |
| 380 if (FXSYS_fabs(posy - charinfo.m_OriginY) > 0 && !IsContainPreChar && | 377 if (FXSYS_fabs(posy - charinfo.m_OriginY) > 0 && !IsContainPreChar && |
| 381 ISAddLineFeed) { | 378 ISAddLineFeed) { |
| 382 posy = charinfo.m_OriginY; | 379 posy = charinfo.m_OriginY; |
| 383 if (strText.GetLength() > 0) { | 380 if (strText.GetLength() > 0) { |
| 384 strText += L"\r\n"; | 381 strText += L"\r\n"; |
| 385 } | 382 } |
| 386 } | 383 } |
| 387 IsContainPreChar = TRUE; | 384 IsContainPreChar = TRUE; |
| 388 ISAddLineFeed = FALSE; | 385 ISAddLineFeed = FALSE; |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 403 return strText; | 400 return strText; |
| 404 } | 401 } |
| 405 void CPDF_TextPage::GetRectsArrayByRect(const CFX_FloatRect& rect, | 402 void CPDF_TextPage::GetRectsArrayByRect(const CFX_FloatRect& rect, |
| 406 CFX_RectArray& resRectArray) const { | 403 CFX_RectArray& resRectArray) const { |
| 407 if (m_ParseOptions.m_bGetCharCodeOnly || !m_bIsParsed) | 404 if (m_ParseOptions.m_bGetCharCodeOnly || !m_bIsParsed) |
| 408 return; | 405 return; |
| 409 | 406 |
| 410 CFX_FloatRect curRect; | 407 CFX_FloatRect curRect; |
| 411 FX_BOOL flagNewRect = TRUE; | 408 FX_BOOL flagNewRect = TRUE; |
| 412 CPDF_TextObject* pCurObj = NULL; | 409 CPDF_TextObject* pCurObj = NULL; |
| 413 int nCount = m_charList.GetSize(); | 410 int nCount = m_CharList.size(); |
|
Oliver Chang
2016/01/22 20:17:56
ditto, many more instances in this file.
| |
| 414 int pos = 0; | 411 int pos = 0; |
| 415 while (pos < nCount) { | 412 while (pos < nCount) { |
| 416 PAGECHAR_INFO info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(pos++); | 413 PAGECHAR_INFO info_curchar = m_CharList[pos++]; |
| 417 if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) { | 414 if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) { |
| 418 continue; | 415 continue; |
| 419 } | 416 } |
| 420 if (IsRectIntersect(rect, info_curchar.m_CharBox)) { | 417 if (IsRectIntersect(rect, info_curchar.m_CharBox)) { |
| 421 if (!pCurObj) { | 418 if (!pCurObj) { |
| 422 pCurObj = info_curchar.m_pTextObj; | 419 pCurObj = info_curchar.m_pTextObj; |
| 423 } | 420 } |
| 424 if (pCurObj != info_curchar.m_pTextObj) { | 421 if (pCurObj != info_curchar.m_pTextObj) { |
| 425 resRectArray.Add(curRect); | 422 resRectArray.Add(curRect); |
| 426 pCurObj = info_curchar.m_pTextObj; | 423 pCurObj = info_curchar.m_pTextObj; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 458 return -3; | 455 return -3; |
| 459 } | 456 } |
| 460 CPDF_Point point(x, y); | 457 CPDF_Point point(x, y); |
| 461 return GetIndexAtPos(point, xTolerance, yTolerance); | 458 return GetIndexAtPos(point, xTolerance, yTolerance); |
| 462 } | 459 } |
| 463 | 460 |
| 464 void CPDF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO* info) const { | 461 void CPDF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO* info) const { |
| 465 if (m_ParseOptions.m_bGetCharCodeOnly || !m_bIsParsed) | 462 if (m_ParseOptions.m_bGetCharCodeOnly || !m_bIsParsed) |
| 466 return; | 463 return; |
| 467 | 464 |
| 468 if (index < 0 || index >= m_charList.GetSize()) | 465 if (index < 0 || index >= m_CharList.size()) |
| 469 return; | 466 return; |
| 470 | 467 |
| 471 const PAGECHAR_INFO* charinfo = | 468 const PAGECHAR_INFO* charinfo = &m_CharList[index]; |
| 472 static_cast<PAGECHAR_INFO*>(m_charList.GetAt(index)); | |
| 473 info->m_Charcode = charinfo->m_CharCode; | 469 info->m_Charcode = charinfo->m_CharCode; |
| 474 info->m_OriginX = charinfo->m_OriginX; | 470 info->m_OriginX = charinfo->m_OriginX; |
| 475 info->m_OriginY = charinfo->m_OriginY; | 471 info->m_OriginY = charinfo->m_OriginY; |
| 476 info->m_Unicode = charinfo->m_Unicode; | 472 info->m_Unicode = charinfo->m_Unicode; |
| 477 info->m_Flag = charinfo->m_Flag; | 473 info->m_Flag = charinfo->m_Flag; |
| 478 info->m_CharBox = charinfo->m_CharBox; | 474 info->m_CharBox = charinfo->m_CharBox; |
| 479 info->m_pTextObj = charinfo->m_pTextObj; | 475 info->m_pTextObj = charinfo->m_pTextObj; |
| 480 if (charinfo->m_pTextObj && charinfo->m_pTextObj->GetFont()) { | 476 if (charinfo->m_pTextObj && charinfo->m_pTextObj->GetFont()) { |
| 481 info->m_FontSize = charinfo->m_pTextObj->GetFontSize(); | 477 info->m_FontSize = charinfo->m_pTextObj->GetFontSize(); |
| 482 } else { | 478 } else { |
| 483 info->m_FontSize = kDefaultFontSize; | 479 info->m_FontSize = kDefaultFontSize; |
| 484 } | 480 } |
| 485 info->m_Matrix.Copy(charinfo->m_Matrix); | 481 info->m_Matrix.Copy(charinfo->m_Matrix); |
| 486 } | 482 } |
| 487 | 483 |
| 488 void CPDF_TextPage::CheckMarkedContentObject(int32_t& start, | 484 void CPDF_TextPage::CheckMarkedContentObject(int32_t& start, |
| 489 int32_t& nCount) const { | 485 int32_t& nCount) const { |
| 490 PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start); | 486 PAGECHAR_INFO charinfo = m_CharList[start]; |
| 491 PAGECHAR_INFO charinfo2 = | 487 PAGECHAR_INFO charinfo2 = m_CharList[start + nCount - 1]; |
| 492 *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1); | |
| 493 if (FPDFTEXT_CHAR_PIECE != charinfo.m_Flag && | 488 if (FPDFTEXT_CHAR_PIECE != charinfo.m_Flag && |
| 494 FPDFTEXT_CHAR_PIECE != charinfo2.m_Flag) { | 489 FPDFTEXT_CHAR_PIECE != charinfo2.m_Flag) { |
| 495 return; | 490 return; |
| 496 } | 491 } |
| 497 if (FPDFTEXT_CHAR_PIECE == charinfo.m_Flag) { | 492 if (FPDFTEXT_CHAR_PIECE == charinfo.m_Flag) { |
| 498 PAGECHAR_INFO charinfo1 = charinfo; | 493 PAGECHAR_INFO charinfo1 = charinfo; |
| 499 int startIndex = start; | 494 int startIndex = start; |
| 500 while (FPDFTEXT_CHAR_PIECE == charinfo1.m_Flag && | 495 while (FPDFTEXT_CHAR_PIECE == charinfo1.m_Flag && |
| 501 charinfo1.m_Index == charinfo.m_Index) { | 496 charinfo1.m_Index == charinfo.m_Index) { |
| 502 startIndex--; | 497 startIndex--; |
| 503 if (startIndex < 0) { | 498 if (startIndex < 0) { |
| 504 break; | 499 break; |
| 505 } | 500 } |
| 506 charinfo1 = *(PAGECHAR_INFO*)m_charList.GetAt(startIndex); | 501 charinfo1 = m_CharList[startIndex]; |
| 507 } | 502 } |
| 508 startIndex++; | 503 startIndex++; |
| 509 start = startIndex; | 504 start = startIndex; |
| 510 } | 505 } |
| 511 if (FPDFTEXT_CHAR_PIECE == charinfo2.m_Flag) { | 506 if (FPDFTEXT_CHAR_PIECE == charinfo2.m_Flag) { |
| 512 PAGECHAR_INFO charinfo3 = charinfo2; | 507 PAGECHAR_INFO charinfo3 = charinfo2; |
| 513 int endIndex = start + nCount - 1; | 508 int endIndex = start + nCount - 1; |
| 514 while (FPDFTEXT_CHAR_PIECE == charinfo3.m_Flag && | 509 while (FPDFTEXT_CHAR_PIECE == charinfo3.m_Flag && |
| 515 charinfo3.m_Index == charinfo2.m_Index) { | 510 charinfo3.m_Index == charinfo2.m_Index) { |
| 516 endIndex++; | 511 endIndex++; |
| 517 if (endIndex >= m_charList.GetSize()) { | 512 if (endIndex >= m_CharList.size()) { |
| 518 break; | 513 break; |
| 519 } | 514 } |
| 520 charinfo3 = *(PAGECHAR_INFO*)m_charList.GetAt(endIndex); | 515 charinfo3 = m_CharList[endIndex]; |
| 521 } | 516 } |
| 522 endIndex--; | 517 endIndex--; |
| 523 nCount = endIndex - start + 1; | 518 nCount = endIndex - start + 1; |
| 524 } | 519 } |
| 525 } | 520 } |
| 526 CFX_WideString CPDF_TextPage::GetPageText(int start, int nCount) const { | 521 CFX_WideString CPDF_TextPage::GetPageText(int start, int nCount) const { |
| 527 if (!m_bIsParsed || nCount == 0) | 522 if (!m_bIsParsed || nCount == 0) |
| 528 return L""; | 523 return L""; |
| 529 | 524 |
| 530 if (start < 0) | 525 if (start < 0) |
| 531 start = 0; | 526 start = 0; |
| 532 | 527 |
| 533 if (nCount == -1) { | 528 if (nCount == -1) { |
| 534 nCount = m_charList.GetSize() - start; | 529 nCount = m_CharList.size() - start; |
| 535 return m_TextBuf.GetWideString().Mid(start, | 530 return m_TextBuf.GetWideString().Mid(start, |
| 536 m_TextBuf.GetWideString().GetLength()); | 531 m_TextBuf.GetWideString().GetLength()); |
| 537 } | 532 } |
| 538 if (nCount <= 0 || m_charList.GetSize() <= 0) { | 533 if (nCount <= 0 || m_CharList.empty()) { |
| 539 return L""; | 534 return L""; |
| 540 } | 535 } |
| 541 if (nCount + start > m_charList.GetSize() - 1) { | 536 if (nCount + start > static_cast<int>(m_CharList.size()) - 1) { |
| 542 nCount = m_charList.GetSize() - start; | 537 nCount = static_cast<int>(m_CharList.size()) - start; |
| 543 } | 538 } |
| 544 if (nCount <= 0) { | 539 if (nCount <= 0) { |
| 545 return L""; | 540 return L""; |
| 546 } | 541 } |
| 547 CheckMarkedContentObject(start, nCount); | 542 CheckMarkedContentObject(start, nCount); |
| 548 int startindex = 0; | 543 int startindex = 0; |
| 549 PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start); | 544 PAGECHAR_INFO charinfo = m_CharList[start]; |
| 550 int startOffset = 0; | 545 int startOffset = 0; |
| 551 while (charinfo.m_Index == -1) { | 546 while (charinfo.m_Index == -1) { |
| 552 startOffset++; | 547 startOffset++; |
| 553 if (startOffset > nCount || start + startOffset >= m_charList.GetSize()) { | 548 if (startOffset > nCount || start + startOffset >= m_CharList.size()) { |
| 554 return L""; | 549 return L""; |
| 555 } | 550 } |
| 556 charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + startOffset); | 551 charinfo = m_CharList[start + startOffset]; |
| 557 } | 552 } |
| 558 startindex = charinfo.m_Index; | 553 startindex = charinfo.m_Index; |
| 559 charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1); | 554 charinfo = m_CharList[start + nCount - 1]; |
| 560 int nCountOffset = 0; | 555 int nCountOffset = 0; |
| 561 while (charinfo.m_Index == -1) { | 556 while (charinfo.m_Index == -1) { |
| 562 nCountOffset++; | 557 nCountOffset++; |
| 563 if (nCountOffset >= nCount) { | 558 if (nCountOffset >= nCount) { |
| 564 return L""; | 559 return L""; |
| 565 } | 560 } |
| 566 charinfo = | 561 charinfo = m_CharList[start + nCount - nCountOffset - 1]; |
| 567 *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - nCountOffset - 1); | |
| 568 } | 562 } |
| 569 nCount = start + nCount - nCountOffset - startindex; | 563 nCount = start + nCount - nCountOffset - startindex; |
| 570 if (nCount <= 0) { | 564 if (nCount <= 0) { |
| 571 return L""; | 565 return L""; |
| 572 } | 566 } |
| 573 return m_TextBuf.GetWideString().Mid(startindex, nCount); | 567 return m_TextBuf.GetWideString().Mid(startindex, nCount); |
| 574 } | 568 } |
| 575 int CPDF_TextPage::CountRects(int start, int nCount) { | 569 int CPDF_TextPage::CountRects(int start, int nCount) { |
| 576 if (m_ParseOptions.m_bGetCharCodeOnly || !m_bIsParsed || start < 0) | 570 if (m_ParseOptions.m_bGetCharCodeOnly || !m_bIsParsed || start < 0) |
| 577 return -1; | 571 return -1; |
| 578 | 572 |
| 579 if (nCount == -1 || nCount + start > m_charList.GetSize()) { | 573 if (nCount == -1 || nCount + start > static_cast<int>(m_CharList.size())) { |
| 580 nCount = m_charList.GetSize() - start; | 574 nCount = static_cast<int>(m_CharList.size()) - start; |
| 581 } | 575 } |
| 582 m_SelRects.RemoveAll(); | 576 m_SelRects.RemoveAll(); |
| 583 GetRectArray(start, nCount, m_SelRects); | 577 GetRectArray(start, nCount, m_SelRects); |
| 584 return m_SelRects.GetSize(); | 578 return m_SelRects.GetSize(); |
| 585 } | 579 } |
| 586 void CPDF_TextPage::GetRect(int rectIndex, | 580 void CPDF_TextPage::GetRect(int rectIndex, |
| 587 FX_FLOAT& left, | 581 FX_FLOAT& left, |
| 588 FX_FLOAT& top, | 582 FX_FLOAT& top, |
| 589 FX_FLOAT& right, | 583 FX_FLOAT& right, |
| 590 FX_FLOAT& bottom) const { | 584 FX_FLOAT& bottom) const { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 671 return GetBaselineRotate(rect, Rotate); | 665 return GetBaselineRotate(rect, Rotate); |
| 672 } | 666 } |
| 673 int CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, | 667 int CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, |
| 674 FX_FLOAT top, | 668 FX_FLOAT top, |
| 675 FX_FLOAT right, | 669 FX_FLOAT right, |
| 676 FX_FLOAT bottom, | 670 FX_FLOAT bottom, |
| 677 FX_BOOL bContains) { | 671 FX_BOOL bContains) { |
| 678 if (m_ParseOptions.m_bGetCharCodeOnly) | 672 if (m_ParseOptions.m_bGetCharCodeOnly) |
| 679 return -1; | 673 return -1; |
| 680 | 674 |
| 681 m_Segment.RemoveAll(); | 675 m_Segments.RemoveAll(); |
| 682 if (!m_bIsParsed) | 676 if (!m_bIsParsed) |
| 683 return -1; | 677 return -1; |
| 684 | 678 |
| 685 CFX_FloatRect rect(left, bottom, right, top); | 679 CFX_FloatRect rect(left, bottom, right, top); |
| 686 rect.Normalize(); | 680 rect.Normalize(); |
| 687 int nCount = m_charList.GetSize(); | 681 int nCount = m_CharList.size(); |
| 688 int pos = 0; | 682 int pos = 0; |
| 689 FPDF_SEGMENT segment; | 683 FPDF_SEGMENT segment; |
| 690 segment.m_Start = 0; | 684 segment.m_Start = 0; |
| 691 segment.m_nCount = 0; | 685 segment.m_nCount = 0; |
| 692 int segmentStatus = 0; | 686 int segmentStatus = 0; |
| 693 FX_BOOL IsContainPreChar = FALSE; | 687 FX_BOOL IsContainPreChar = FALSE; |
| 694 while (pos < nCount) { | 688 while (pos < nCount) { |
| 695 PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos); | 689 PAGECHAR_INFO charinfo = m_CharList[pos]; |
| 696 if (bContains && rect.Contains(charinfo.m_CharBox)) { | 690 if (bContains && rect.Contains(charinfo.m_CharBox)) { |
| 697 if (segmentStatus == 0 || segmentStatus == 2) { | 691 if (segmentStatus == 0 || segmentStatus == 2) { |
| 698 segment.m_Start = pos; | 692 segment.m_Start = pos; |
| 699 segment.m_nCount = 1; | 693 segment.m_nCount = 1; |
| 700 segmentStatus = 1; | 694 segmentStatus = 1; |
| 701 } else if (segmentStatus == 1) { | 695 } else if (segmentStatus == 1) { |
| 702 segment.m_nCount++; | 696 segment.m_nCount++; |
| 703 } | 697 } |
| 704 IsContainPreChar = TRUE; | 698 IsContainPreChar = TRUE; |
| 705 } else if (!bContains && | 699 } else if (!bContains && |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 719 segment.m_Start = pos; | 713 segment.m_Start = pos; |
| 720 segment.m_nCount = 1; | 714 segment.m_nCount = 1; |
| 721 segmentStatus = 1; | 715 segmentStatus = 1; |
| 722 } else if (segmentStatus == 1) { | 716 } else if (segmentStatus == 1) { |
| 723 segment.m_nCount++; | 717 segment.m_nCount++; |
| 724 } | 718 } |
| 725 IsContainPreChar = FALSE; | 719 IsContainPreChar = FALSE; |
| 726 } else { | 720 } else { |
| 727 if (segmentStatus == 1) { | 721 if (segmentStatus == 1) { |
| 728 segmentStatus = 2; | 722 segmentStatus = 2; |
| 729 m_Segment.Add(segment); | 723 m_Segments.Add(segment); |
| 730 segment.m_Start = 0; | 724 segment.m_Start = 0; |
| 731 segment.m_nCount = 0; | 725 segment.m_nCount = 0; |
| 732 } | 726 } |
| 733 } | 727 } |
| 734 } else { | 728 } else { |
| 735 if (segmentStatus == 1) { | 729 if (segmentStatus == 1) { |
| 736 segmentStatus = 2; | 730 segmentStatus = 2; |
| 737 m_Segment.Add(segment); | 731 m_Segments.Add(segment); |
| 738 segment.m_Start = 0; | 732 segment.m_Start = 0; |
| 739 segment.m_nCount = 0; | 733 segment.m_nCount = 0; |
| 740 } | 734 } |
| 741 IsContainPreChar = FALSE; | 735 IsContainPreChar = FALSE; |
| 742 } | 736 } |
| 743 pos++; | 737 pos++; |
| 744 } | 738 } |
| 745 if (segmentStatus == 1) { | 739 if (segmentStatus == 1) { |
| 746 segmentStatus = 2; | 740 segmentStatus = 2; |
| 747 m_Segment.Add(segment); | 741 m_Segments.Add(segment); |
| 748 segment.m_Start = 0; | 742 segment.m_Start = 0; |
| 749 segment.m_nCount = 0; | 743 segment.m_nCount = 0; |
| 750 } | 744 } |
| 751 return m_Segment.GetSize(); | 745 return m_Segments.GetSize(); |
| 752 } | 746 } |
| 753 void CPDF_TextPage::GetBoundedSegment(int index, int& start, int& count) const { | 747 void CPDF_TextPage::GetBoundedSegment(int index, int& start, int& count) const { |
| 754 if (m_ParseOptions.m_bGetCharCodeOnly) { | 748 if (m_ParseOptions.m_bGetCharCodeOnly) { |
| 755 return; | 749 return; |
| 756 } | 750 } |
| 757 if (index < 0 || index >= m_Segment.GetSize()) { | 751 if (index < 0 || index >= m_Segments.GetSize()) { |
| 758 return; | 752 return; |
| 759 } | 753 } |
| 760 start = m_Segment.GetAt(index).m_Start; | 754 start = m_Segments.GetAt(index).m_Start; |
| 761 count = m_Segment.GetAt(index).m_nCount; | 755 count = m_Segments.GetAt(index).m_nCount; |
| 762 } | 756 } |
| 763 int CPDF_TextPage::GetWordBreak(int index, int direction) const { | 757 int CPDF_TextPage::GetWordBreak(int index, int direction) const { |
| 764 if (m_ParseOptions.m_bGetCharCodeOnly || !m_bIsParsed) | 758 if (m_ParseOptions.m_bGetCharCodeOnly || !m_bIsParsed) |
| 765 return -1; | 759 return -1; |
| 766 | 760 |
| 767 if (direction != FPDFTEXT_LEFT && direction != FPDFTEXT_RIGHT) | 761 if (direction != FPDFTEXT_LEFT && direction != FPDFTEXT_RIGHT) |
| 768 return -1; | 762 return -1; |
| 769 | 763 |
| 770 if (index < 0 || index >= m_charList.GetSize()) | 764 if (index < 0 || index >= m_CharList.size()) |
| 771 return -1; | 765 return -1; |
| 772 | 766 |
| 773 PAGECHAR_INFO charinfo; | 767 PAGECHAR_INFO charinfo = m_CharList[index]; |
| 774 charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index); | |
| 775 if (charinfo.m_Index == -1 || charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) { | 768 if (charinfo.m_Index == -1 || charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) { |
| 776 return index; | 769 return index; |
| 777 } | 770 } |
| 778 if (!IsLetter(charinfo.m_Unicode)) { | 771 if (!IsLetter(charinfo.m_Unicode)) { |
| 779 return index; | 772 return index; |
| 780 } | 773 } |
| 781 int breakPos = index; | 774 int breakPos = index; |
| 782 if (direction == FPDFTEXT_LEFT) { | 775 if (direction == FPDFTEXT_LEFT) { |
| 783 while (--breakPos > 0) { | 776 while (--breakPos > 0) { |
| 784 charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos); | 777 if (!IsLetter(m_CharList[breakPos].m_Unicode)) |
| 785 if (!IsLetter(charinfo.m_Unicode)) { | 778 break; |
| 786 return breakPos; | |
| 787 } | |
| 788 } | 779 } |
| 789 } else if (direction == FPDFTEXT_RIGHT) { | 780 } else if (direction == FPDFTEXT_RIGHT) { |
| 790 while (++breakPos < m_charList.GetSize()) { | 781 while (++breakPos < m_CharList.size()) { |
| 791 charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos); | 782 if (!IsLetter(m_CharList[breakPos].m_Unicode)) |
| 792 if (!IsLetter(charinfo.m_Unicode)) { | 783 break; |
| 793 return breakPos; | |
| 794 } | |
| 795 } | 784 } |
| 796 } | 785 } |
| 797 return breakPos; | 786 return breakPos; |
| 798 } | 787 } |
| 799 int32_t CPDF_TextPage::FindTextlineFlowDirection() { | 788 int32_t CPDF_TextPage::FindTextlineFlowDirection() { |
| 800 if (!m_pPage) { | 789 if (!m_pPage) { |
| 801 return -1; | 790 return -1; |
| 802 } | 791 } |
| 803 const int32_t nPageWidth = (int32_t)((CPDF_Page*)m_pPage)->GetPageWidth(); | 792 const int32_t nPageWidth = (int32_t)((CPDF_Page*)m_pPage)->GetPageWidth(); |
| 804 const int32_t nPageHeight = (int32_t)((CPDF_Page*)m_pPage)->GetPageHeight(); | 793 const int32_t nPageHeight = (int32_t)((CPDF_Page*)m_pPage)->GetPageHeight(); |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 974 } | 963 } |
| 975 } | 964 } |
| 976 return w; | 965 return w; |
| 977 } | 966 } |
| 978 void CPDF_TextPage::OnPiece(CFX_BidiChar* pBidi, CFX_WideString& str) { | 967 void CPDF_TextPage::OnPiece(CFX_BidiChar* pBidi, CFX_WideString& str) { |
| 979 int32_t start, count; | 968 int32_t start, count; |
| 980 CFX_BidiChar::Direction ret = pBidi->GetBidiInfo(&start, &count); | 969 CFX_BidiChar::Direction ret = pBidi->GetBidiInfo(&start, &count); |
| 981 if (ret == CFX_BidiChar::RIGHT) { | 970 if (ret == CFX_BidiChar::RIGHT) { |
| 982 for (int i = start + count - 1; i >= start; i--) { | 971 for (int i = start + count - 1; i >= start; i--) { |
| 983 m_TextBuf.AppendChar(str.GetAt(i)); | 972 m_TextBuf.AppendChar(str.GetAt(i)); |
| 984 m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i)); | 973 m_CharList.push_back(m_TempCharList[i]); |
| 985 } | 974 } |
| 986 } else { | 975 } else { |
| 987 int end = start + count; | 976 int end = start + count; |
| 988 for (int i = start; i < end; i++) { | 977 for (int i = start; i < end; i++) { |
| 989 m_TextBuf.AppendChar(str.GetAt(i)); | 978 m_TextBuf.AppendChar(str.GetAt(i)); |
| 990 m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i)); | 979 m_CharList.push_back(m_TempCharList[i]); |
| 991 } | 980 } |
| 992 } | 981 } |
| 993 } | 982 } |
| 994 void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i) { | 983 void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i) { |
| 995 PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i); | 984 PAGECHAR_INFO Info = m_TempCharList[i]; |
| 996 FX_WCHAR wChar = str.GetAt(i); | 985 FX_WCHAR wChar = str.GetAt(i); |
| 997 if (!IsControlChar(Info)) { | 986 if (!IsControlChar(Info)) { |
| 998 Info.m_Index = m_TextBuf.GetLength(); | 987 Info.m_Index = m_TextBuf.GetLength(); |
| 999 if (wChar >= 0xFB00 && wChar <= 0xFB06) { | 988 if (wChar >= 0xFB00 && wChar <= 0xFB06) { |
| 1000 FX_WCHAR* pDst = NULL; | 989 FX_WCHAR* pDst = NULL; |
| 1001 FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst); | 990 FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst); |
| 1002 if (nCount >= 1) { | 991 if (nCount >= 1) { |
| 1003 pDst = FX_Alloc(FX_WCHAR, nCount); | 992 pDst = FX_Alloc(FX_WCHAR, nCount); |
| 1004 FX_Unicode_GetNormalization(wChar, pDst); | 993 FX_Unicode_GetNormalization(wChar, pDst); |
| 1005 for (int nIndex = 0; nIndex < nCount; nIndex++) { | 994 for (int nIndex = 0; nIndex < nCount; nIndex++) { |
| 1006 PAGECHAR_INFO Info2 = Info; | 995 PAGECHAR_INFO Info2 = Info; |
| 1007 Info2.m_Unicode = pDst[nIndex]; | 996 Info2.m_Unicode = pDst[nIndex]; |
| 1008 Info2.m_Flag = FPDFTEXT_CHAR_PIECE; | 997 Info2.m_Flag = FPDFTEXT_CHAR_PIECE; |
| 1009 m_TextBuf.AppendChar(Info2.m_Unicode); | 998 m_TextBuf.AppendChar(Info2.m_Unicode); |
| 1010 if (!m_ParseOptions.m_bGetCharCodeOnly) { | 999 if (!m_ParseOptions.m_bGetCharCodeOnly) { |
| 1011 m_charList.Add(Info2); | 1000 m_CharList.push_back(Info2); |
| 1012 } | 1001 } |
| 1013 } | 1002 } |
| 1014 FX_Free(pDst); | 1003 FX_Free(pDst); |
| 1015 return; | 1004 return; |
| 1016 } | 1005 } |
| 1017 } | 1006 } |
| 1018 m_TextBuf.AppendChar(wChar); | 1007 m_TextBuf.AppendChar(wChar); |
| 1019 } else { | 1008 } else { |
| 1020 Info.m_Index = -1; | 1009 Info.m_Index = -1; |
| 1021 } | 1010 } |
| 1022 if (!m_ParseOptions.m_bGetCharCodeOnly) { | 1011 if (!m_ParseOptions.m_bGetCharCodeOnly) { |
| 1023 m_charList.Add(Info); | 1012 m_CharList.push_back(Info); |
| 1024 } | 1013 } |
| 1025 } | 1014 } |
| 1026 void CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i) { | 1015 void CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i) { |
| 1027 PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i); | 1016 PAGECHAR_INFO Info = m_TempCharList[i]; |
| 1028 if (!IsControlChar(Info)) { | 1017 if (!IsControlChar(Info)) { |
| 1029 Info.m_Index = m_TextBuf.GetLength(); | 1018 Info.m_Index = m_TextBuf.GetLength(); |
| 1030 FX_WCHAR wChar = FX_GetMirrorChar(str.GetAt(i), TRUE, FALSE); | 1019 FX_WCHAR wChar = FX_GetMirrorChar(str.GetAt(i), TRUE, FALSE); |
| 1031 FX_WCHAR* pDst = NULL; | 1020 FX_WCHAR* pDst = NULL; |
| 1032 FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst); | 1021 FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst); |
| 1033 if (nCount >= 1) { | 1022 if (nCount >= 1) { |
| 1034 pDst = FX_Alloc(FX_WCHAR, nCount); | 1023 pDst = FX_Alloc(FX_WCHAR, nCount); |
| 1035 FX_Unicode_GetNormalization(wChar, pDst); | 1024 FX_Unicode_GetNormalization(wChar, pDst); |
| 1036 for (int nIndex = 0; nIndex < nCount; nIndex++) { | 1025 for (int nIndex = 0; nIndex < nCount; nIndex++) { |
| 1037 PAGECHAR_INFO Info2 = Info; | 1026 PAGECHAR_INFO Info2 = Info; |
| 1038 Info2.m_Unicode = pDst[nIndex]; | 1027 Info2.m_Unicode = pDst[nIndex]; |
| 1039 Info2.m_Flag = FPDFTEXT_CHAR_PIECE; | 1028 Info2.m_Flag = FPDFTEXT_CHAR_PIECE; |
| 1040 m_TextBuf.AppendChar(Info2.m_Unicode); | 1029 m_TextBuf.AppendChar(Info2.m_Unicode); |
| 1041 if (!m_ParseOptions.m_bGetCharCodeOnly) { | 1030 if (!m_ParseOptions.m_bGetCharCodeOnly) { |
| 1042 m_charList.Add(Info2); | 1031 m_CharList.push_back(Info2); |
| 1043 } | 1032 } |
| 1044 } | 1033 } |
| 1045 FX_Free(pDst); | 1034 FX_Free(pDst); |
| 1046 return; | 1035 return; |
| 1047 } | 1036 } |
| 1048 Info.m_Unicode = wChar; | 1037 Info.m_Unicode = wChar; |
| 1049 m_TextBuf.AppendChar(Info.m_Unicode); | 1038 m_TextBuf.AppendChar(Info.m_Unicode); |
| 1050 } else { | 1039 } else { |
| 1051 Info.m_Index = -1; | 1040 Info.m_Index = -1; |
| 1052 } | 1041 } |
| 1053 if (!m_ParseOptions.m_bGetCharCodeOnly) { | 1042 if (!m_ParseOptions.m_bGetCharCodeOnly) { |
| 1054 m_charList.Add(Info); | 1043 m_CharList.push_back(Info); |
| 1055 } | 1044 } |
| 1056 } | 1045 } |
| 1057 void CPDF_TextPage::CloseTempLine() { | 1046 void CPDF_TextPage::CloseTempLine() { |
| 1058 int count1 = m_TempCharList.GetSize(); | 1047 int count1 = m_TempCharList.size(); |
| 1059 if (count1 <= 0) { | 1048 if (count1 <= 0) { |
| 1060 return; | 1049 return; |
| 1061 } | 1050 } |
| 1062 std::unique_ptr<CFX_BidiChar> pBidiChar(new CFX_BidiChar); | 1051 std::unique_ptr<CFX_BidiChar> pBidiChar(new CFX_BidiChar); |
| 1063 CFX_WideString str = m_TempTextBuf.GetWideString(); | 1052 CFX_WideString str = m_TempTextBuf.GetWideString(); |
| 1064 CFX_WordArray order; | 1053 CFX_WordArray order; |
| 1065 FX_BOOL bR2L = FALSE; | 1054 FX_BOOL bR2L = FALSE; |
| 1066 int32_t start = 0, count = 0; | 1055 int32_t start = 0, count = 0; |
| 1067 int nR2L = 0, nL2R = 0; | 1056 int nR2L = 0, nL2R = 0; |
| 1068 FX_BOOL bPrevSpace = FALSE; | 1057 FX_BOOL bPrevSpace = FALSE; |
| 1069 for (int i = 0; i < str.GetLength(); i++) { | 1058 for (int i = 0; i < str.GetLength(); i++) { |
| 1070 if (str.GetAt(i) == 32) { | 1059 if (str.GetAt(i) == 32) { |
| 1071 if (bPrevSpace) { | 1060 if (bPrevSpace) { |
| 1072 m_TempTextBuf.Delete(i, 1); | 1061 m_TempTextBuf.Delete(i, 1); |
| 1073 m_TempCharList.Delete(i); | 1062 m_TempCharList.erase(m_TempCharList.begin() + i); |
| 1074 str.Delete(i); | 1063 str.Delete(i); |
| 1075 count1--; | 1064 count1--; |
| 1076 i--; | 1065 i--; |
| 1077 continue; | 1066 continue; |
| 1078 } | 1067 } |
| 1079 bPrevSpace = TRUE; | 1068 bPrevSpace = TRUE; |
| 1080 } else { | 1069 } else { |
| 1081 bPrevSpace = FALSE; | 1070 bPrevSpace = FALSE; |
| 1082 } | 1071 } |
| 1083 if (pBidiChar->AppendChar(str.GetAt(i))) { | 1072 if (pBidiChar->AppendChar(str.GetAt(i))) { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1166 break; | 1155 break; |
| 1167 } else { | 1156 } else { |
| 1168 j += 3; | 1157 j += 3; |
| 1169 } | 1158 } |
| 1170 } | 1159 } |
| 1171 if (j == 3) { | 1160 if (j == 3) { |
| 1172 i = -3; | 1161 i = -3; |
| 1173 bL2R = TRUE; | 1162 bL2R = TRUE; |
| 1174 continue; | 1163 continue; |
| 1175 } | 1164 } |
| 1176 int end = m_TempCharList.GetSize() - 1; | 1165 int end = m_TempCharList.size() - 1; |
| 1177 if (j < count) { | 1166 if (j < count) { |
| 1178 end = order.GetAt(j) - 1; | 1167 end = order.GetAt(j) - 1; |
| 1179 } | 1168 } |
| 1180 i = j - 3; | 1169 i = j - 3; |
| 1181 for (int n = end; n >= start; n--) { | 1170 for (int n = end; n >= start; n--) { |
| 1182 AddCharInfoByRLDirection(str, n); | 1171 AddCharInfoByRLDirection(str, n); |
| 1183 } | 1172 } |
| 1184 } else { | 1173 } else { |
| 1185 int end = start + count1; | 1174 int end = start + count1; |
| 1186 for (int n = start; n < end; n++) { | 1175 for (int n = start; n < end; n++) { |
| 1187 AddCharInfoByLRDirection(str, n); | 1176 AddCharInfoByLRDirection(str, n); |
| 1188 } | 1177 } |
| 1189 } | 1178 } |
| 1190 } | 1179 } |
| 1191 } | 1180 } |
| 1192 order.RemoveAll(); | 1181 order.RemoveAll(); |
| 1193 m_TempCharList.RemoveAll(); | 1182 m_TempCharList.clear(); |
| 1194 m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength()); | 1183 m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength()); |
| 1195 } | 1184 } |
| 1196 void CPDF_TextPage::ProcessTextObject(CPDF_TextObject* pTextObj, | 1185 void CPDF_TextPage::ProcessTextObject(CPDF_TextObject* pTextObj, |
| 1197 const CFX_Matrix& formMatrix, | 1186 const CFX_Matrix& formMatrix, |
| 1198 FX_POSITION ObjPos) { | 1187 FX_POSITION ObjPos) { |
| 1199 CFX_FloatRect re(pTextObj->m_Left, pTextObj->m_Bottom, pTextObj->m_Right, | 1188 CFX_FloatRect re(pTextObj->m_Left, pTextObj->m_Bottom, pTextObj->m_Right, |
| 1200 pTextObj->m_Top); | 1189 pTextObj->m_Top); |
| 1201 if (FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f) { | 1190 if (FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f) { |
| 1202 return; | 1191 return; |
| 1203 } | 1192 } |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1403 charinfo.m_Unicode = wChar; | 1392 charinfo.m_Unicode = wChar; |
| 1404 charinfo.m_CharCode = pFont->CharCodeFromUnicode(wChar); | 1393 charinfo.m_CharCode = pFont->CharCodeFromUnicode(wChar); |
| 1405 charinfo.m_Flag = FPDFTEXT_CHAR_PIECE; | 1394 charinfo.m_Flag = FPDFTEXT_CHAR_PIECE; |
| 1406 charinfo.m_pTextObj = pTextObj; | 1395 charinfo.m_pTextObj = pTextObj; |
| 1407 charinfo.m_CharBox.top = charBox.top; | 1396 charinfo.m_CharBox.top = charBox.top; |
| 1408 charinfo.m_CharBox.left = charBox.left; | 1397 charinfo.m_CharBox.left = charBox.left; |
| 1409 charinfo.m_CharBox.right = charBox.right; | 1398 charinfo.m_CharBox.right = charBox.right; |
| 1410 charinfo.m_CharBox.bottom = charBox.bottom; | 1399 charinfo.m_CharBox.bottom = charBox.bottom; |
| 1411 charinfo.m_Matrix.Copy(matrix); | 1400 charinfo.m_Matrix.Copy(matrix); |
| 1412 m_TempTextBuf.AppendChar(wChar); | 1401 m_TempTextBuf.AppendChar(wChar); |
| 1413 m_TempCharList.Add(charinfo); | 1402 m_TempCharList.push_back(charinfo); |
| 1414 } | 1403 } |
| 1415 } | 1404 } |
| 1416 void CPDF_TextPage::FindPreviousTextObject(void) { | 1405 void CPDF_TextPage::FindPreviousTextObject() { |
| 1417 if (m_TempCharList.GetSize() < 1 && m_charList.GetSize() < 1) { | 1406 if (m_TempCharList.empty() && m_CharList.empty()) |
| 1418 return; | 1407 return; |
| 1419 } | 1408 |
| 1420 PAGECHAR_INFO preChar; | 1409 PAGECHAR_INFO preChar = |
| 1421 if (m_TempCharList.GetSize() >= 1) { | 1410 m_TempCharList.empty() ? m_CharList.back() : m_TempCharList.back(); |
| 1422 preChar = | 1411 |
| 1423 *(PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1); | 1412 if (preChar.m_pTextObj) |
| 1424 } else { | |
| 1425 preChar = *(PAGECHAR_INFO*)m_charList.GetAt(m_charList.GetSize() - 1); | |
| 1426 } | |
| 1427 if (preChar.m_pTextObj) { | |
| 1428 m_pPreTextObj = preChar.m_pTextObj; | 1413 m_pPreTextObj = preChar.m_pTextObj; |
| 1429 } | |
| 1430 } | 1414 } |
| 1431 void CPDF_TextPage::SwapTempTextBuf(int32_t iCharListStartAppend, | 1415 void CPDF_TextPage::SwapTempTextBuf(int32_t iCharListStartAppend, |
| 1432 int32_t iBufStartAppend) { | 1416 int32_t iBufStartAppend) { |
| 1433 int32_t i, j; | 1417 int32_t i = iCharListStartAppend; |
| 1434 i = iCharListStartAppend; | 1418 int32_t j = m_TempCharList.size() - 1; |
| 1435 j = m_TempCharList.GetSize() - 1; | |
| 1436 for (; i < j; i++, j--) { | 1419 for (; i < j; i++, j--) { |
| 1437 std::swap(m_TempCharList[i], m_TempCharList[j]); | 1420 std::swap(m_TempCharList[i], m_TempCharList[j]); |
| 1438 std::swap(m_TempCharList[i].m_Index, m_TempCharList[j].m_Index); | 1421 std::swap(m_TempCharList[i].m_Index, m_TempCharList[j].m_Index); |
| 1439 } | 1422 } |
| 1440 FX_WCHAR* pTempBuffer = m_TempTextBuf.GetBuffer(); | 1423 FX_WCHAR* pTempBuffer = m_TempTextBuf.GetBuffer(); |
| 1441 i = iBufStartAppend; | 1424 i = iBufStartAppend; |
| 1442 j = m_TempTextBuf.GetLength() - 1; | 1425 j = m_TempTextBuf.GetLength() - 1; |
| 1443 for (; i < j; i++, j--) { | 1426 for (; i < j; i++, j--) { |
| 1444 std::swap(pTempBuffer[i], pTempBuffer[j]); | 1427 std::swap(pTempBuffer[i], pTempBuffer[j]); |
| 1445 } | 1428 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1512 CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, | 1495 CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, |
| 1513 Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top)); | 1496 Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top)); |
| 1514 } | 1497 } |
| 1515 PAGECHAR_INFO generateChar; | 1498 PAGECHAR_INFO generateChar; |
| 1516 if (result == 1) { | 1499 if (result == 1) { |
| 1517 if (GenerateCharInfo(TEXT_BLANK_CHAR, generateChar)) { | 1500 if (GenerateCharInfo(TEXT_BLANK_CHAR, generateChar)) { |
| 1518 if (!formMatrix.IsIdentity()) { | 1501 if (!formMatrix.IsIdentity()) { |
| 1519 generateChar.m_Matrix.Copy(formMatrix); | 1502 generateChar.m_Matrix.Copy(formMatrix); |
| 1520 } | 1503 } |
| 1521 m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR); | 1504 m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR); |
| 1522 m_TempCharList.Add(generateChar); | 1505 m_TempCharList.push_back(generateChar); |
| 1523 } | 1506 } |
| 1524 } else if (result == 2) { | 1507 } else if (result == 2) { |
| 1525 CloseTempLine(); | 1508 CloseTempLine(); |
| 1526 if (m_TextBuf.GetSize()) { | 1509 if (m_TextBuf.GetSize()) { |
| 1527 if (m_ParseOptions.m_bGetCharCodeOnly) { | 1510 if (m_ParseOptions.m_bGetCharCodeOnly) { |
| 1528 m_TextBuf.AppendChar(TEXT_RETURN_CHAR); | 1511 m_TextBuf.AppendChar(TEXT_RETURN_CHAR); |
| 1529 m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR); | 1512 m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR); |
| 1530 } else { | 1513 } else { |
| 1531 if (GenerateCharInfo(TEXT_RETURN_CHAR, generateChar)) { | 1514 if (GenerateCharInfo(TEXT_RETURN_CHAR, generateChar)) { |
| 1532 m_TextBuf.AppendChar(TEXT_RETURN_CHAR); | 1515 m_TextBuf.AppendChar(TEXT_RETURN_CHAR); |
| 1533 if (!formMatrix.IsIdentity()) { | 1516 if (!formMatrix.IsIdentity()) { |
| 1534 generateChar.m_Matrix.Copy(formMatrix); | 1517 generateChar.m_Matrix.Copy(formMatrix); |
| 1535 } | 1518 } |
| 1536 m_charList.Add(generateChar); | 1519 m_CharList.push_back(generateChar); |
| 1537 } | 1520 } |
| 1538 if (GenerateCharInfo(TEXT_LINEFEED_CHAR, generateChar)) { | 1521 if (GenerateCharInfo(TEXT_LINEFEED_CHAR, generateChar)) { |
| 1539 m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR); | 1522 m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR); |
| 1540 if (!formMatrix.IsIdentity()) { | 1523 if (!formMatrix.IsIdentity()) { |
| 1541 generateChar.m_Matrix.Copy(formMatrix); | 1524 generateChar.m_Matrix.Copy(formMatrix); |
| 1542 } | 1525 } |
| 1543 m_charList.Add(generateChar); | 1526 m_CharList.push_back(generateChar); |
| 1544 } | 1527 } |
| 1545 } | 1528 } |
| 1546 } | 1529 } |
| 1547 } else if (result == 3 && !m_ParseOptions.m_bOutputHyphen) { | 1530 } else if (result == 3 && !m_ParseOptions.m_bOutputHyphen) { |
| 1548 int32_t nChars = pTextObj->CountChars(); | 1531 int32_t nChars = pTextObj->CountChars(); |
| 1549 if (nChars == 1) { | 1532 if (nChars == 1) { |
| 1550 CPDF_TextObjectItem item; | 1533 CPDF_TextObjectItem item; |
| 1551 pTextObj->GetCharInfo(0, &item); | 1534 pTextObj->GetCharInfo(0, &item); |
| 1552 CFX_WideString wstrItem = | 1535 CFX_WideString wstrItem = |
| 1553 pTextObj->GetFont()->UnicodeFromCharCode(item.m_CharCode); | 1536 pTextObj->GetFont()->UnicodeFromCharCode(item.m_CharCode); |
| 1554 if (wstrItem.IsEmpty()) { | 1537 if (wstrItem.IsEmpty()) { |
| 1555 wstrItem += (FX_WCHAR)item.m_CharCode; | 1538 wstrItem += (FX_WCHAR)item.m_CharCode; |
| 1556 } | 1539 } |
| 1557 FX_WCHAR curChar = wstrItem.GetAt(0); | 1540 FX_WCHAR curChar = wstrItem.GetAt(0); |
| 1558 if (0x2D == curChar || 0xAD == curChar) { | 1541 if (0x2D == curChar || 0xAD == curChar) { |
| 1559 return; | 1542 return; |
| 1560 } | 1543 } |
| 1561 } | 1544 } |
| 1562 while (m_TempTextBuf.GetSize() > 0 && | 1545 while (m_TempTextBuf.GetSize() > 0 && |
| 1563 m_TempTextBuf.GetWideString().GetAt(m_TempTextBuf.GetLength() - | 1546 m_TempTextBuf.GetWideString().GetAt(m_TempTextBuf.GetLength() - |
| 1564 1) == 0x20) { | 1547 1) == 0x20) { |
| 1565 m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); | 1548 m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); |
| 1566 m_TempCharList.Delete(m_TempCharList.GetSize() - 1); | 1549 m_TempCharList.pop_back(); |
| 1567 } | 1550 } |
| 1568 PAGECHAR_INFO* cha = | 1551 PAGECHAR_INFO* cha = &m_TempCharList[m_TempCharList.size() - 1]; |
| 1569 (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1); | |
| 1570 m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); | 1552 m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); |
| 1571 cha->m_Unicode = 0x2; | 1553 cha->m_Unicode = 0x2; |
| 1572 cha->m_Flag = FPDFTEXT_CHAR_HYPHEN; | 1554 cha->m_Flag = FPDFTEXT_CHAR_HYPHEN; |
| 1573 m_TempTextBuf.AppendChar(0xfffe); | 1555 m_TempTextBuf.AppendChar(0xfffe); |
| 1574 } | 1556 } |
| 1575 } else { | 1557 } else { |
| 1576 m_CurlineRect = | 1558 m_CurlineRect = |
| 1577 CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, | 1559 CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, |
| 1578 Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top); | 1560 Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top); |
| 1579 } | 1561 } |
| 1580 if (FPDFTEXT_MC_DELAY == bPreMKC) { | 1562 if (FPDFTEXT_MC_DELAY == bPreMKC) { |
| 1581 ProcessMarkedContent(Obj); | 1563 ProcessMarkedContent(Obj); |
| 1582 m_pPreTextObj = pTextObj; | 1564 m_pPreTextObj = pTextObj; |
| 1583 m_perMatrix.Copy(formMatrix); | 1565 m_perMatrix.Copy(formMatrix); |
| 1584 return; | 1566 return; |
| 1585 } | 1567 } |
| 1586 m_pPreTextObj = pTextObj; | 1568 m_pPreTextObj = pTextObj; |
| 1587 m_perMatrix.Copy(formMatrix); | 1569 m_perMatrix.Copy(formMatrix); |
| 1588 int nItems = pTextObj->CountItems(); | 1570 int nItems = pTextObj->CountItems(); |
| 1589 FX_FLOAT baseSpace = _CalculateBaseSpace(pTextObj, matrix); | 1571 FX_FLOAT baseSpace = _CalculateBaseSpace(pTextObj, matrix); |
| 1590 | 1572 |
| 1591 const FX_BOOL bR2L = IsRightToLeft(pTextObj, pFont, nItems); | 1573 const FX_BOOL bR2L = IsRightToLeft(pTextObj, pFont, nItems); |
| 1592 const FX_BOOL bIsBidiAndMirrorInverse = | 1574 const FX_BOOL bIsBidiAndMirrorInverse = |
| 1593 bR2L && (matrix.a * matrix.d - matrix.b * matrix.c) < 0; | 1575 bR2L && (matrix.a * matrix.d - matrix.b * matrix.c) < 0; |
| 1594 int32_t iBufStartAppend = m_TempTextBuf.GetLength(); | 1576 int32_t iBufStartAppend = m_TempTextBuf.GetLength(); |
| 1595 int32_t iCharListStartAppend = m_TempCharList.GetSize(); | 1577 int32_t iCharListStartAppend = m_TempCharList.size(); |
| 1596 | 1578 |
| 1597 FX_FLOAT spacing = 0; | 1579 FX_FLOAT spacing = 0; |
| 1598 for (int i = 0; i < nItems; i++) { | 1580 for (int i = 0; i < nItems; i++) { |
| 1599 CPDF_TextObjectItem item; | 1581 CPDF_TextObjectItem item; |
| 1600 PAGECHAR_INFO charinfo; | 1582 PAGECHAR_INFO charinfo; |
| 1601 charinfo.m_OriginX = 0; | 1583 charinfo.m_OriginX = 0; |
| 1602 charinfo.m_OriginY = 0; | 1584 charinfo.m_OriginY = 0; |
| 1603 pTextObj->GetItemInfo(i, &item); | 1585 pTextObj->GetItemInfo(i, &item); |
| 1604 if (item.m_CharCode == (FX_DWORD)-1) { | 1586 if (item.m_CharCode == (FX_DWORD)-1) { |
| 1605 CFX_WideString str = m_TempTextBuf.GetWideString(); | 1587 CFX_WideString str = m_TempTextBuf.GetWideString(); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1647 charinfo.m_pTextObj = pTextObj; | 1629 charinfo.m_pTextObj = pTextObj; |
| 1648 charinfo.m_Index = m_TextBuf.GetLength(); | 1630 charinfo.m_Index = m_TextBuf.GetLength(); |
| 1649 m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR); | 1631 m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR); |
| 1650 charinfo.m_CharCode = -1; | 1632 charinfo.m_CharCode = -1; |
| 1651 charinfo.m_Matrix.Copy(formMatrix); | 1633 charinfo.m_Matrix.Copy(formMatrix); |
| 1652 matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, | 1634 matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, |
| 1653 charinfo.m_OriginY); | 1635 charinfo.m_OriginY); |
| 1654 charinfo.m_CharBox = | 1636 charinfo.m_CharBox = |
| 1655 CFX_FloatRect(charinfo.m_OriginX, charinfo.m_OriginY, | 1637 CFX_FloatRect(charinfo.m_OriginX, charinfo.m_OriginY, |
| 1656 charinfo.m_OriginX, charinfo.m_OriginY); | 1638 charinfo.m_OriginX, charinfo.m_OriginY); |
| 1657 m_TempCharList.Add(charinfo); | 1639 m_TempCharList.push_back(charinfo); |
| 1658 } | 1640 } |
| 1659 if (item.m_CharCode == (FX_DWORD)-1) { | 1641 if (item.m_CharCode == (FX_DWORD)-1) { |
| 1660 continue; | 1642 continue; |
| 1661 } | 1643 } |
| 1662 } | 1644 } |
| 1663 spacing = 0; | 1645 spacing = 0; |
| 1664 CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode); | 1646 CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode); |
| 1665 FX_BOOL bNoUnicode = FALSE; | 1647 FX_BOOL bNoUnicode = FALSE; |
| 1666 FX_WCHAR wChar = wstrItem.GetAt(0); | 1648 FX_WCHAR wChar = wstrItem.GetAt(0); |
| 1667 if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) { | 1649 if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1699 charinfo.m_CharBox.bottom + pTextObj->GetFontSize(); | 1681 charinfo.m_CharBox.bottom + pTextObj->GetFontSize(); |
| 1700 } | 1682 } |
| 1701 if (fabsf(charinfo.m_CharBox.right - charinfo.m_CharBox.left) < 0.01f) { | 1683 if (fabsf(charinfo.m_CharBox.right - charinfo.m_CharBox.left) < 0.01f) { |
| 1702 charinfo.m_CharBox.right = | 1684 charinfo.m_CharBox.right = |
| 1703 charinfo.m_CharBox.left + pTextObj->GetCharWidth(charinfo.m_CharCode); | 1685 charinfo.m_CharBox.left + pTextObj->GetCharWidth(charinfo.m_CharCode); |
| 1704 } | 1686 } |
| 1705 matrix.TransformRect(charinfo.m_CharBox); | 1687 matrix.TransformRect(charinfo.m_CharBox); |
| 1706 charinfo.m_Matrix.Copy(matrix); | 1688 charinfo.m_Matrix.Copy(matrix); |
| 1707 if (wstrItem.IsEmpty()) { | 1689 if (wstrItem.IsEmpty()) { |
| 1708 charinfo.m_Unicode = 0; | 1690 charinfo.m_Unicode = 0; |
| 1709 m_TempCharList.Add(charinfo); | 1691 m_TempCharList.push_back(charinfo); |
| 1710 m_TempTextBuf.AppendChar(0xfffe); | 1692 m_TempTextBuf.AppendChar(0xfffe); |
| 1711 continue; | 1693 continue; |
| 1712 } else { | 1694 } else { |
| 1713 int nTotal = wstrItem.GetLength(); | 1695 int nTotal = wstrItem.GetLength(); |
| 1714 FX_BOOL bDel = FALSE; | 1696 FX_BOOL bDel = FALSE; |
| 1715 const int count = std::min(m_TempCharList.GetSize(), 7); | 1697 const int count = std::min(static_cast<int>(m_TempCharList.size()), 7); |
| 1716 FX_FLOAT threshold = charinfo.m_Matrix.TransformXDistance( | 1698 FX_FLOAT threshold = charinfo.m_Matrix.TransformXDistance( |
| 1717 (FX_FLOAT)TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize()); | 1699 (FX_FLOAT)TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize()); |
| 1718 for (int n = m_TempCharList.GetSize(); | 1700 for (int n = m_TempCharList.size(); n > m_TempCharList.size() - count; |
| 1719 n > m_TempCharList.GetSize() - count; n--) { | 1701 n--) { |
| 1720 PAGECHAR_INFO* charinfo1 = (PAGECHAR_INFO*)m_TempCharList.GetAt(n - 1); | 1702 PAGECHAR_INFO* charinfo1 = &m_TempCharList[n - 1]; |
| 1721 if (charinfo1->m_CharCode == charinfo.m_CharCode && | 1703 if (charinfo1->m_CharCode == charinfo.m_CharCode && |
| 1722 charinfo1->m_pTextObj->GetFont() == | 1704 charinfo1->m_pTextObj->GetFont() == |
| 1723 charinfo.m_pTextObj->GetFont() && | 1705 charinfo.m_pTextObj->GetFont() && |
| 1724 FXSYS_fabs(charinfo1->m_OriginX - charinfo.m_OriginX) < threshold && | 1706 FXSYS_fabs(charinfo1->m_OriginX - charinfo.m_OriginX) < threshold && |
| 1725 FXSYS_fabs(charinfo1->m_OriginY - charinfo.m_OriginY) < threshold) { | 1707 FXSYS_fabs(charinfo1->m_OriginY - charinfo.m_OriginY) < threshold) { |
| 1726 bDel = TRUE; | 1708 bDel = TRUE; |
| 1727 break; | 1709 break; |
| 1728 } | 1710 } |
| 1729 } | 1711 } |
| 1730 if (!bDel) { | 1712 if (!bDel) { |
| 1731 for (int nIndex = 0; nIndex < nTotal; nIndex++) { | 1713 for (int nIndex = 0; nIndex < nTotal; nIndex++) { |
| 1732 charinfo.m_Unicode = wstrItem.GetAt(nIndex); | 1714 charinfo.m_Unicode = wstrItem.GetAt(nIndex); |
| 1733 if (charinfo.m_Unicode) { | 1715 if (charinfo.m_Unicode) { |
| 1734 charinfo.m_Index = m_TextBuf.GetLength(); | 1716 charinfo.m_Index = m_TextBuf.GetLength(); |
| 1735 m_TempTextBuf.AppendChar(charinfo.m_Unicode); | 1717 m_TempTextBuf.AppendChar(charinfo.m_Unicode); |
| 1736 } else { | 1718 } else { |
| 1737 m_TempTextBuf.AppendChar(0xfffe); | 1719 m_TempTextBuf.AppendChar(0xfffe); |
| 1738 } | 1720 } |
| 1739 m_TempCharList.Add(charinfo); | 1721 m_TempCharList.push_back(charinfo); |
| 1740 } | 1722 } |
| 1741 } else if (i == 0) { | 1723 } else if (i == 0) { |
| 1742 CFX_WideString str = m_TempTextBuf.GetWideString(); | 1724 CFX_WideString str = m_TempTextBuf.GetWideString(); |
| 1743 if (!str.IsEmpty() && | 1725 if (!str.IsEmpty() && |
| 1744 str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) { | 1726 str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) { |
| 1745 m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); | 1727 m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); |
| 1746 m_TempCharList.Delete(m_TempCharList.GetSize() - 1); | 1728 m_TempCharList.pop_back(); |
| 1747 } | 1729 } |
| 1748 } | 1730 } |
| 1749 } | 1731 } |
| 1750 } | 1732 } |
| 1751 if (bIsBidiAndMirrorInverse) { | 1733 if (bIsBidiAndMirrorInverse) { |
| 1752 SwapTempTextBuf(iCharListStartAppend, iBufStartAppend); | 1734 SwapTempTextBuf(iCharListStartAppend, iBufStartAppend); |
| 1753 } | 1735 } |
| 1754 } | 1736 } |
| 1755 int32_t CPDF_TextPage::GetTextObjectWritingMode( | 1737 int32_t CPDF_TextPage::GetTextObjectWritingMode( |
| 1756 const CPDF_TextObject* pTextObj) { | 1738 const CPDF_TextObject* pTextObj) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1795 if (0x2D == wcTmp || 0xAD == wcTmp) { | 1777 if (0x2D == wcTmp || 0xAD == wcTmp) { |
| 1796 if (--nIndex > 0) { | 1778 if (--nIndex > 0) { |
| 1797 FX_WCHAR preChar = strCurText.GetAt((nIndex)); | 1779 FX_WCHAR preChar = strCurText.GetAt((nIndex)); |
| 1798 if (((preChar >= L'A' && preChar <= L'Z') || | 1780 if (((preChar >= L'A' && preChar <= L'Z') || |
| 1799 (preChar >= L'a' && preChar <= L'z')) && | 1781 (preChar >= L'a' && preChar <= L'z')) && |
| 1800 ((curChar >= L'A' && curChar <= L'Z') || | 1782 ((curChar >= L'A' && curChar <= L'Z') || |
| 1801 (curChar >= L'a' && curChar <= L'z'))) { | 1783 (curChar >= L'a' && curChar <= L'z'))) { |
| 1802 return TRUE; | 1784 return TRUE; |
| 1803 } | 1785 } |
| 1804 } | 1786 } |
| 1805 int size = m_TempCharList.GetSize(); | 1787 int size = m_TempCharList.size(); |
| 1806 PAGECHAR_INFO preChar; | 1788 PAGECHAR_INFO preChar; |
| 1807 if (size) { | 1789 if (size) { |
| 1808 preChar = (PAGECHAR_INFO)m_TempCharList[size - 1]; | 1790 preChar = m_TempCharList[size - 1]; |
| 1809 } else { | 1791 } else { |
| 1810 size = m_charList.GetSize(); | 1792 size = m_CharList.size(); |
| 1811 if (size == 0) { | 1793 if (size == 0) { |
| 1812 return FALSE; | 1794 return FALSE; |
| 1813 } | 1795 } |
| 1814 preChar = (PAGECHAR_INFO)m_charList[size - 1]; | 1796 preChar = m_CharList[size - 1]; |
| 1815 } | 1797 } |
| 1816 if (FPDFTEXT_CHAR_PIECE == preChar.m_Flag && | 1798 if (FPDFTEXT_CHAR_PIECE == preChar.m_Flag && |
| 1817 (0xAD == preChar.m_Unicode || 0x2D == preChar.m_Unicode)) { | 1799 (0xAD == preChar.m_Unicode || 0x2D == preChar.m_Unicode)) { |
| 1818 return TRUE; | 1800 return TRUE; |
| 1819 } | 1801 } |
| 1820 } | 1802 } |
| 1821 return FALSE; | 1803 return FALSE; |
| 1822 } | 1804 } |
| 1823 int CPDF_TextPage::ProcessInsertObject(const CPDF_TextObject* pObj, | 1805 int CPDF_TextPage::ProcessInsertObject(const CPDF_TextObject* pObj, |
| 1824 const CFX_Matrix& formMatrix) { | 1806 const CFX_Matrix& formMatrix) { |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1981 if (!pTextObj1 || !pTextObj2) { | 1963 if (!pTextObj1 || !pTextObj2) { |
| 1982 return FALSE; | 1964 return FALSE; |
| 1983 } | 1965 } |
| 1984 CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, | 1966 CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, |
| 1985 pTextObj2->m_Right, pTextObj2->m_Top); | 1967 pTextObj2->m_Right, pTextObj2->m_Top); |
| 1986 CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, | 1968 CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, |
| 1987 pTextObj1->m_Right, pTextObj1->m_Top); | 1969 pTextObj1->m_Right, pTextObj1->m_Top); |
| 1988 if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty() && | 1970 if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty() && |
| 1989 !m_ParseOptions.m_bGetCharCodeOnly) { | 1971 !m_ParseOptions.m_bGetCharCodeOnly) { |
| 1990 FX_FLOAT dbXdif = FXSYS_fabs(rcPreObj.left - rcCurObj.left); | 1972 FX_FLOAT dbXdif = FXSYS_fabs(rcPreObj.left - rcCurObj.left); |
| 1991 int nCount = m_charList.GetSize(); | 1973 int nCount = m_CharList.size(); |
|
Oliver Chang
2016/01/22 21:26:23
this can probably be just a size_t instead of bein
Tom Sepez
2016/01/22 21:41:56
Acknowledged.
| |
| 1992 if (nCount >= 2) { | 1974 if (nCount >= 2) { |
| 1993 PAGECHAR_INFO perCharTemp = (PAGECHAR_INFO)m_charList[nCount - 2]; | 1975 PAGECHAR_INFO perCharTemp = m_CharList[nCount - 2]; |
| 1994 FX_FLOAT dbSpace = perCharTemp.m_CharBox.Width(); | 1976 FX_FLOAT dbSpace = perCharTemp.m_CharBox.Width(); |
| 1995 if (dbXdif > dbSpace) { | 1977 if (dbXdif > dbSpace) { |
| 1996 return FALSE; | 1978 return FALSE; |
| 1997 } | 1979 } |
| 1998 } | 1980 } |
| 1999 } | 1981 } |
| 2000 if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) { | 1982 if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) { |
| 2001 rcPreObj.Intersect(rcCurObj); | 1983 rcPreObj.Intersect(rcCurObj); |
| 2002 if (rcPreObj.IsEmpty()) { | 1984 if (rcPreObj.IsEmpty()) { |
| 2003 return FALSE; | 1985 return FALSE; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2054 } | 2036 } |
| 2055 if (IsSameTextObject((CPDF_TextObject*)pObj, pTextObj)) { | 2037 if (IsSameTextObject((CPDF_TextObject*)pObj, pTextObj)) { |
| 2056 return TRUE; | 2038 return TRUE; |
| 2057 } | 2039 } |
| 2058 i++; | 2040 i++; |
| 2059 } | 2041 } |
| 2060 return FALSE; | 2042 return FALSE; |
| 2061 } | 2043 } |
| 2062 | 2044 |
| 2063 FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info) { | 2045 FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info) { |
| 2064 int size = m_TempCharList.GetSize(); | 2046 int size = m_TempCharList.size(); |
|
Oliver Chang
2016/01/22 21:26:23
this one too
Tom Sepez
2016/01/22 21:41:56
Acknowledged.
| |
| 2065 PAGECHAR_INFO preChar; | 2047 PAGECHAR_INFO preChar; |
| 2066 if (size) { | 2048 if (size) { |
| 2067 preChar = (PAGECHAR_INFO)m_TempCharList[size - 1]; | 2049 preChar = m_TempCharList[size - 1]; |
| 2068 } else { | 2050 } else { |
| 2069 size = m_charList.GetSize(); | 2051 size = m_CharList.size(); |
| 2070 if (size == 0) { | 2052 if (size == 0) { |
| 2071 return FALSE; | 2053 return FALSE; |
| 2072 } | 2054 } |
| 2073 preChar = (PAGECHAR_INFO)m_charList[size - 1]; | 2055 preChar = m_CharList[size - 1]; |
| 2074 } | 2056 } |
| 2075 info.m_Index = m_TextBuf.GetLength(); | 2057 info.m_Index = m_TextBuf.GetLength(); |
| 2076 info.m_Unicode = unicode; | 2058 info.m_Unicode = unicode; |
| 2077 info.m_pTextObj = NULL; | 2059 info.m_pTextObj = NULL; |
| 2078 info.m_CharCode = -1; | 2060 info.m_CharCode = -1; |
| 2079 info.m_Flag = FPDFTEXT_CHAR_GENERATED; | 2061 info.m_Flag = FPDFTEXT_CHAR_GENERATED; |
| 2080 int preWidth = 0; | 2062 int preWidth = 0; |
| 2081 if (preChar.m_pTextObj && preChar.m_CharCode != (FX_DWORD)-1) | 2063 if (preChar.m_pTextObj && preChar.m_CharCode != (FX_DWORD)-1) |
| 2082 preWidth = GetCharWidth(preChar.m_CharCode, preChar.m_pTextObj->GetFont()); | 2064 preWidth = GetCharWidth(preChar.m_CharCode, preChar.m_pTextObj->GetFont()); |
| 2083 | 2065 |
| (...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2718 if (!m_bIsParsed || index < 0 || index >= m_LinkList.GetSize()) { | 2700 if (!m_bIsParsed || index < 0 || index >= m_LinkList.GetSize()) { |
| 2719 return; | 2701 return; |
| 2720 } | 2702 } |
| 2721 CPDF_LinkExt* link = NULL; | 2703 CPDF_LinkExt* link = NULL; |
| 2722 link = m_LinkList.GetAt(index); | 2704 link = m_LinkList.GetAt(index); |
| 2723 if (!link) { | 2705 if (!link) { |
| 2724 return; | 2706 return; |
| 2725 } | 2707 } |
| 2726 m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects); | 2708 m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects); |
| 2727 } | 2709 } |
| OLD | NEW |