Remove SkiaState::m_drawMatrix
Passes the drawing matrix directly to FlushPath() or FlushText(),
instead of persisting the matrix in m_drawMatrix. Since we no longer
accumulate drawing operations with different matrices, we no longer need
to adjust for matrix changes between drawing operations.
Bug: pdfium:1963
Change-Id: I52608c5421fbd3f5fded37e336577a9bb977995b
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/104570
Reviewed-by: Nigi <nigi@chromium.org>
Commit-Queue: K. Moon <kmoon@chromium.org>
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index c155561..9a1ac1e 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -818,23 +818,16 @@
m_strokeColor = stroke_color;
m_blendType = blend_type;
m_groupKnockout = m_pDriver->GetGroupKnockout();
- if (pMatrix) {
- m_drawMatrix = *pMatrix;
- }
- SkPath skPath = BuildPath(path);
- SkPoint delta;
- if (MatrixOffset(pMatrix, &delta))
- skPath.offset(delta.fX, delta.fY);
- m_skPath.addPath(skPath);
+ m_skPath.addPath(BuildPath(path));
// TODO(crbug.com/pdfium/1963): Simplify code assuming eager flushing.
AdjustClip(m_commandIndex);
- FlushPath();
+ FlushPath(pMatrix ? *pMatrix : CFX_Matrix());
}
- void FlushPath() {
- SkMatrix skMatrix = ToSkMatrix(m_drawMatrix);
+ void FlushPath(const CFX_Matrix& matrix) {
+ SkMatrix skMatrix = ToSkMatrix(matrix);
SkPaint skPaint;
skPaint.setAntiAlias(!m_fillOptions.aliased_path);
if (m_fillOptions.full_cover)
@@ -883,7 +876,6 @@
skCanvas->drawPath(m_skPath, skPaint);
}
}
- m_drawMatrix = CFX_Matrix();
m_fillOptions = CFX_FillRenderOptions();
}
@@ -942,7 +934,6 @@
m_fontSize = font_size;
m_scaleX = scaleX;
m_fillColor = color;
- m_drawMatrix = matrix;
m_textOptions = options;
const size_t original_count = m_charDetails.Count();
@@ -969,13 +960,6 @@
}
#endif
}
- SkPoint delta;
- if (MatrixOffset(&matrix, &delta)) {
- for (size_t index = original_count; index < total_count; ++index) {
- m_charDetails.OffsetPositionAt(index, delta.fX * flip,
- -delta.fY * flip);
- }
- }
if (hasRSX) {
const DataVector<SkPoint>& positions = m_charDetails.GetPositions();
for (size_t index = 0; index < char_pos.size(); ++index) {
@@ -997,11 +981,11 @@
// TODO(crbug.com/pdfium/1963): Simplify code assuming eager flushing.
AdjustClip(m_commandIndex);
- FlushText();
+ FlushText(matrix);
return true;
}
- void FlushText() {
+ void FlushText(const CFX_Matrix& matrix) {
SkPaint skPaint;
skPaint.setAntiAlias(true);
skPaint.setColor(m_fillColor);
@@ -1021,7 +1005,7 @@
SkCanvas* skCanvas = m_pDriver->SkiaCanvas();
SkAutoCanvasRestore scoped_save_restore(skCanvas, /*doSave=*/true);
SkScalar flip = m_fontSize < 0 ? -1 : 1;
- SkMatrix skMatrix = ToFlippedSkMatrix(m_drawMatrix, flip);
+ SkMatrix skMatrix = ToFlippedSkMatrix(matrix, flip);
skCanvas->concat(skMatrix);
const DataVector<uint16_t>& glyphs = m_charDetails.GetGlyphs();
if (m_rsxform.size()) {
@@ -1038,7 +1022,6 @@
}
}
- m_drawMatrix = CFX_Matrix();
m_italicAngle = 0;
m_isSubstFontBold = false;
m_textOptions = CFX_TextRenderOptions();
@@ -1112,28 +1095,6 @@
SetClip(dst_path);
}
- bool MatrixOffset(const CFX_Matrix* pMatrix, SkPoint* delta) {
- CFX_Matrix identityMatrix;
- if (!pMatrix)
- pMatrix = &identityMatrix;
- delta->set(pMatrix->e - m_drawMatrix.e, pMatrix->f - m_drawMatrix.f);
- if (!delta->fX && !delta->fY)
- return true;
- SkMatrix drawMatrix = ToSkMatrix(m_drawMatrix);
- if (!(drawMatrix.getType() & ~SkMatrix::kTranslate_Mask))
- return true;
- SkMatrix invDrawMatrix;
- if (!drawMatrix.invert(&invDrawMatrix))
- return false;
- SkMatrix invNewMatrix;
- SkMatrix newMatrix = ToSkMatrix(*pMatrix);
- if (!newMatrix.invert(&invNewMatrix))
- return false;
- delta->set(invDrawMatrix.getTranslateX() - invNewMatrix.getTranslateX(),
- invDrawMatrix.getTranslateY() - invNewMatrix.getTranslateY());
- return true;
- }
-
void ClipSave() {
if (m_commandIndex < m_commands.size()) {
if (Clip::kSave == m_commands[m_commandIndex]) {
@@ -1197,9 +1158,6 @@
void SetPositionAt(size_t index, const SkPoint& position) {
m_positions[index] = position;
}
- void OffsetPositionAt(size_t index, SkScalar dx, SkScalar dy) {
- m_positions[index].offset(dx, dy);
- }
const DataVector<uint16_t>& GetGlyphs() const { return m_glyphs; }
void SetGlyphAt(size_t index, uint16_t glyph) { m_glyphs[index] = glyph; }
const DataVector<uint32_t>& GetFontCharWidths() const {
@@ -1236,7 +1194,6 @@
SkPath m_skPath;
// used as placehold in the clips array
SkPath m_skEmptyPath;
- CFX_Matrix m_drawMatrix;
CFX_GraphStateData m_drawState;
CFX_FillRenderOptions m_fillOptions;
CFX_TextRenderOptions m_textOptions;