summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2020-09-30 18:39:39 +0200
committerCaolán McNamara <caolanm@redhat.com>2020-10-03 15:46:00 +0200
commit3b2a01c70a5d9496c95aebbcc1c69d5af0981e49 (patch)
treeacd9c1ae907194bf7271305fc0cfb0589b04b1d8 /vcl
parent3d6c7523aea5c2820f26c33688b2c9a767affc6b (diff)
SkCanvas::drawPaint() -> drawRect(), where applicable, and fix matrix
It makes the code a bit simpler. Also fix the matrix used in SkiaSalGraphicsImpl::drawShader(), plus add asserts to verify it's correct. Change-Id: Ia6692ad90e822e6e44028b280dc2faaac06959a5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103743 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com> (cherry picked from commit c1206e12eab237ffa7dde728da5bf1883a05ddb0) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103791 Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/skia/gdiimpl.cxx26
1 files changed, 14 insertions, 12 deletions
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index a4f0d5eb1a5d..fa2f386d6c35 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -1626,17 +1626,21 @@ void SkiaSalGraphicsImpl::drawShader(const SalTwoRect& rPosAry, const sk_sp<SkSh
if (rPosAry.mnSrcWidth != rPosAry.mnDestWidth || rPosAry.mnSrcHeight != rPosAry.mnDestHeight)
paint.setFilterQuality(kHigh_SkFilterQuality);
SkCanvas* canvas = getDrawCanvas();
- // SkCanvas::drawShader() cannot do rectangles, so clip to destination and use a matrix
- // to map from source.
- SkMatrix matrix;
+ // Scaling needs to be done explicitly using a matrix.
SkAutoCanvasRestore autoRestore(canvas, true);
- canvas->clipRect(destinationRect);
- matrix.set(SkMatrix::kMScaleX, 1.0 * rPosAry.mnDestWidth / rPosAry.mnSrcWidth);
- matrix.set(SkMatrix::kMScaleY, 1.0 * rPosAry.mnDestHeight / rPosAry.mnSrcHeight);
- matrix.set(SkMatrix::kMTransX, rPosAry.mnDestX - rPosAry.mnSrcX);
- matrix.set(SkMatrix::kMTransY, rPosAry.mnDestY - rPosAry.mnSrcY);
+ SkMatrix matrix = SkMatrix::Translate(rPosAry.mnDestX, rPosAry.mnDestY)
+ * SkMatrix::Scale(1.0 * rPosAry.mnDestWidth / rPosAry.mnSrcWidth,
+ 1.0 * rPosAry.mnDestHeight / rPosAry.mnSrcHeight)
+ * SkMatrix::Translate(-rPosAry.mnSrcX, -rPosAry.mnSrcY);
+ assert(matrix.mapXY(rPosAry.mnSrcX, rPosAry.mnSrcY)
+ == SkPoint::Make(rPosAry.mnDestX, rPosAry.mnDestY));
+ assert(matrix.mapXY(rPosAry.mnSrcX + rPosAry.mnSrcWidth, rPosAry.mnSrcY + rPosAry.mnSrcHeight)
+ == SkPoint::Make(rPosAry.mnDestX + rPosAry.mnDestWidth,
+ rPosAry.mnDestY + rPosAry.mnDestHeight));
canvas->concat(matrix);
- canvas->drawPaint(paint);
+ SkRect sourceRect
+ = SkRect::MakeXYWH(rPosAry.mnSrcX, rPosAry.mnSrcY, rPosAry.mnSrcWidth, rPosAry.mnSrcHeight);
+ canvas->drawRect(sourceRect, paint);
postDraw();
}
@@ -1705,12 +1709,10 @@ bool SkiaSalGraphicsImpl::drawTransformedBitmap(const basegfx::B2DPoint& rNull,
paint.setFilterQuality(kHigh_SkFilterQuality);
if (pSkiaAlphaBitmap)
{
- // SkCanvas::drawPaint() cannot do rectangles, so clip (is transformed by the matrix too).
- canvas->clipRect(SkRect::MakeWH(aSize.Width(), aSize.Height()));
paint.setShader(SkShaders::Blend(SkBlendMode::kDstOut, // VCL alpha is one-minus-alpha.
rSkiaBitmap.GetSkImage()->makeShader(),
pSkiaAlphaBitmap->GetAlphaSkImage()->makeShader()));
- canvas->drawPaint(paint);
+ canvas->drawRect(SkRect::MakeWH(aSize.Width(), aSize.Height()), paint);
}
else
{