| 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 747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 758 std::vector<uint8_t> nHorizontalMask(nPageWidth); | 758 std::vector<uint8_t> nHorizontalMask(nPageWidth); |
| 759 std::vector<uint8_t> nVerticalMask(nPageHeight); | 759 std::vector<uint8_t> nVerticalMask(nPageHeight); |
| 760 uint8_t* pDataH = nHorizontalMask.data(); | 760 uint8_t* pDataH = nHorizontalMask.data(); |
| 761 uint8_t* pDataV = nVerticalMask.data(); | 761 uint8_t* pDataV = nVerticalMask.data(); |
| 762 int32_t index = 0; | 762 int32_t index = 0; |
| 763 FX_FLOAT fLineHeight = 0.0f; | 763 FX_FLOAT fLineHeight = 0.0f; |
| 764 if (m_pPage->GetPageObjectList()->empty()) | 764 if (m_pPage->GetPageObjectList()->empty()) |
| 765 return -1; | 765 return -1; |
| 766 | 766 |
| 767 for (auto& pPageObj : *m_pPage->GetPageObjectList()) { | 767 for (auto& pPageObj : *m_pPage->GetPageObjectList()) { |
| 768 if (!pPageObj || pPageObj->m_Type != CPDF_PageObject::TEXT) | 768 if (!pPageObj || !pPageObj->IsText()) |
| 769 continue; | 769 continue; |
| 770 | 770 |
| 771 int32_t minH = | 771 int32_t minH = |
| 772 (int32_t)pPageObj->m_Left < 0 ? 0 : (int32_t)pPageObj->m_Left; | 772 (int32_t)pPageObj->m_Left < 0 ? 0 : (int32_t)pPageObj->m_Left; |
| 773 int32_t maxH = (int32_t)pPageObj->m_Right > nPageWidth | 773 int32_t maxH = (int32_t)pPageObj->m_Right > nPageWidth |
| 774 ? nPageWidth | 774 ? nPageWidth |
| 775 : (int32_t)pPageObj->m_Right; | 775 : (int32_t)pPageObj->m_Right; |
| 776 int32_t minV = | 776 int32_t minV = |
| 777 (int32_t)pPageObj->m_Bottom < 0 ? 0 : (int32_t)pPageObj->m_Bottom; | 777 (int32_t)pPageObj->m_Bottom < 0 ? 0 : (int32_t)pPageObj->m_Bottom; |
| 778 int32_t maxV = (int32_t)pPageObj->m_Top > nPageHeight | 778 int32_t maxV = (int32_t)pPageObj->m_Top > nPageHeight |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 839 } | 839 } |
| 840 | 840 |
| 841 void CPDF_TextPage::ProcessObject() { | 841 void CPDF_TextPage::ProcessObject() { |
| 842 if (m_pPage->GetPageObjectList()->empty()) | 842 if (m_pPage->GetPageObjectList()->empty()) |
| 843 return; | 843 return; |
| 844 | 844 |
| 845 m_TextlineDir = FindTextlineFlowDirection(); | 845 m_TextlineDir = FindTextlineFlowDirection(); |
| 846 const CPDF_PageObjectList* pObjList = m_pPage->GetPageObjectList(); | 846 const CPDF_PageObjectList* pObjList = m_pPage->GetPageObjectList(); |
| 847 for (auto it = pObjList->begin(); it != pObjList->end(); ++it) { | 847 for (auto it = pObjList->begin(); it != pObjList->end(); ++it) { |
| 848 if (CPDF_PageObject* pObj = it->get()) { | 848 if (CPDF_PageObject* pObj = it->get()) { |
| 849 if (pObj->m_Type == CPDF_PageObject::TEXT) { | 849 if (pObj->IsText()) { |
| 850 CFX_Matrix matrix; | 850 CFX_Matrix matrix; |
| 851 ProcessTextObject(static_cast<CPDF_TextObject*>(pObj), matrix, pObjList, | 851 ProcessTextObject(pObj->AsText(), matrix, pObjList, it); |
| 852 it); | 852 } else if (pObj->IsForm()) { |
| 853 } else if (pObj->m_Type == CPDF_PageObject::FORM) { | |
| 854 CFX_Matrix formMatrix(1, 0, 0, 1, 0, 0); | 853 CFX_Matrix formMatrix(1, 0, 0, 1, 0, 0); |
| 855 ProcessFormObject(static_cast<CPDF_FormObject*>(pObj), formMatrix); | 854 ProcessFormObject(pObj->AsForm(), formMatrix); |
| 856 } | 855 } |
| 857 } | 856 } |
| 858 } | 857 } |
| 859 for (int i = 0; i < m_LineObj.GetSize(); i++) | 858 for (int i = 0; i < m_LineObj.GetSize(); i++) |
| 860 ProcessTextObject(m_LineObj.GetAt(i)); | 859 ProcessTextObject(m_LineObj.GetAt(i)); |
| 861 | 860 |
| 862 m_LineObj.RemoveAll(); | 861 m_LineObj.RemoveAll(); |
| 863 CloseTempLine(); | 862 CloseTempLine(); |
| 864 } | 863 } |
| 865 | 864 |
| 866 void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj, | 865 void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj, |
| 867 const CFX_Matrix& formMatrix) { | 866 const CFX_Matrix& formMatrix) { |
| 868 CPDF_PageObjectList* pObjectList = pFormObj->m_pForm->GetPageObjectList(); | 867 CPDF_PageObjectList* pObjectList = pFormObj->m_pForm->GetPageObjectList(); |
| 869 if (pObjectList->empty()) | 868 if (pObjectList->empty()) |
| 870 return; | 869 return; |
| 871 | 870 |
| 872 CFX_Matrix curFormMatrix; | 871 CFX_Matrix curFormMatrix; |
| 873 curFormMatrix.Copy(pFormObj->m_FormMatrix); | 872 curFormMatrix.Copy(pFormObj->m_FormMatrix); |
| 874 curFormMatrix.Concat(formMatrix); | 873 curFormMatrix.Concat(formMatrix); |
| 875 | 874 |
| 876 for (auto it = pObjectList->begin(); it != pObjectList->end(); ++it) { | 875 for (auto it = pObjectList->begin(); it != pObjectList->end(); ++it) { |
| 877 if (CPDF_PageObject* pPageObj = it->get()) { | 876 if (CPDF_PageObject* pPageObj = it->get()) { |
| 878 if (pPageObj->m_Type == CPDF_PageObject::TEXT) { | 877 if (pPageObj->IsText()) { |
| 879 ProcessTextObject(static_cast<CPDF_TextObject*>(pPageObj), | 878 ProcessTextObject(pPageObj->AsText(), curFormMatrix, pObjectList, it); |
| 880 curFormMatrix, pObjectList, it); | 879 } else if (pPageObj->IsForm()) { |
| 881 } else if (pPageObj->m_Type == CPDF_PageObject::FORM) { | 880 ProcessFormObject(pPageObj->AsForm(), curFormMatrix); |
| 882 ProcessFormObject(static_cast<CPDF_FormObject*>(pPageObj), | |
| 883 curFormMatrix); | |
| 884 } | 881 } |
| 885 } | 882 } |
| 886 } | 883 } |
| 887 } | 884 } |
| 888 | 885 |
| 889 int CPDF_TextPage::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const { | 886 int CPDF_TextPage::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const { |
| 890 if (charCode == -1) { | 887 if (charCode == -1) { |
| 891 return 0; | 888 return 0; |
| 892 } | 889 } |
| 893 int w = pFont->GetCharWidthF(charCode); | 890 int w = pFont->GetCharWidthF(charCode); |
| (...skipping 924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1818 return TRUE; | 1815 return TRUE; |
| 1819 } | 1816 } |
| 1820 FX_BOOL CPDF_TextPage::IsSameAsPreTextObject( | 1817 FX_BOOL CPDF_TextPage::IsSameAsPreTextObject( |
| 1821 CPDF_TextObject* pTextObj, | 1818 CPDF_TextObject* pTextObj, |
| 1822 const CPDF_PageObjectList* pObjList, | 1819 const CPDF_PageObjectList* pObjList, |
| 1823 CPDF_PageObjectList::const_iterator iter) { | 1820 CPDF_PageObjectList::const_iterator iter) { |
| 1824 int i = 0; | 1821 int i = 0; |
| 1825 while (i < 5 && iter != pObjList->begin()) { | 1822 while (i < 5 && iter != pObjList->begin()) { |
| 1826 --iter; | 1823 --iter; |
| 1827 CPDF_PageObject* pOtherObj = iter->get(); | 1824 CPDF_PageObject* pOtherObj = iter->get(); |
| 1828 if (pOtherObj == pTextObj || pOtherObj->m_Type != CPDF_PageObject::TEXT) | 1825 if (pOtherObj == pTextObj || !pOtherObj->IsText()) |
| 1829 continue; | 1826 continue; |
| 1830 if (IsSameTextObject(static_cast<CPDF_TextObject*>(pOtherObj), pTextObj)) | 1827 if (IsSameTextObject(pOtherObj->AsText(), pTextObj)) |
| 1831 return TRUE; | 1828 return TRUE; |
| 1832 ++i; | 1829 ++i; |
| 1833 } | 1830 } |
| 1834 return FALSE; | 1831 return FALSE; |
| 1835 } | 1832 } |
| 1836 | 1833 |
| 1837 FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info) { | 1834 FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info) { |
| 1838 const PAGECHAR_INFO* preChar; | 1835 const PAGECHAR_INFO* preChar; |
| 1839 if (!m_TempCharList.empty()) { | 1836 if (!m_TempCharList.empty()) { |
| 1840 preChar = &m_TempCharList.back(); | 1837 preChar = &m_TempCharList.back(); |
| (...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2497 if (!m_bIsParsed || index < 0 || index >= m_LinkList.GetSize()) { | 2494 if (!m_bIsParsed || index < 0 || index >= m_LinkList.GetSize()) { |
| 2498 return; | 2495 return; |
| 2499 } | 2496 } |
| 2500 CPDF_LinkExt* link = NULL; | 2497 CPDF_LinkExt* link = NULL; |
| 2501 link = m_LinkList.GetAt(index); | 2498 link = m_LinkList.GetAt(index); |
| 2502 if (!link) { | 2499 if (!link) { |
| 2503 return; | 2500 return; |
| 2504 } | 2501 } |
| 2505 m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects); | 2502 m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects); |
| 2506 } | 2503 } |
| OLD | NEW |