diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2021-03-01 19:38:42 +0100 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2021-03-03 11:07:16 +0100 |
commit | d4159496056741302718ac1e85f450985fd11580 (patch) | |
tree | fd9dfd3b836b9a399c71fc4ad08431abafc7c867 /vcl/skia | |
parent | f5c7ec8c99bd7f831fa5e1b00bd5ac01b1a03a8b (diff) |
do not smoothscale if not changing pixel size
Flipping or rotating are simple operations in this regard. This saves
some CPU time in raster mode, and for the upcoming chrome/m90 release
this also prevents a failure in
BackendTest::testDrawTransformedBitmapExAlpha() when rotating.
Change-Id: I51890ac19b0bd5312fcf9c7bb8fe519dc10dc007
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111771
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'vcl/skia')
-rw-r--r-- | vcl/skia/gdiimpl.cxx | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx index d8ddf48536c0..c511b2ef2f45 100644 --- a/vcl/skia/gdiimpl.cxx +++ b/vcl/skia/gdiimpl.cxx @@ -1766,6 +1766,33 @@ bool SkiaSalGraphicsImpl::hasFastDrawTransformedBitmap() const return true; } +// Whether applying matrix needs image smoothing for the transformation. +static bool matrixNeedsHighQuality(const SkMatrix& matrix) +{ + if (matrix.isIdentity()) + return false; + if (matrix.isScaleTranslate()) + { + if (abs(matrix.getScaleX()) == 1 && abs(matrix.getScaleY()) == 1) + return false; // Only at most flipping and keeping the size. + return true; + } + assert(!matrix.hasPerspective()); // we do not use this + if (matrix.getScaleX() == 0 && matrix.getScaleY() == 0) + { + // Rotating 90 or 270 degrees while keeping the size. + if ((matrix.getSkewX() == 1 && matrix.getSkewY() == -1) + || (matrix.getSkewX() == -1 && matrix.getSkewY() == 1)) + return false; + } + return true; +} + +namespace SkiaTests +{ +bool matrixNeedsHighQuality(const SkMatrix& matrix) { return ::matrixNeedsHighQuality(matrix); } +} + bool SkiaSalGraphicsImpl::drawTransformedBitmap(const basegfx::B2DPoint& rNull, const basegfx::B2DPoint& rX, const basegfx::B2DPoint& rY, @@ -1816,7 +1843,7 @@ bool SkiaSalGraphicsImpl::drawTransformedBitmap(const basegfx::B2DPoint& rNull, SkAutoCanvasRestore autoRestore(canvas, true); canvas->concat(matrix); SkPaint paint; - if (!matrix.isTranslate()) + if (matrixNeedsHighQuality(matrix)) paint.setFilterQuality(kHigh_SkFilterQuality); if (fAlpha == 1.0) canvas->drawImage(imageToDraw, 0, 0, &paint); @@ -1842,7 +1869,7 @@ bool SkiaSalGraphicsImpl::drawTransformedBitmap(const basegfx::B2DPoint& rNull, SkAutoCanvasRestore autoRestore(canvas, true); canvas->concat(matrix); SkPaint paint; - if (!matrix.isTranslate()) + if (matrixNeedsHighQuality(matrix)) paint.setFilterQuality(kHigh_SkFilterQuality); if (pSkiaAlphaBitmap) { |