Remove some CFX_Matrix::Concat() calls.
CFX_Matrix m = m1 * m2; is equivalent to: m = m1; m1.Concat(m2);
Change-Id: I4876ff044f7876205b9f12ab6416d388073791ae
Reviewed-on: https://pdfium-review.googlesource.com/c/47490
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_page.cpp b/core/fpdfapi/page/cpdf_page.cpp
index 7746253..23bedae 100644
--- a/core/fpdfapi/page/cpdf_page.cpp
+++ b/core/fpdfapi/page/cpdf_page.cpp
@@ -207,11 +207,10 @@
y2 = rect.top;
break;
}
- CFX_Matrix matrix = m_PageMatrix;
- matrix.Concat(CFX_Matrix(
- (x2 - x0) / m_PageSize.width, (y2 - y0) / m_PageSize.width,
- (x1 - x0) / m_PageSize.height, (y1 - y0) / m_PageSize.height, x0, y0));
- return matrix;
+ CFX_Matrix matrix((x2 - x0) / m_PageSize.width, (y2 - y0) / m_PageSize.width,
+ (x1 - x0) / m_PageSize.height,
+ (y1 - y0) / m_PageSize.height, x0, y0);
+ return m_PageMatrix * matrix;
}
int CPDF_Page::GetPageRotation() const {
diff --git a/core/fpdfapi/page/cpdf_pattern.cpp b/core/fpdfapi/page/cpdf_pattern.cpp
index e2dc4f4..c6d3c54 100644
--- a/core/fpdfapi/page/cpdf_pattern.cpp
+++ b/core/fpdfapi/page/cpdf_pattern.cpp
@@ -17,6 +17,5 @@
void CPDF_Pattern::SetPatternToFormMatrix() {
const CPDF_Dictionary* pDict = pattern_obj()->GetDict();
- m_Pattern2Form = pDict->GetMatrixFor("Matrix");
- m_Pattern2Form.Concat(m_ParentMatrix);
+ m_Pattern2Form = pDict->GetMatrixFor("Matrix") * m_ParentMatrix;
}
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 2dfec54..ebdff44 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -694,8 +694,7 @@
void CPDF_StreamContentParser::Handle_ConcatMatrix() {
CFX_Matrix new_matrix(GetNumber(5), GetNumber(4), GetNumber(3), GetNumber(2),
GetNumber(1), GetNumber(0));
- new_matrix.Concat(m_pCurStates->m_CTM);
- m_pCurStates->m_CTM = new_matrix;
+ m_pCurStates->m_CTM = new_matrix * m_pCurStates->m_CTM;
OnChangeTextMatrix();
}
@@ -788,8 +787,7 @@
m_pDocument.Get(), m_pPageResources.Get(), pStream, m_pResources.Get());
form->ParseContent(&status, nullptr, nullptr, m_ParsedSet.Get());
- CFX_Matrix matrix = m_pCurStates->m_CTM;
- matrix.Concat(m_mtContentToUser);
+ CFX_Matrix matrix = m_pCurStates->m_CTM * m_mtContentToUser;
auto pFormObj = pdfium::MakeUnique<CPDF_FormObject>(GetCurrentStreamIndex(),
std::move(form), matrix);
@@ -839,8 +837,7 @@
SetGraphicStates(pImageObj.get(), pImageObj->GetImage()->IsMask(), false,
false);
- CFX_Matrix ImageMatrix = m_pCurStates->m_CTM;
- ImageMatrix.Concat(m_mtContentToUser);
+ CFX_Matrix ImageMatrix = m_pCurStates->m_CTM * m_mtContentToUser;
pImageObj->set_matrix(ImageMatrix);
pImageObj->CalcBoundingBox();
@@ -1094,8 +1091,7 @@
if (!pShading->IsShadingObject() || !pShading->Load())
return;
- CFX_Matrix matrix = m_pCurStates->m_CTM;
- matrix.Concat(m_mtContentToUser);
+ CFX_Matrix matrix = m_pCurStates->m_CTM * m_mtContentToUser;
auto pObj = pdfium::MakeUnique<CPDF_ShadingObject>(GetCurrentStreamIndex(),
pShading, matrix);
SetGraphicStates(pObj.get(), false, false, false);
@@ -1471,8 +1467,7 @@
for (const auto& point : PathPoints)
Path.AppendPoint(point.m_Point, point.m_Type, point.m_CloseFigure);
- CFX_Matrix matrix = m_pCurStates->m_CTM;
- matrix.Concat(m_mtContentToUser);
+ CFX_Matrix matrix = m_pCurStates->m_CTM * m_mtContentToUser;
if (bStroke || FillType) {
auto pPathObj =
pdfium::MakeUnique<CPDF_PathObject>(GetCurrentStreamIndex());
diff --git a/core/fpdfapi/page/cpdf_textobject.cpp b/core/fpdfapi/page/cpdf_textobject.cpp
index 13e7279..c554113 100644
--- a/core/fpdfapi/page/cpdf_textobject.cpp
+++ b/core/fpdfapi/page/cpdf_textobject.cpp
@@ -115,8 +115,7 @@
}
void CPDF_TextObject::Transform(const CFX_Matrix& matrix) {
- CFX_Matrix text_matrix = GetTextMatrix();
- text_matrix.Concat(matrix);
+ CFX_Matrix text_matrix = GetTextMatrix() * matrix;
float* pTextMatrix = m_TextState.GetMutableMatrix();
pTextMatrix[0] = text_matrix.a;
diff --git a/core/fpdfapi/render/cpdf_imagerenderer.cpp b/core/fpdfapi/render/cpdf_imagerenderer.cpp
index d1b9268..0494791 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.cpp
+++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp
@@ -164,8 +164,7 @@
!GetRenderOptions().GetOCContext()->CheckOCGVisible(pOC)) {
return false;
}
- m_ImageMatrix = m_pImageObject->matrix();
- m_ImageMatrix.Concat(*pObj2Device);
+ m_ImageMatrix = m_pImageObject->matrix() * *pObj2Device;
if (StartLoadDIBBase())
return true;
return StartRenderDIBBase();
diff --git a/core/fpdfapi/render/cpdf_rendercontext.cpp b/core/fpdfapi/render/cpdf_rendercontext.cpp
index 37197da..96b98a4 100644
--- a/core/fpdfapi/render/cpdf_rendercontext.cpp
+++ b/core/fpdfapi/render/cpdf_rendercontext.cpp
@@ -70,11 +70,11 @@
status.SetStopObject(pStopObj);
status.SetTransparency(layer.m_pObjectHolder->GetTransparency());
if (pLastMatrix) {
- CFX_Matrix FinalMatrix = layer.m_Matrix;
- FinalMatrix.Concat(*pLastMatrix);
- status.SetDeviceMatrix(*pLastMatrix);
+ const CFX_Matrix& last_matrix = *pLastMatrix;
+ CFX_Matrix final_matrix = layer.m_Matrix * last_matrix;
+ status.SetDeviceMatrix(last_matrix);
status.Initialize(nullptr, nullptr);
- status.RenderObjectList(layer.m_pObjectHolder.Get(), FinalMatrix);
+ status.RenderObjectList(layer.m_pObjectHolder.Get(), final_matrix);
} else {
status.Initialize(nullptr, nullptr);
status.RenderObjectList(layer.m_pObjectHolder.Get(), layer.m_Matrix);
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 5164862..007bd8f 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -343,8 +343,8 @@
ymax = pDomain->GetNumberAt(3);
}
CFX_Matrix mtDomain2Target = pDict->GetMatrixFor("Matrix");
- CFX_Matrix matrix = mtObject2Bitmap.GetInverse();
- matrix.Concat(mtDomain2Target.GetInverse());
+ CFX_Matrix matrix =
+ mtObject2Bitmap.GetInverse() * mtDomain2Target.GetInverse();
int width = pBitmap->GetWidth();
int height = pBitmap->GetHeight();
int pitch = pBitmap->GetPitch();
@@ -944,8 +944,7 @@
CFX_Matrix mtAdjust;
mtAdjust.MatchRect(bitmap_rect, cell_bbox);
- CFX_Matrix mtPattern2Bitmap = mtObject2Device;
- mtPattern2Bitmap.Concat(mtAdjust);
+ CFX_Matrix mtPattern2Bitmap = mtObject2Device * mtAdjust;
CPDF_RenderOptions options;
if (!pPattern->colored())
options.SetColorMode(CPDF_RenderOptions::kAlpha);
@@ -1188,8 +1187,7 @@
res)) {
return;
}
- CFX_Matrix matrix = mtObj2Device;
- matrix.Concat(*buffer.GetMatrix());
+ CFX_Matrix matrix = mtObj2Device * (*buffer.GetMatrix());
const CPDF_Dictionary* pFormResource = nullptr;
const CPDF_FormObject* pFormObj = pObj->AsForm();
if (pFormObj) {
@@ -1218,8 +1216,7 @@
!m_Options.GetOCContext()->CheckOCGVisible(pOC)) {
return true;
}
- CFX_Matrix matrix = pFormObj->form_matrix();
- matrix.Concat(mtObj2Device);
+ CFX_Matrix matrix = pFormObj->form_matrix() * mtObj2Device;
const CPDF_Dictionary* pFormDict = pFormObj->form()->GetDict();
const CPDF_Dictionary* pResources =
pFormDict ? pFormDict->GetDictFor("Resources") : nullptr;
@@ -1252,8 +1249,7 @@
uint32_t fill_argb = FillType ? GetFillArgb(pPathObj) : 0;
uint32_t stroke_argb = bStroke ? GetStrokeArgb(pPathObj) : 0;
- CFX_Matrix path_matrix = pPathObj->matrix();
- path_matrix.Concat(mtObj2Device);
+ CFX_Matrix path_matrix = pPathObj->matrix() * mtObj2Device;
if (!IsAvailableMatrix(path_matrix))
return true;
@@ -1416,8 +1412,7 @@
bool CPDF_RenderStatus::SelectClipPath(const CPDF_PathObject* pPathObj,
const CFX_Matrix& mtObj2Device,
bool bStroke) {
- CFX_Matrix path_matrix = pPathObj->matrix();
- path_matrix.Concat(mtObj2Device);
+ CFX_Matrix path_matrix = pPathObj->matrix() * mtObj2Device;
if (bStroke) {
CFX_GraphState graphState = pPathObj->m_GraphState;
if (m_Options.GetOptions().bThinLine)
@@ -1574,8 +1569,8 @@
#endif
m_bStopped = bitmap_render.m_bStopped;
if (pSMaskDict) {
- CFX_Matrix smask_matrix = *pPageObj->m_GeneralState.GetSMaskMatrix();
- smask_matrix.Concat(mtObj2Device);
+ CFX_Matrix smask_matrix =
+ *pPageObj->m_GeneralState.GetSMaskMatrix() * mtObj2Device;
RetainPtr<CFX_DIBBase> pSMaskSource =
LoadSMask(pSMaskDict, &rect, &smask_matrix);
if (pSMaskSource)
@@ -1755,8 +1750,7 @@
if (pCTM[0] != 1.0f || pCTM[3] != 1.0f) {
CFX_Matrix ctm(pCTM[0], pCTM[1], pCTM[2], pCTM[3], 0, 0);
text_matrix *= ctm.GetInverse();
- device_matrix = ctm;
- device_matrix.Concat(mtObj2Device);
+ device_matrix = ctm * mtObj2Device;
pDeviceMatrix = &device_matrix;
}
}
@@ -1906,8 +1900,7 @@
glyphs[iChar].m_Origin = origin;
}
} else {
- CFX_Matrix image_matrix = pType3Char->matrix();
- image_matrix.Concat(matrix);
+ CFX_Matrix image_matrix = pType3Char->matrix() * matrix;
CPDF_ImageRenderer renderer;
if (renderer.Start(this, pType3Char->GetBitmap(), fill_argb, 255,
&image_matrix, FXDIB_ResampleOptions(), false,
@@ -2052,8 +2045,7 @@
CPDF_DeviceBuffer buffer;
buffer.Initialize(m_pContext.Get(), m_pDevice, clip_rect_bbox,
m_pCurObj.Get(), 150);
- CFX_Matrix FinalMatrix = *pMatrix;
- FinalMatrix.Concat(*buffer.GetMatrix());
+ CFX_Matrix FinalMatrix = *pMatrix * (*buffer.GetMatrix());
RetainPtr<CFX_DIBitmap> pBitmap = buffer.GetBitmap();
if (!pBitmap->GetBuffer())
return;
@@ -2122,8 +2114,7 @@
if (rect.IsEmpty())
return;
- CFX_Matrix matrix = *pattern->pattern_to_form();
- matrix.Concat(mtObj2Device);
+ CFX_Matrix matrix = *pattern->pattern_to_form() * mtObj2Device;
int alpha =
FXSYS_round(255 * (bStroke ? pPageObj->m_GeneralState.GetStrokeAlpha()
: pPageObj->m_GeneralState.GetFillAlpha()));
@@ -2139,8 +2130,7 @@
if (rect.IsEmpty())
return;
- CFX_Matrix matrix = pShadingObj->matrix();
- matrix.Concat(mtObj2Device);
+ CFX_Matrix matrix = pShadingObj->matrix() * mtObj2Device;
DrawShading(pShadingObj->pattern(), &matrix, rect,
FXSYS_round(255 * pShadingObj->m_GeneralState.GetFillAlpha()),
m_Options.ColorModeIs(CPDF_RenderOptions::kAlpha));
@@ -2161,8 +2151,7 @@
if (clip_box.IsEmpty())
return;
- CFX_Matrix mtPattern2Device = *pPattern->pattern_to_form();
- mtPattern2Device.Concat(mtObj2Device);
+ CFX_Matrix mtPattern2Device = *pPattern->pattern_to_form() * mtObj2Device;
bool bAligned =
pPattern->bbox().left == 0 && pPattern->bbox().bottom == 0 &&
diff --git a/core/fpdfapi/render/cpdf_type3cache.cpp b/core/fpdfapi/render/cpdf_type3cache.cpp
index 4638fcc..a2412a8 100644
--- a/core/fpdfapi/render/cpdf_type3cache.cpp
+++ b/core/fpdfapi/render/cpdf_type3cache.cpp
@@ -122,8 +122,7 @@
return nullptr;
CFX_Matrix text_matrix(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, 0, 0);
- CFX_Matrix image_matrix = pChar->matrix();
- image_matrix.Concat(text_matrix);
+ CFX_Matrix image_matrix = pChar->matrix() * text_matrix;
RetainPtr<CFX_DIBitmap> pBitmap = pChar->GetBitmap();
RetainPtr<CFX_DIBitmap> pResBitmap;
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index 1a279e9..13d8f0c 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -635,8 +635,7 @@
if (pObjectList->empty())
return;
- CFX_Matrix curFormMatrix = pFormObj->form_matrix();
- curFormMatrix.Concat(formMatrix);
+ CFX_Matrix curFormMatrix = pFormObj->form_matrix() * formMatrix;
for (auto it = pObjectList->begin(); it != pObjectList->end(); ++it) {
CPDF_PageObject* pPageObj = it->get();
@@ -778,19 +777,16 @@
GetCharWidth(item.m_CharCode, prev_Obj.m_pTextObj->GetFont()) *
prev_Obj.m_pTextObj->GetFontSize() / 1000;
- CFX_Matrix prev_matrix = prev_Obj.m_pTextObj->GetTextMatrix();
- prev_width = fabs(prev_width);
- prev_matrix.Concat(prev_Obj.m_formMatrix);
- prev_width = prev_matrix.TransformDistance(prev_width);
+ CFX_Matrix prev_matrix =
+ 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()) *
pTextObj->GetFontSize() / 1000;
this_width = fabs(this_width);
- CFX_Matrix this_matrix = pTextObj->GetTextMatrix();
- this_width = fabs(this_width);
- this_matrix.Concat(formMatrix);
- this_width = this_matrix.TransformDistance(this_width);
+ CFX_Matrix this_matrix = pTextObj->GetTextMatrix() * formMatrix;
+ this_width = this_matrix.TransformDistance(fabs(this_width));
float threshold = std::max(prev_width, this_width) / 4;
CFX_PointF prev_pos = m_DisplayMatrix.Transform(
@@ -895,8 +891,7 @@
return;
CPDF_Font* pFont = pTextObj->GetFont();
- CFX_Matrix matrix = pTextObj->GetTextMatrix();
- matrix.Concat(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];
@@ -949,8 +944,7 @@
return;
CFX_Matrix formMatrix = Obj.m_formMatrix;
CPDF_Font* pFont = pTextObj->GetFont();
- CFX_Matrix matrix = pTextObj->GetTextMatrix();
- matrix.Concat(formMatrix);
+ CFX_Matrix matrix = pTextObj->GetTextMatrix() * formMatrix;
FPDFText_MarkedContent ePreMKC = PreMarkedContent(Obj);
if (ePreMKC == FPDFText_MarkedContent::Done) {
@@ -1275,9 +1269,7 @@
float this_width = fabs(nThisWidth * pObj->GetFontSize() / 1000);
float threshold = std::max(last_width, this_width) / 4;
- CFX_Matrix prev_matrix = m_pPreTextObj->GetTextMatrix();
- prev_matrix.Concat(m_perMatrix);
-
+ CFX_Matrix prev_matrix = m_pPreTextObj->GetTextMatrix() * m_perMatrix;
CFX_Matrix prev_reverse = prev_matrix.GetInverse();
CFX_PointF pos = prev_reverse.Transform(formMatrix.Transform(pObj->GetPos()));
@@ -1333,8 +1325,7 @@
if (preChar == L' ')
return GenerateCharacter::None;
- CFX_Matrix matrix = pObj->GetTextMatrix();
- matrix.Concat(formMatrix);
+ CFX_Matrix matrix = pObj->GetTextMatrix() * formMatrix;
float threshold2 = static_cast<float>(std::max(nLastWidth, nThisWidth));
threshold2 = NormalizeThreshold(threshold2, 400, 700, 800);
if (nLastWidth >= nThisWidth) {
diff --git a/core/fxge/agg/fx_agg_driver.cpp b/core/fxge/agg/fx_agg_driver.cpp
index e26121d..9bb159d 100644
--- a/core/fxge/agg/fx_agg_driver.cpp
+++ b/core/fxge/agg/fx_agg_driver.cpp
@@ -1361,8 +1361,7 @@
pObject2Device->a / matrix1.a, pObject2Device->b / matrix1.a,
pObject2Device->c / matrix1.d, pObject2Device->d / matrix1.d, 0, 0);
- matrix1 = *pObject2Device;
- matrix1.Concat(matrix2.GetInverse());
+ matrix1 = *pObject2Device * matrix2.GetInverse();
}
CAgg_PathData path_data;
diff --git a/core/fxge/win32/cfx_psrenderer.cpp b/core/fxge/win32/cfx_psrenderer.cpp
index 9f76bf0..830a868 100644
--- a/core/fxge/win32/cfx_psrenderer.cpp
+++ b/core/fxge/win32/cfx_psrenderer.cpp
@@ -598,7 +598,6 @@
CFX_Matrix(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
}
- matrix.Concat(CFX_Matrix(1.0f, 0, 0, 1.0f, 0, 0));
const CFX_PathData* pPathData = pFaceCache->LoadGlyphPath(
pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
if (!pPathData)
diff --git a/fpdfsdk/formfiller/cffl_formfiller.cpp b/fpdfsdk/formfiller/cffl_formfiller.cpp
index 50787b2..02d1450 100644
--- a/fpdfsdk/formfiller/cffl_formfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_formfiller.cpp
@@ -61,10 +61,9 @@
CPDFSDK_Annot* pAnnot,
CFX_RenderDevice* pDevice,
const CFX_Matrix& mtUser2Device) {
- if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false)) {
- CFX_Matrix mt = GetCurMatrix();
- mt.Concat(mtUser2Device);
- pWnd->DrawAppearance(pDevice, mt);
+ CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false);
+ if (pWnd) {
+ pWnd->DrawAppearance(pDevice, GetCurMatrix() * mtUser2Device);
return;
}
@@ -419,14 +418,11 @@
CFX_Matrix CFFL_FormFiller::GetWindowMatrix(
const CPWL_Wnd::PrivateData* pAttached) {
- CFX_Matrix mt;
const auto* pPrivateData = static_cast<const CFFL_PrivateData*>(pAttached);
if (!pPrivateData || !pPrivateData->pPageView)
- return mt;
+ return CFX_Matrix();
- mt = GetCurMatrix();
- mt.Concat(pPrivateData->pPageView->GetCurrentMatrix());
- return mt;
+ return GetCurMatrix() * pPrivateData->pPageView->GetCurrentMatrix();
}
CFX_Matrix CFFL_FormFiller::GetCurMatrix() {
diff --git a/fpdfsdk/fpdf_transformpage.cpp b/fpdfsdk/fpdf_transformpage.cpp
index 40ef160..076f22b 100644
--- a/fpdfsdk/fpdf_transformpage.cpp
+++ b/fpdfsdk/fpdf_transformpage.cpp
@@ -235,10 +235,9 @@
else
continue;
- CFX_Matrix m = pDict->GetMatrixFor("Matrix");
- m.Concat(CFX_Matrix(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e,
- matrix->f));
- pDict->SetMatrixFor("Matrix", m);
+ CFX_Matrix m(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e,
+ matrix->f);
+ pDict->SetMatrixFor("Matrix", pDict->GetMatrixFor("Matrix") * m);
}
return true;