diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2020-10-16 16:16:04 +0200 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2020-10-20 19:21:33 +0200 |
commit | 5c3687e4c7697fdcb1451e9a1fc3a2d5b9a23a82 (patch) | |
tree | 2400f6e8117cec863680b6274dca3828553d4e43 /vcl | |
parent | b8a609e798a83a40e5ceb5873d6a95dfd93bfb83 (diff) |
fix skia matrix rounding imprecision
Change-Id: I9908eb5981317799c978e13c244e3e1ec2867016
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104438
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/skia/gdiimpl.cxx | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx index e25f78f0be8b..067348d364ed 100644 --- a/vcl/skia/gdiimpl.cxx +++ b/vcl/skia/gdiimpl.cxx @@ -43,6 +43,7 @@ #include <basegfx/polygon/b2dpolypolygontools.hxx> #include <basegfx/polygon/b2dpolypolygoncutter.hxx> #include <o3tl/sorted_vector.hxx> +#include <rtl/math.hxx> namespace { @@ -1676,11 +1677,18 @@ void SkiaSalGraphicsImpl::drawShader(const SalTwoRect& rPosAry, const sk_sp<SkSh * 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)); +#ifndef NDEBUG + // Handle floating point imprecisions, round p1 to 2 decimal places. + auto compareRounded = [](const SkPoint& p1, const SkPoint& p2) { + return rtl::math::round(p1.x(), 2) == p2.x() && rtl::math::round(p1.y(), 2) == p2.y(); + }; +#endif + assert(compareRounded(matrix.mapXY(rPosAry.mnSrcX, rPosAry.mnSrcY), + SkPoint::Make(rPosAry.mnDestX, rPosAry.mnDestY))); + assert(compareRounded( + matrix.mapXY(rPosAry.mnSrcX + rPosAry.mnSrcWidth, rPosAry.mnSrcY + rPosAry.mnSrcHeight), + SkPoint::Make(rPosAry.mnDestX + rPosAry.mnDestWidth, + rPosAry.mnDestY + rPosAry.mnDestHeight))); canvas->concat(matrix); SkRect sourceRect = SkRect::MakeXYWH(rPosAry.mnSrcX, rPosAry.mnSrcY, rPosAry.mnSrcWidth, rPosAry.mnSrcHeight); |