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" | 7 #include "core/src/fpdftext/text_int.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <cctype> | 10 #include <cctype> |
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
877 if (pPageObj->IsText()) { | 877 if (pPageObj->IsText()) { |
878 ProcessTextObject(pPageObj->AsText(), curFormMatrix, pObjectList, it); | 878 ProcessTextObject(pPageObj->AsText(), curFormMatrix, pObjectList, it); |
879 } else if (pPageObj->IsForm()) { | 879 } else if (pPageObj->IsForm()) { |
880 ProcessFormObject(pPageObj->AsForm(), curFormMatrix); | 880 ProcessFormObject(pPageObj->AsForm(), curFormMatrix); |
881 } | 881 } |
882 } | 882 } |
883 } | 883 } |
884 } | 884 } |
885 | 885 |
886 int CPDF_TextPage::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const { | 886 int CPDF_TextPage::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const { |
887 if (charCode == -1) { | 887 if (charCode == -1) |
888 return 0; | 888 return 0; |
889 } | 889 |
890 int w = pFont->GetCharWidthF(charCode); | 890 if (int w = pFont->GetCharWidthF(charCode)) |
891 if (w == 0) { | 891 return w; |
892 CFX_ByteString str; | 892 |
893 pFont->AppendChar(str, charCode); | 893 CFX_ByteString str; |
894 w = pFont->GetStringWidth(str, 1); | 894 pFont->AppendChar(str, charCode); |
895 if (w == 0) { | 895 if (int w = pFont->GetStringWidth(str, 1)) |
896 FX_RECT BBox; | 896 return w; |
897 pFont->GetCharBBox(charCode, BBox); | 897 |
898 w = BBox.right - BBox.left; | 898 return pFont->GetCharBBox(charCode).Width(); |
899 } | |
900 } | |
901 return w; | |
902 } | 899 } |
903 | 900 |
904 void CPDF_TextPage::OnPiece(CFX_BidiChar* pBidi, CFX_WideString& str) { | 901 void CPDF_TextPage::OnPiece(CFX_BidiChar* pBidi, CFX_WideString& str) { |
905 CFX_BidiChar::Segment seg = pBidi->GetSegmentInfo(); | 902 CFX_BidiChar::Segment seg = pBidi->GetSegmentInfo(); |
906 if (seg.direction == CFX_BidiChar::RIGHT) { | 903 if (seg.direction == CFX_BidiChar::RIGHT) { |
907 for (int i = seg.start + seg.count; i > seg.start; i--) { | 904 for (int i = seg.start + seg.count; i > seg.start; i--) { |
908 m_TextBuf.AppendChar(str.GetAt(i - i)); | 905 m_TextBuf.AppendChar(str.GetAt(i - i)); |
909 m_CharList.push_back(m_TempCharList[i - 1]); | 906 m_CharList.push_back(m_TempCharList[i - 1]); |
910 } | 907 } |
911 } else { | 908 } else { |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1457 charinfo.m_CharCode = item.m_CharCode; | 1454 charinfo.m_CharCode = item.m_CharCode; |
1458 if (bNoUnicode) { | 1455 if (bNoUnicode) { |
1459 charinfo.m_Flag = FPDFTEXT_CHAR_UNUNICODE; | 1456 charinfo.m_Flag = FPDFTEXT_CHAR_UNUNICODE; |
1460 } else { | 1457 } else { |
1461 charinfo.m_Flag = FPDFTEXT_CHAR_NORMAL; | 1458 charinfo.m_Flag = FPDFTEXT_CHAR_NORMAL; |
1462 } | 1459 } |
1463 charinfo.m_pTextObj = pTextObj; | 1460 charinfo.m_pTextObj = pTextObj; |
1464 charinfo.m_OriginX = 0, charinfo.m_OriginY = 0; | 1461 charinfo.m_OriginX = 0, charinfo.m_OriginY = 0; |
1465 matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, | 1462 matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, |
1466 charinfo.m_OriginY); | 1463 charinfo.m_OriginY); |
1467 FX_RECT rect(0, 0, 0, 0); | 1464 FX_RECT rect = |
1468 rect.Intersect(0, 0, 0, 0); | 1465 charinfo.m_pTextObj->GetFont()->GetCharBBox(charinfo.m_CharCode); |
1469 charinfo.m_pTextObj->GetFont()->GetCharBBox(charinfo.m_CharCode, rect); | |
1470 charinfo.m_CharBox.top = | 1466 charinfo.m_CharBox.top = |
1471 rect.top * pTextObj->GetFontSize() / 1000 + item.m_OriginY; | 1467 rect.top * pTextObj->GetFontSize() / 1000 + item.m_OriginY; |
1472 charinfo.m_CharBox.left = | 1468 charinfo.m_CharBox.left = |
1473 rect.left * pTextObj->GetFontSize() / 1000 + item.m_OriginX; | 1469 rect.left * pTextObj->GetFontSize() / 1000 + item.m_OriginX; |
1474 charinfo.m_CharBox.right = | 1470 charinfo.m_CharBox.right = |
1475 rect.right * pTextObj->GetFontSize() / 1000 + item.m_OriginX; | 1471 rect.right * pTextObj->GetFontSize() / 1000 + item.m_OriginX; |
1476 charinfo.m_CharBox.bottom = | 1472 charinfo.m_CharBox.bottom = |
1477 rect.bottom * pTextObj->GetFontSize() / 1000 + item.m_OriginY; | 1473 rect.bottom * pTextObj->GetFontSize() / 1000 + item.m_OriginY; |
1478 if (fabsf(charinfo.m_CharBox.top - charinfo.m_CharBox.bottom) < 0.01f) { | 1474 if (fabsf(charinfo.m_CharBox.top - charinfo.m_CharBox.bottom) < 0.01f) { |
1479 charinfo.m_CharBox.top = | 1475 charinfo.m_CharBox.top = |
(...skipping 1013 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2493 if (!m_bIsParsed || index < 0 || index >= m_LinkList.GetSize()) { | 2489 if (!m_bIsParsed || index < 0 || index >= m_LinkList.GetSize()) { |
2494 return; | 2490 return; |
2495 } | 2491 } |
2496 CPDF_LinkExt* link = NULL; | 2492 CPDF_LinkExt* link = NULL; |
2497 link = m_LinkList.GetAt(index); | 2493 link = m_LinkList.GetAt(index); |
2498 if (!link) { | 2494 if (!link) { |
2499 return; | 2495 return; |
2500 } | 2496 } |
2501 m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects); | 2497 m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects); |
2502 } | 2498 } |
OLD | NEW |