Encapsulate CPDF_AllStates member variables
Only allow access via getters/setters.
Bug: pdfium:1680
Change-Id: Ic129433374abd30979daf3caec5e8e4f2ea66e25
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/113510
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_allstates.cpp b/core/fpdfapi/page/cpdf_allstates.cpp
index e26c931..e9263a7 100644
--- a/core/fpdfapi/page/cpdf_allstates.cpp
+++ b/core/fpdfapi/page/cpdf_allstates.cpp
@@ -170,3 +170,31 @@
}
m_GeneralState.SetMatrix(m_CTM);
}
+
+void CPDF_AllStates::ResetTextPosition() {
+ m_TextLinePos = CFX_PointF();
+ m_TextPos = CFX_PointF();
+}
+
+CFX_PointF CPDF_AllStates::GetTransformedTextPosition() const {
+ return m_CTM.Transform(m_TextMatrix.Transform(
+ CFX_PointF(m_TextPos.x, m_TextPos.y + m_TextRise)));
+}
+
+void CPDF_AllStates::MoveTextPoint(const CFX_PointF& point) {
+ m_TextLinePos += point;
+ m_TextPos = m_TextLinePos;
+}
+
+void CPDF_AllStates::MoveTextToNextLine() {
+ m_TextLinePos.y -= m_TextLeading;
+ m_TextPos = m_TextLinePos;
+}
+
+void CPDF_AllStates::IncrementTextPositionX(float value) {
+ m_TextPos.x += value;
+}
+
+void CPDF_AllStates::IncrementTextPositionY(float value) {
+ m_TextPos.y += value;
+}
diff --git a/core/fpdfapi/page/cpdf_allstates.h b/core/fpdfapi/page/cpdf_allstates.h
index 0ae2802..4bdc1d9 100644
--- a/core/fpdfapi/page/cpdf_allstates.h
+++ b/core/fpdfapi/page/cpdf_allstates.h
@@ -24,6 +24,35 @@
CPDF_StreamContentParser* pParser);
void SetLineDash(const CPDF_Array* pArray, float phase, float scale);
+ CFX_PointF GetTransformedTextPosition() const;
+ void ResetTextPosition();
+ void MoveTextPoint(const CFX_PointF& point);
+ void MoveTextToNextLine();
+ void IncrementTextPositionX(float value);
+ void IncrementTextPositionY(float value);
+
+ const CFX_Matrix& text_matrix() const { return m_TextMatrix; }
+ void set_text_matrix(const CFX_Matrix& matrix) { m_TextMatrix = matrix; }
+
+ const CFX_Matrix& current_transformation_matrix() const { return m_CTM; }
+ void set_current_transformation_matrix(const CFX_Matrix& matrix) {
+ m_CTM = matrix;
+ }
+ void prepend_to_current_transformation_matrix(const CFX_Matrix& matrix) {
+ m_CTM = matrix * m_CTM;
+ }
+
+ const CFX_Matrix& parent_matrix() const { return m_ParentMatrix; }
+ void set_parent_matrix(const CFX_Matrix& matrix) { m_ParentMatrix = matrix; }
+
+ void set_text_leading(float value) { m_TextLeading = value; }
+
+ void set_text_rise(float value) { m_TextRise = value; }
+
+ float text_horz_scale() const { return m_TextHorzScale; }
+ void set_text_horz_scale(float value) { m_TextHorzScale = value; }
+
+ private:
CFX_Matrix m_TextMatrix;
CFX_Matrix m_CTM;
CFX_Matrix m_ParentMatrix;
diff --git a/core/fpdfapi/page/cpdf_contentparser.cpp b/core/fpdfapi/page/cpdf_contentparser.cpp
index 1fbcb0b..8df2a6c 100644
--- a/core/fpdfapi/page/cpdf_contentparser.cpp
+++ b/core/fpdfapi/page/cpdf_contentparser.cpp
@@ -70,7 +70,7 @@
CFX_Matrix form_matrix =
m_pPageObjectHolder->GetDict()->GetMatrixFor("Matrix");
if (pGraphicStates)
- form_matrix.Concat(pGraphicStates->m_CTM);
+ form_matrix.Concat(pGraphicStates->current_transformation_matrix());
RetainPtr<const CPDF_Array> pBBox =
m_pPageObjectHolder->GetDict()->GetArrayFor("BBox");
@@ -97,8 +97,8 @@
m_pPageObjectHolder->GetMutableResources(), pParentMatrix,
m_pPageObjectHolder, std::move(pResources), form_bbox, pGraphicStates,
recursion_state);
- m_pParser->GetCurStates()->m_CTM = form_matrix;
- m_pParser->GetCurStates()->m_ParentMatrix = form_matrix;
+ m_pParser->GetCurStates()->set_current_transformation_matrix(form_matrix);
+ m_pParser->GetCurStates()->set_parent_matrix(form_matrix);
if (ClipPath.HasRef()) {
m_pParser->GetCurStates()->m_ClipPath.AppendPathWithAutoMerge(
ClipPath, CFX_FillRenderOptions::FillType::kWinding);
diff --git a/core/fpdfapi/page/cpdf_pageobjectholder.cpp b/core/fpdfapi/page/cpdf_pageobjectholder.cpp
index 8aa30ca..d52f129 100644
--- a/core/fpdfapi/page/cpdf_pageobjectholder.cpp
+++ b/core/fpdfapi/page/cpdf_pageobjectholder.cpp
@@ -69,8 +69,9 @@
m_ParseState = ParseState::kParsed;
m_pDocument->IncrementParsedPageCount();
- if (m_pParser->GetCurStates())
- m_LastCTM = m_pParser->GetCurStates()->m_CTM;
+ if (m_pParser->GetCurStates()) {
+ m_LastCTM = m_pParser->GetCurStates()->current_transformation_matrix();
+ }
m_pParser.reset();
}
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 7078804..d49ecee 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -675,10 +675,9 @@
}
void CPDF_StreamContentParser::Handle_BeginText() {
- m_pCurStates->m_TextMatrix = CFX_Matrix();
+ m_pCurStates->set_text_matrix(CFX_Matrix());
OnChangeTextMatrix();
- m_pCurStates->m_TextPos = CFX_PointF();
- m_pCurStates->m_TextLinePos = CFX_PointF();
+ m_pCurStates->ResetTextPosition();
}
void CPDF_StreamContentParser::Handle_CurveTo_123() {
@@ -688,7 +687,7 @@
}
void CPDF_StreamContentParser::Handle_ConcatMatrix() {
- m_pCurStates->m_CTM = GetMatrix() * m_pCurStates->m_CTM;
+ m_pCurStates->prepend_to_current_transformation_matrix(GetMatrix());
OnChangeTextMatrix();
}
@@ -791,7 +790,8 @@
m_pDocument, m_pPageResources, std::move(pStream), m_pResources.Get());
form->ParseContent(&status, nullptr, m_RecursionState);
- CFX_Matrix matrix = m_pCurStates->m_CTM * m_mtContentToUser;
+ CFX_Matrix matrix =
+ m_pCurStates->current_transformation_matrix() * m_mtContentToUser;
auto pFormObj = std::make_unique<CPDF_FormObject>(GetCurrentStreamIndex(),
std::move(form), matrix);
pFormObj->SetResourceName(name);
@@ -845,7 +845,8 @@
SetGraphicStates(pImageObj.get(), pImageObj->GetImage()->IsMask(), false,
false);
- CFX_Matrix ImageMatrix = m_pCurStates->m_CTM * m_mtContentToUser;
+ CFX_Matrix ImageMatrix =
+ m_pCurStates->current_transformation_matrix() * m_mtContentToUser;
pImageObj->SetImageMatrix(ImageMatrix);
CPDF_ImageObject* pRet = pImageObj.get();
@@ -1111,7 +1112,8 @@
if (!pShading->IsShadingObject() || !pShading->Load())
return;
- CFX_Matrix matrix = m_pCurStates->m_CTM * m_mtContentToUser;
+ CFX_Matrix matrix =
+ m_pCurStates->current_transformation_matrix() * m_mtContentToUser;
auto pObj = std::make_unique<CPDF_ShadingObject>(GetCurrentStreamIndex(),
pShading, matrix);
SetGraphicStates(pObj.get(), false, false, false);
@@ -1128,13 +1130,12 @@
}
void CPDF_StreamContentParser::Handle_MoveTextPoint() {
- m_pCurStates->m_TextLinePos += GetPoint(0);
- m_pCurStates->m_TextPos = m_pCurStates->m_TextLinePos;
+ m_pCurStates->MoveTextPoint(GetPoint(0));
}
void CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading() {
Handle_MoveTextPoint();
- m_pCurStates->m_TextLeading = -GetNumber(0);
+ m_pCurStates->set_text_leading(-GetNumber(0));
}
void CPDF_StreamContentParser::Handle_SetFont() {
@@ -1223,7 +1224,7 @@
if (!pPattern || (!pPattern->IsDictionary() && !pPattern->IsStream()))
return nullptr;
return CPDF_DocPageData::FromDocument(m_pDocument)
- ->GetPattern(std::move(pPattern), m_pCurStates->m_ParentMatrix);
+ ->GetPattern(std::move(pPattern), m_pCurStates->parent_matrix());
}
RetainPtr<CPDF_ShadingPattern> CPDF_StreamContentParser::FindShading(
@@ -1232,7 +1233,7 @@
if (!pPattern || (!pPattern->IsDictionary() && !pPattern->IsStream()))
return nullptr;
return CPDF_DocPageData::FromDocument(m_pDocument)
- ->GetShading(std::move(pPattern), m_pCurStates->m_ParentMatrix);
+ ->GetShading(std::move(pPattern), m_pCurStates->parent_matrix());
}
void CPDF_StreamContentParser::AddTextObject(const ByteString* pStrs,
@@ -1245,9 +1246,10 @@
if (fInitKerning != 0) {
if (pFont->IsVertWriting())
- m_pCurStates->m_TextPos.y -= GetVerticalTextSize(fInitKerning);
+ m_pCurStates->IncrementTextPositionY(-GetVerticalTextSize(fInitKerning));
else
- m_pCurStates->m_TextPos.x -= GetHorizontalTextSize(fInitKerning);
+ m_pCurStates->IncrementTextPositionX(
+ -GetHorizontalTextSize(fInitKerning));
}
if (nSegs == 0)
return;
@@ -1260,35 +1262,37 @@
pText->SetResourceName(pFont->GetResourceName());
SetGraphicStates(pText.get(), true, true, true);
if (TextRenderingModeIsStrokeMode(text_mode)) {
- pdfium::span<float> pCTM = pText->m_TextState.GetMutableCTM();
- pCTM[0] = m_pCurStates->m_CTM.a;
- pCTM[1] = m_pCurStates->m_CTM.c;
- pCTM[2] = m_pCurStates->m_CTM.b;
- pCTM[3] = m_pCurStates->m_CTM.d;
+ const CFX_Matrix& ctm = m_pCurStates->current_transformation_matrix();
+ pdfium::span<float> text_ctm = pText->m_TextState.GetMutableCTM();
+ text_ctm[0] = ctm.a;
+ text_ctm[1] = ctm.c;
+ text_ctm[2] = ctm.b;
+ text_ctm[3] = ctm.d;
}
pText->SetSegments(pStrs, kernings, nSegs);
- pText->SetPosition(
- m_mtContentToUser.Transform(m_pCurStates->m_CTM.Transform(
- m_pCurStates->m_TextMatrix.Transform(CFX_PointF(
- m_pCurStates->m_TextPos.x,
- m_pCurStates->m_TextPos.y + m_pCurStates->m_TextRise)))));
+ pText->SetPosition(m_mtContentToUser.Transform(
+ m_pCurStates->GetTransformedTextPosition()));
- m_pCurStates->m_TextPos +=
- pText->CalcPositionData(m_pCurStates->m_TextHorzScale);
+ const CFX_PointF position =
+ pText->CalcPositionData(m_pCurStates->text_horz_scale());
+ m_pCurStates->IncrementTextPositionX(position.x);
+ m_pCurStates->IncrementTextPositionY(position.y);
if (TextRenderingModeIsClipMode(text_mode))
m_ClipTextList.push_back(pText->Clone());
m_pObjectHolder->AppendPageObject(std::move(pText));
}
if (!kernings.empty() && kernings[nSegs - 1] != 0) {
if (pFont->IsVertWriting())
- m_pCurStates->m_TextPos.y -= GetVerticalTextSize(kernings[nSegs - 1]);
+ m_pCurStates->IncrementTextPositionY(
+ -GetVerticalTextSize(kernings[nSegs - 1]));
else
- m_pCurStates->m_TextPos.x -= GetHorizontalTextSize(kernings[nSegs - 1]);
+ m_pCurStates->IncrementTextPositionX(
+ -GetHorizontalTextSize(kernings[nSegs - 1]));
}
}
float CPDF_StreamContentParser::GetHorizontalTextSize(float fKerning) const {
- return GetVerticalTextSize(fKerning) * m_pCurStates->m_TextHorzScale;
+ return GetVerticalTextSize(fKerning) * m_pCurStates->text_horz_scale();
}
float CPDF_StreamContentParser::GetVerticalTextSize(float fKerning) const {
@@ -1324,7 +1328,7 @@
for (size_t i = 0; i < n; i++) {
float fKerning = pArray->GetFloatAt(i);
if (fKerning != 0)
- m_pCurStates->m_TextPos.x -= GetHorizontalTextSize(fKerning);
+ m_pCurStates->IncrementTextPositionX(-GetHorizontalTextSize(fKerning));
}
return;
}
@@ -1355,21 +1359,20 @@
}
void CPDF_StreamContentParser::Handle_SetTextLeading() {
- m_pCurStates->m_TextLeading = GetNumber(0);
+ m_pCurStates->set_text_leading(GetNumber(0));
}
void CPDF_StreamContentParser::Handle_SetTextMatrix() {
- m_pCurStates->m_TextMatrix = GetMatrix();
+ m_pCurStates->set_text_matrix(GetMatrix());
OnChangeTextMatrix();
- m_pCurStates->m_TextPos = CFX_PointF();
- m_pCurStates->m_TextLinePos = CFX_PointF();
+ m_pCurStates->ResetTextPosition();
}
void CPDF_StreamContentParser::OnChangeTextMatrix() {
- CFX_Matrix text_matrix(m_pCurStates->m_TextHorzScale, 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f);
- text_matrix.Concat(m_pCurStates->m_TextMatrix);
- text_matrix.Concat(m_pCurStates->m_CTM);
+ CFX_Matrix text_matrix(m_pCurStates->text_horz_scale(), 0.0f, 0.0f, 1.0f,
+ 0.0f, 0.0f);
+ text_matrix.Concat(m_pCurStates->text_matrix());
+ text_matrix.Concat(m_pCurStates->current_transformation_matrix());
text_matrix.Concat(m_mtContentToUser);
pdfium::span<float> pTextMatrix =
m_pCurStates->m_TextState.GetMutableMatrix();
@@ -1386,7 +1389,7 @@
}
void CPDF_StreamContentParser::Handle_SetTextRise() {
- m_pCurStates->m_TextRise = GetNumber(0);
+ m_pCurStates->set_text_rise(GetNumber(0));
}
void CPDF_StreamContentParser::Handle_SetWordSpace() {
@@ -1397,13 +1400,12 @@
if (m_ParamCount != 1) {
return;
}
- m_pCurStates->m_TextHorzScale = GetNumber(0) / 100;
+ m_pCurStates->set_text_horz_scale(GetNumber(0) / 100);
OnChangeTextMatrix();
}
void CPDF_StreamContentParser::Handle_MoveToNextLine() {
- m_pCurStates->m_TextLinePos.y -= m_pCurStates->m_TextLeading;
- m_pCurStates->m_TextPos = m_pCurStates->m_TextLinePos;
+ m_pCurStates->MoveTextToNextLine();
}
void CPDF_StreamContentParser::Handle_CurveTo_23() {
@@ -1524,7 +1526,8 @@
path.AppendPoint(point.m_Point, point.m_Type);
}
- CFX_Matrix matrix = m_pCurStates->m_CTM * m_mtContentToUser;
+ CFX_Matrix matrix =
+ m_pCurStates->current_transformation_matrix() * m_mtContentToUser;
bool bStroke = render_type == RenderType::kStroke;
if (bStroke || fill_type != CFX_FillRenderOptions::FillType::kNoFill) {
auto pPathObj = std::make_unique<CPDF_PathObject>(GetCurrentStreamIndex());