Clean up PDFTEXT_Obj usage. - Make it private within CPDF_TextPage. - Rename it to TransformedTextObject. - Pass it by const-reference. - Give instantiations of the struct and some surrounding code better names. Change-Id: Ia7c9db00cb3347768aec3447d83b49500ebf2b46 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/65875 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp index 58a2959..489e7d4 100644 --- a/core/fpdftext/cpdf_textpage.cpp +++ b/core/fpdftext/cpdf_textpage.cpp
@@ -228,11 +228,12 @@ } // namespace -PDFTEXT_Obj::PDFTEXT_Obj() {} +CPDF_TextPage::TransformedTextObject::TransformedTextObject() = default; -PDFTEXT_Obj::PDFTEXT_Obj(const PDFTEXT_Obj& that) = default; +CPDF_TextPage::TransformedTextObject::TransformedTextObject( + const TransformedTextObject& that) = default; -PDFTEXT_Obj::~PDFTEXT_Obj() {} +CPDF_TextPage::TransformedTextObject::~TransformedTextObject() = default; CPDF_TextPage::CharInfo::CharInfo() = default; @@ -594,10 +595,10 @@ else if (pObj->IsForm()) ProcessFormObject(pObj->AsForm(), matrix); } - for (const auto& obj : m_LineObj) + for (const auto& obj : mTextObjects) ProcessTextObject(obj); - m_LineObj.clear(); + mTextObjects.clear(); CloseTempLine(); } @@ -723,30 +724,30 @@ if (fabs(pTextObj->GetRect().Width()) < kSizeEpsilon) return; - size_t count = m_LineObj.size(); - PDFTEXT_Obj Obj; - Obj.m_pTextObj = pTextObj; - Obj.m_formMatrix = formMatrix; + size_t count = mTextObjects.size(); + TransformedTextObject new_obj; + new_obj.m_pTextObj = pTextObj; + new_obj.m_formMatrix = formMatrix; if (count == 0) { - m_LineObj.push_back(Obj); + mTextObjects.push_back(new_obj); return; } if (IsSameAsPreTextObject(pTextObj, pObjList, ObjPos)) return; - PDFTEXT_Obj prev_Obj = m_LineObj[count - 1]; - size_t nItem = prev_Obj.m_pTextObj->CountItems(); + TransformedTextObject prev_obj = mTextObjects[count - 1]; + size_t nItem = prev_obj.m_pTextObj->CountItems(); if (nItem == 0) return; CPDF_TextObjectItem item; - prev_Obj.m_pTextObj->GetItemInfo(nItem - 1, &item); + prev_obj.m_pTextObj->GetItemInfo(nItem - 1, &item); float prev_width = - GetCharWidth(item.m_CharCode, prev_Obj.m_pTextObj->GetFont().Get()) * - prev_Obj.m_pTextObj->GetFontSize() / 1000; + GetCharWidth(item.m_CharCode, prev_obj.m_pTextObj->GetFont().Get()) * + prev_obj.m_pTextObj->GetFontSize() / 1000; CFX_Matrix prev_matrix = - prev_Obj.m_pTextObj->GetTextMatrix() * prev_Obj.m_formMatrix; + prev_obj.m_pTextObj->GetTextMatrix() * prev_obj.m_formMatrix; prev_width = prev_matrix.TransformDistance(fabs(prev_width)); pTextObj->GetItemInfo(0, &item); float this_width = GetCharWidth(item.m_CharCode, pTextObj->GetFont().Get()) * @@ -758,33 +759,32 @@ float threshold = std::max(prev_width, this_width) / 4; CFX_PointF prev_pos = m_DisplayMatrix.Transform( - prev_Obj.m_formMatrix.Transform(prev_Obj.m_pTextObj->GetPos())); + prev_obj.m_formMatrix.Transform(prev_obj.m_pTextObj->GetPos())); CFX_PointF this_pos = m_DisplayMatrix.Transform(formMatrix.Transform(pTextObj->GetPos())); if (fabs(this_pos.y - prev_pos.y) > threshold * 2) { for (size_t i = 0; i < count; ++i) - ProcessTextObject(m_LineObj[i]); - m_LineObj.clear(); - m_LineObj.push_back(Obj); + ProcessTextObject(mTextObjects[i]); + mTextObjects.clear(); + mTextObjects.push_back(new_obj); return; } for (size_t i = count; i > 0; --i) { - PDFTEXT_Obj prev_text_obj = m_LineObj[i - 1]; + TransformedTextObject prev_text_obj = mTextObjects[i - 1]; CFX_PointF new_prev_pos = m_DisplayMatrix.Transform(prev_text_obj.m_formMatrix.Transform( prev_text_obj.m_pTextObj->GetPos())); if (this_pos.x >= new_prev_pos.x) { - m_LineObj.insert(m_LineObj.begin() + i, Obj); + mTextObjects.insert(mTextObjects.begin() + i, new_obj); return; } } - m_LineObj.insert(m_LineObj.begin(), Obj); + mTextObjects.insert(mTextObjects.begin(), new_obj); } CPDF_TextPage::MarkedContentState CPDF_TextPage::PreMarkedContent( - PDFTEXT_Obj Obj) { - CPDF_TextObject* pTextObj = Obj.m_pTextObj.Get(); + const CPDF_TextObject* pTextObj) { size_t nContentMarks = pTextObj->m_ContentMarks.CountItems(); if (nContentMarks == 0) return MarkedContentState::kPass; @@ -842,8 +842,8 @@ return MarkedContentState::kDelay; } -void CPDF_TextPage::ProcessMarkedContent(PDFTEXT_Obj Obj) { - CPDF_TextObject* pTextObj = Obj.m_pTextObj.Get(); +void CPDF_TextPage::ProcessMarkedContent(const TransformedTextObject& obj) { + CPDF_TextObject* pTextObj = obj.m_pTextObj.Get(); size_t nContentMarks = pTextObj->m_ContentMarks.CountItems(); if (nContentMarks == 0) @@ -860,7 +860,7 @@ return; RetainPtr<CPDF_Font> pFont = pTextObj->GetFont(); - CFX_Matrix matrix = pTextObj->GetTextMatrix() * Obj.m_formMatrix; + CFX_Matrix matrix = pTextObj->GetTextMatrix() * obj.m_formMatrix; for (size_t k = 0; k < actText.GetLength(); ++k) { wchar_t wChar = actText[k]; @@ -907,27 +907,27 @@ std::swap(pTempBuffer[i], pTempBuffer[j]); } -void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { - CPDF_TextObject* pTextObj = Obj.m_pTextObj.Get(); +void CPDF_TextPage::ProcessTextObject(const TransformedTextObject& obj) { + CPDF_TextObject* const pTextObj = obj.m_pTextObj.Get(); if (fabs(pTextObj->GetRect().Width()) < kSizeEpsilon) return; - CFX_Matrix formMatrix = Obj.m_formMatrix; + CFX_Matrix form_matrix = obj.m_formMatrix; RetainPtr<CPDF_Font> pFont = pTextObj->GetFont(); - CFX_Matrix matrix = pTextObj->GetTextMatrix() * formMatrix; - MarkedContentState ePreMKC = PreMarkedContent(Obj); + CFX_Matrix matrix = pTextObj->GetTextMatrix() * form_matrix; + MarkedContentState ePreMKC = PreMarkedContent(obj.m_pTextObj.Get()); if (ePreMKC == MarkedContentState::kDone) { m_pPrevTextObj = pTextObj; - m_PrevMatrix = formMatrix; + m_PrevMatrix = form_matrix; return; } GenerateCharacter result = GenerateCharacter::kNone; if (m_pPrevTextObj) { - result = ProcessInsertObject(pTextObj, formMatrix); + result = ProcessInsertObject(pTextObj, form_matrix); if (result == GenerateCharacter::kLineBreak) - m_CurlineRect = Obj.m_pTextObj->GetRect(); + m_CurlineRect = pTextObj->GetRect(); else - m_CurlineRect.Union(Obj.m_pTextObj->GetRect()); + m_CurlineRect.Union(obj.m_pTextObj->GetRect()); switch (result) { case GenerateCharacter::kNone: @@ -935,8 +935,8 @@ case GenerateCharacter::kSpace: { Optional<CharInfo> pGenerateChar = GenerateCharInfo(L' '); if (pGenerateChar) { - if (!formMatrix.IsIdentity()) - pGenerateChar->m_Matrix = formMatrix; + if (!form_matrix.IsIdentity()) + pGenerateChar->m_Matrix = form_matrix; m_TempTextBuf.AppendChar(L' '); m_TempCharList.push_back(*pGenerateChar); } @@ -945,8 +945,8 @@ case GenerateCharacter::kLineBreak: CloseTempLine(); if (m_TextBuf.GetSize()) { - AppendGeneratedCharacter(L'\r', formMatrix); - AppendGeneratedCharacter(L'\n', formMatrix); + AppendGeneratedCharacter(L'\r', form_matrix); + AppendGeneratedCharacter(L'\n', form_matrix); } break; case GenerateCharacter::kHyphen: @@ -974,17 +974,17 @@ break; } } else { - m_CurlineRect = Obj.m_pTextObj->GetRect(); + m_CurlineRect = pTextObj->GetRect(); } if (ePreMKC == MarkedContentState::kDelay) { - ProcessMarkedContent(Obj); + ProcessMarkedContent(obj); m_pPrevTextObj = pTextObj; - m_PrevMatrix = formMatrix; + m_PrevMatrix = form_matrix; return; } m_pPrevTextObj = pTextObj; - m_PrevMatrix = formMatrix; + m_PrevMatrix = form_matrix; float baseSpace = CalculateBaseSpace(pTextObj, matrix); const bool bR2L = IsRightToLeft(*pTextObj, *pFont); @@ -1039,7 +1039,7 @@ charinfo.m_Index = m_TextBuf.GetLength(); m_TempTextBuf.AppendChar(L' '); charinfo.m_CharCode = CPDF_Font::kInvalidCharCode; - charinfo.m_Matrix = formMatrix; + charinfo.m_Matrix = form_matrix; charinfo.m_Origin = matrix.Transform(item.m_Origin); charinfo.m_CharBox = CFX_FloatRect(charinfo.m_Origin.x, charinfo.m_Origin.y,
diff --git a/core/fpdftext/cpdf_textpage.h b/core/fpdftext/cpdf_textpage.h index bac7181..37cb095 100644 --- a/core/fpdftext/cpdf_textpage.h +++ b/core/fpdftext/cpdf_textpage.h
@@ -23,15 +23,6 @@ class CPDF_Page; class CPDF_TextObject; -struct PDFTEXT_Obj { - PDFTEXT_Obj(); - PDFTEXT_Obj(const PDFTEXT_Obj& that); - ~PDFTEXT_Obj(); - - UnownedPtr<CPDF_TextObject> m_pTextObj; - CFX_Matrix m_formMatrix; -}; - class CPDF_TextPage { public: enum class CharType : uint8_t { @@ -100,12 +91,21 @@ enum class MarkedContentState { kPass = 0, kDone, kDelay }; + struct TransformedTextObject { + TransformedTextObject(); + TransformedTextObject(const TransformedTextObject& that); + ~TransformedTextObject(); + + UnownedPtr<CPDF_TextObject> m_pTextObj; + CFX_Matrix m_formMatrix; + }; + void Init(); bool IsHyphen(wchar_t curChar) const; void ProcessObject(); void ProcessFormObject(CPDF_FormObject* pFormObj, const CFX_Matrix& formMatrix); - void ProcessTextObject(PDFTEXT_Obj pObj); + void ProcessTextObject(const TransformedTextObject& obj); void ProcessTextObject(CPDF_TextObject* pTextObj, const CFX_Matrix& formMatrix, const CPDF_PageObjectHolder* pObjList, @@ -120,8 +120,8 @@ bool IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2) const; void CloseTempLine(); - MarkedContentState PreMarkedContent(PDFTEXT_Obj pObj); - void ProcessMarkedContent(PDFTEXT_Obj pObj); + MarkedContentState PreMarkedContent(const CPDF_TextObject* pTextObj); + void ProcessMarkedContent(const TransformedTextObject& obj); void FindPreviousTextObject(); void AddCharInfoByLRDirection(wchar_t wChar, const CharInfo& info); void AddCharInfoByRLDirection(wchar_t wChar, const CharInfo& info); @@ -144,7 +144,7 @@ const bool m_rtl; const CFX_Matrix m_DisplayMatrix; std::vector<CFX_FloatRect> m_SelRects; - std::vector<PDFTEXT_Obj> m_LineObj; + std::vector<TransformedTextObject> mTextObjects; TextOrientation m_TextlineDir = TextOrientation::kUnknown; CFX_FloatRect m_CurlineRect; };