summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2020-10-16 16:16:04 +0200
committerLuboš Luňák <l.lunak@collabora.com>2020-10-20 19:21:33 +0200
commit5c3687e4c7697fdcb1451e9a1fc3a2d5b9a23a82 (patch)
tree2400f6e8117cec863680b6274dca3828553d4e43 /vcl
parentb8a609e798a83a40e5ceb5873d6a95dfd93bfb83 (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.cxx18
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);