Encapsulate `CPDF_TextPage::CharInfo::m_Matrix`
- Add getter and setter.
- Rename member to "matrix_".
- Rename various "formMatrix" variables to "form_matrix".
Change-Id: I92612a9b9104b87b34d3b0e74ea9b7e8dec4fb59
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/124730
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Tom Sepez <tsepez@google.com>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index 1e4b6de..6ba3539 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -254,9 +254,9 @@
int ascent = charinfo.m_pTextObj->GetFont()->GetTypeAscent();
int descent = charinfo.m_pTextObj->GetFont()->GetTypeDescent();
if (ascent != descent) {
- float width = charinfo.m_Matrix.a *
+ float width = charinfo.matrix().a *
charinfo.m_pTextObj->GetCharWidth(charinfo.m_CharCode);
- float font_scale = charinfo.m_Matrix.a * font_size / (ascent - descent);
+ float font_scale = charinfo.matrix().a * font_size / (ascent - descent);
float left = charinfo.m_Origin.x;
float right = charinfo.m_Origin.x + (is_vert_writing ? -width : width);
@@ -613,14 +613,15 @@
}
void CPDF_TextPage::AppendGeneratedCharacter(wchar_t unicode,
- const CFX_Matrix& formMatrix) {
+ const CFX_Matrix& form_matrix) {
std::optional<CharInfo> pGenerateChar = GenerateCharInfo(unicode);
if (!pGenerateChar.has_value())
return;
m_TextBuf.AppendChar(unicode);
- if (!formMatrix.IsIdentity())
- pGenerateChar->m_Matrix = formMatrix;
+ if (!form_matrix.IsIdentity()) {
+ pGenerateChar->set_matrix(form_matrix);
+ }
m_CharList.push_back(pGenerateChar.value());
}
@@ -645,8 +646,8 @@
}
void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj,
- const CFX_Matrix& formMatrix) {
- CFX_Matrix curFormMatrix = pFormObj->form_matrix() * formMatrix;
+ const CFX_Matrix& form_matrix) {
+ CFX_Matrix curFormMatrix = pFormObj->form_matrix() * form_matrix;
const CPDF_PageObjectHolder* pHolder = pFormObj->form();
for (auto it = pHolder->begin(); it != pHolder->end(); ++it) {
CPDF_PageObject* pPageObj = it->get();
@@ -752,7 +753,7 @@
void CPDF_TextPage::ProcessTextObject(
CPDF_TextObject* pTextObj,
- const CFX_Matrix& formMatrix,
+ const CFX_Matrix& form_matrix,
const CPDF_PageObjectHolder* pObjList,
CPDF_PageObjectHolder::const_iterator ObjPos) {
if (fabs(pTextObj->GetRect().Width()) < kSizeEpsilon)
@@ -761,7 +762,7 @@
size_t count = mTextObjects.size();
TransformedTextObject new_obj;
new_obj.m_pTextObj = pTextObj;
- new_obj.m_formMatrix = formMatrix;
+ new_obj.m_formMatrix = form_matrix;
if (count == 0) {
mTextObjects.push_back(new_obj);
return;
@@ -787,14 +788,14 @@
pTextObj->GetFontSize() / 1000;
this_width = fabs(this_width);
- CFX_Matrix this_matrix = pTextObj->GetTextMatrix() * formMatrix;
+ CFX_Matrix this_matrix = pTextObj->GetTextMatrix() * form_matrix;
this_width = this_matrix.TransformDistance(fabs(this_width));
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()));
CFX_PointF this_pos =
- m_DisplayMatrix.Transform(formMatrix.Transform(pTextObj->GetPos()));
+ m_DisplayMatrix.Transform(form_matrix.Transform(pTextObj->GetPos()));
if (fabs(this_pos.y - prev_pos.y) > threshold * 2) {
for (size_t i = 0; i < count; ++i)
ProcessTextObject(mTextObjects[i]);
@@ -920,7 +921,7 @@
charinfo.m_pTextObj = pTextObj;
charinfo.m_CharBox = CFX_FloatRect(rect);
charinfo.m_CharBox.Translate(k * step, 0);
- charinfo.m_Matrix = matrix;
+ charinfo.set_matrix(matrix);
m_TempTextBuf.AppendChar(wChar);
m_TempCharList.push_back(charinfo);
}
@@ -983,7 +984,7 @@
std::optional<CharInfo> pGenerateChar = GenerateCharInfo(L' ');
if (pGenerateChar.has_value()) {
if (!form_matrix.IsIdentity())
- pGenerateChar->m_Matrix = form_matrix;
+ pGenerateChar->set_matrix(form_matrix);
m_TempTextBuf.AppendChar(L' ');
m_TempCharList.push_back(pGenerateChar.value());
}
@@ -1083,7 +1084,7 @@
charinfo.m_Index = m_TextBuf.GetLength();
m_TempTextBuf.AppendChar(L' ');
charinfo.m_CharCode = CPDF_Font::kInvalidCharCode;
- charinfo.m_Matrix = form_matrix;
+ charinfo.set_matrix(form_matrix);
charinfo.m_Origin = matrix.Transform(item.m_Origin);
charinfo.m_CharBox =
CFX_FloatRect(charinfo.m_Origin.x, charinfo.m_Origin.y,
@@ -1124,7 +1125,7 @@
charinfo.m_CharBox.left + pTextObj->GetCharWidth(charinfo.m_CharCode);
}
charinfo.m_CharBox = matrix.TransformRect(charinfo.m_CharBox);
- charinfo.m_Matrix = matrix;
+ charinfo.set_matrix(matrix);
if (wstrItem.IsEmpty()) {
charinfo.m_Unicode = 0;
m_TempCharList.push_back(charinfo);
@@ -1135,7 +1136,7 @@
bool bDel = false;
const int count = std::min(fxcrt::CollectionSize<int>(m_TempCharList), 7);
constexpr float kTextCharRatioGapDelta = 0.07f;
- float threshold = charinfo.m_Matrix.TransformXDistance(
+ float threshold = charinfo.matrix().TransformXDistance(
kTextCharRatioGapDelta * pTextObj->GetFontSize());
for (int n = fxcrt::CollectionSize<int>(m_TempCharList);
n > fxcrt::CollectionSize<int>(m_TempCharList) - count; --n) {
@@ -1234,7 +1235,7 @@
CPDF_TextPage::GenerateCharacter CPDF_TextPage::ProcessInsertObject(
const CPDF_TextObject* pObj,
- const CFX_Matrix& formMatrix) {
+ const CFX_Matrix& form_matrix) {
FindPreviousTextObject();
TextOrientation WritingMode = GetTextObjectWritingMode(pObj);
if (WritingMode == TextOrientation::kUnknown)
@@ -1278,7 +1279,8 @@
CFX_Matrix prev_matrix = m_pPrevTextObj->GetTextMatrix() * m_PrevMatrix;
CFX_Matrix prev_reverse = prev_matrix.GetInverse();
- CFX_PointF pos = prev_reverse.Transform(formMatrix.Transform(pObj->GetPos()));
+ CFX_PointF pos =
+ prev_reverse.Transform(form_matrix.Transform(pObj->GetPos()));
if (last_width < this_width)
threshold = prev_reverse.TransformDistance(threshold);
@@ -1330,7 +1332,7 @@
if (preChar == L' ')
return GenerateCharacter::kNone;
- CFX_Matrix matrix = pObj->GetTextMatrix() * formMatrix;
+ CFX_Matrix matrix = pObj->GetTextMatrix() * form_matrix;
float threshold2 = std::max(nLastWidth, nThisWidth);
threshold2 = NormalizeThreshold(threshold2, 400, 700, 800);
if (nLastWidth >= nThisWidth) {
diff --git a/core/fpdftext/cpdf_textpage.h b/core/fpdftext/cpdf_textpage.h
index 5ec92c6..297dd86 100644
--- a/core/fpdftext/cpdf_textpage.h
+++ b/core/fpdftext/cpdf_textpage.h
@@ -49,6 +49,9 @@
CharInfo(const CharInfo&);
~CharInfo();
+ const CFX_Matrix& matrix() const { return matrix_; }
+ void set_matrix(const CFX_Matrix& matrix) { matrix_ = matrix; }
+
int m_Index = 0;
uint32_t m_CharCode = 0;
wchar_t m_Unicode = 0;
@@ -56,7 +59,9 @@
CFX_PointF m_Origin;
CFX_FloatRect m_CharBox;
UnownedPtr<CPDF_TextObject> m_pTextObj;
- CFX_Matrix m_Matrix;
+
+ private:
+ CFX_Matrix matrix_;
};
CPDF_TextPage(const CPDF_Page* pPage, bool rtl);
@@ -116,14 +121,14 @@
bool IsHyphen(wchar_t curChar) const;
void ProcessObject();
void ProcessFormObject(CPDF_FormObject* pFormObj,
- const CFX_Matrix& formMatrix);
+ const CFX_Matrix& form_matrix);
void ProcessTextObject(const TransformedTextObject& obj);
void ProcessTextObject(CPDF_TextObject* pTextObj,
- const CFX_Matrix& formMatrix,
+ const CFX_Matrix& form_matrix,
const CPDF_PageObjectHolder* pObjList,
CPDF_PageObjectHolder::const_iterator ObjPos);
GenerateCharacter ProcessInsertObject(const CPDF_TextObject* pObj,
- const CFX_Matrix& formMatrix);
+ const CFX_Matrix& form_matrix);
const CharInfo* GetPrevCharInfo() const;
std::optional<CharInfo> GenerateCharInfo(wchar_t unicode);
bool IsSameAsPreTextObject(CPDF_TextObject* pTextObj,
@@ -140,7 +145,7 @@
TextOrientation GetTextObjectWritingMode(
const CPDF_TextObject* pTextObj) const;
TextOrientation FindTextlineFlowOrientation() const;
- void AppendGeneratedCharacter(wchar_t unicode, const CFX_Matrix& formMatrix);
+ void AppendGeneratedCharacter(wchar_t unicode, const CFX_Matrix& form_matrix);
void SwapTempTextBuf(size_t iCharListStartAppend, size_t iBufStartAppend);
WideString GetTextByPredicate(
const std::function<bool(const CharInfo&)>& predicate) const;
diff --git a/fpdfsdk/fpdf_text.cpp b/fpdfsdk/fpdf_text.cpp
index 818ca40..5fa9fb6 100644
--- a/fpdfsdk/fpdf_text.cpp
+++ b/fpdfsdk/fpdf_text.cpp
@@ -226,7 +226,7 @@
// | c d 0 | | sin(t) cos(t) 0 |
// | e f 1 | | 0 0 1 |
// Calculate the angle of the vector
- float angle = atan2f(charinfo.m_Matrix.c, charinfo.m_Matrix.a);
+ float angle = atan2f(charinfo.matrix().c, charinfo.matrix().a);
if (angle < 0)
angle = 2 * FXSYS_PI + angle;
@@ -278,7 +278,7 @@
return false;
const CPDF_TextPage::CharInfo& charinfo = textpage->GetCharInfo(index);
- *matrix = FSMatrixFromCFXMatrix(charinfo.m_Matrix);
+ *matrix = FSMatrixFromCFXMatrix(charinfo.matrix());
return true;
}