diff options
Diffstat (limited to 'core/fpdftext/cpdf_textpage.cpp')
-rw-r--r-- | core/fpdftext/cpdf_textpage.cpp | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp index edd5456c1a..7ea2061c26 100644 --- a/core/fpdftext/cpdf_textpage.cpp +++ b/core/fpdftext/cpdf_textpage.cpp @@ -44,13 +44,13 @@ float NormalizeThreshold(float threshold) { float CalculateBaseSpace(const CPDF_TextObject* pTextObj, const CFX_Matrix& matrix) { float baseSpace = 0.0; - const int nItems = pTextObj->CountItems(); + const size_t nItems = pTextObj->CountItems(); if (pTextObj->m_TextState.GetCharSpace() && nItems >= 3) { bool bAllChar = true; float spacing = matrix.TransformDistance(pTextObj->m_TextState.GetCharSpace()); baseSpace = spacing; - for (int i = 0; i < nItems; i++) { + for (size_t i = 0; i < nItems; ++i) { CPDF_TextObjectItem item; pTextObj->GetItemInfo(i, &item); if (item.m_CharCode == static_cast<uint32_t>(-1)) { @@ -758,8 +758,11 @@ void CPDF_TextPage::ProcessTextObject( return; PDFTEXT_Obj prev_Obj = m_LineObj[count - 1]; + size_t nItem = prev_Obj.m_pTextObj->CountItems(); + if (nItem == 0) + return; + CPDF_TextObjectItem item; - int nItem = prev_Obj.m_pTextObj->CountItems(); prev_Obj.m_pTextObj->GetItemInfo(nItem - 1, &item); float prev_width = GetCharWidth(item.m_CharCode, prev_Obj.m_pTextObj->GetFont()) * @@ -811,7 +814,7 @@ FPDFText_MarkedContent CPDF_TextPage::PreMarkedContent(PDFTEXT_Obj Obj) { return FPDFText_MarkedContent::Pass; size_t nContentMark = pTextObj->m_ContentMark.CountItems(); - if (nContentMark < 1) + if (nContentMark == 0) return FPDFText_MarkedContent::Pass; WideString actText; @@ -939,9 +942,9 @@ void CPDF_TextPage::SwapTempTextBuf(int32_t iCharListStartAppend, bool CPDF_TextPage::IsRightToLeft(const CPDF_TextObject* pTextObj, const CPDF_Font* pFont, - int nItems) const { + size_t nItems) const { WideString str; - for (int32_t i = 0; i < nItems; i++) { + for (size_t i = 0; i < nItems; ++i) { CPDF_TextObjectItem item; pTextObj->GetItemInfo(i, &item); if (item.m_CharCode == static_cast<uint32_t>(-1)) @@ -1036,7 +1039,7 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { } m_pPreTextObj = pTextObj; m_perMatrix = formMatrix; - int nItems = pTextObj->CountItems(); + size_t nItems = pTextObj->CountItems(); float baseSpace = CalculateBaseSpace(pTextObj, matrix); const bool bR2L = IsRightToLeft(pTextObj, pFont, nItems); @@ -1047,7 +1050,7 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { pdfium::CollectionSize<int32_t>(m_TempCharList); float spacing = 0; - for (int i = 0; i < nItems; i++) { + for (size_t i = 0; i < nItems; ++i) { CPDF_TextObjectItem item; PAGECHAR_INFO charinfo; pTextObj->GetItemInfo(i, &item); @@ -1190,8 +1193,8 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { CPDF_TextPage::TextOrientation CPDF_TextPage::GetTextObjectWritingMode( const CPDF_TextObject* pTextObj) const { - int32_t nChars = pTextObj->CountChars(); - if (nChars == 1) + size_t nChars = pTextObj->CountChars(); + if (nChars <= 1) return m_TextlineDir; CPDF_TextObjectItem first, last; @@ -1260,13 +1263,19 @@ CPDF_TextPage::GenerateCharacter CPDF_TextPage::ProcessInsertObject( if (WritingMode == TextOrientation::Unknown) WritingMode = GetTextObjectWritingMode(m_pPreTextObj.Get()); - CFX_FloatRect this_rect = pObj->GetRect(); - CFX_FloatRect prev_rect = m_pPreTextObj->GetRect(); + size_t nItem = m_pPreTextObj->CountItems(); + if (nItem == 0) + return GenerateCharacter::None; + CPDF_TextObjectItem PrevItem; - CPDF_TextObjectItem item; - int nItem = m_pPreTextObj->CountItems(); m_pPreTextObj->GetItemInfo(nItem - 1, &PrevItem); + + CPDF_TextObjectItem item; pObj->GetItemInfo(0, &item); + + CFX_FloatRect this_rect = pObj->GetRect(); + CFX_FloatRect prev_rect = m_pPreTextObj->GetRect(); + WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode); if (wstrItem.IsEmpty()) wstrItem += static_cast<wchar_t>(item.m_CharCode); @@ -1350,8 +1359,7 @@ CPDF_TextPage::GenerateCharacter CPDF_TextPage::ProcessInsertObject( : GenerateCharacter::LineBreak; } - int32_t nChars = pObj->CountChars(); - if (nChars == 1 && (0x2D == curChar || 0xAD == curChar) && + if (pObj->CountChars() == 1 && (0x2D == curChar || 0xAD == curChar) && IsHyphen(curChar)) { return GenerateCharacter::Hyphen; } @@ -1424,17 +1432,18 @@ bool CPDF_TextPage::IsSameTextObject(CPDF_TextObject* pTextObj1, if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) return false; } - int nPreCount = pTextObj2->CountItems(); - int nCurCount = pTextObj1->CountItems(); - if (nPreCount != nCurCount) + + size_t nPreCount = pTextObj2->CountItems(); + if (nPreCount != pTextObj1->CountItems()) return false; + // If both objects have no items, consider them same. - if (!nPreCount) + if (nPreCount == 0) return true; CPDF_TextObjectItem itemPer; CPDF_TextObjectItem itemCur; - for (int i = 0; i < nPreCount; i++) { + for (size_t i = 0; i < nPreCount; ++i) { pTextObj2->GetItemInfo(i, &itemPer); pTextObj1->GetItemInfo(i, &itemCur); if (itemCur.m_CharCode != itemPer.m_CharCode) |