summaryrefslogtreecommitdiff
path: root/basegfx
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2020-07-16 11:47:00 +0200
committerLuboš Luňák <l.lunak@collabora.com>2020-07-16 16:02:05 +0200
commit12147e0322e0fdd1b561c94e7ebd3fdd69ceaac0 (patch)
tree9c6965a8f2baec41d7e208c631ef4a979b8d53a0 /basegfx
parent777ac5456a1f24fea29931ede983b5b8ad9a063d (diff)
merge needlessly split polygons back in Skia drawing (tdf#133016)
There are places in LO code that needlessly split polygons into a group of adjacent polygons. These should theoretically result in the same, but only if antialiasing is not used (where Skia has a problem and according to Skia developers that's not really Skia's fault). So whenever a possibly problematic polygon is asked to be drawn, delay it and try to merge it with followup polygons back into one polygon where those needlessly created problematic edges do not exist. This is indeed just a hack and those problematic places should be fixed, but oh well :/. Change-Id: I1b03fe7c2f5e8c962b0dcb8962196b7fea090146 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98887 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'basegfx')
-rw-r--r--basegfx/CppunitTest_basegfx.mk1
-rw-r--r--basegfx/test/B2DPolyPolygonCutterTest.cxx103
2 files changed, 104 insertions, 0 deletions
diff --git a/basegfx/CppunitTest_basegfx.mk b/basegfx/CppunitTest_basegfx.mk
index 91cfc2226774..231854cdf057 100644
--- a/basegfx/CppunitTest_basegfx.mk
+++ b/basegfx/CppunitTest_basegfx.mk
@@ -29,6 +29,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,basegfx,\
basegfx/test/B2DPolygonTest \
basegfx/test/B2DPolygonToolsTest \
basegfx/test/B2DPolyPolygonTest \
+ basegfx/test/B2DPolyPolygonCutterTest \
basegfx/test/B1DRangeTest \
basegfx/test/B2XRangeTest \
basegfx/test/B2IBoxTest \
diff --git a/basegfx/test/B2DPolyPolygonCutterTest.cxx b/basegfx/test/B2DPolyPolygonCutterTest.cxx
new file mode 100644
index 000000000000..b111bf469d5e
--- /dev/null
+++ b/basegfx/test/B2DPolyPolygonCutterTest.cxx
@@ -0,0 +1,103 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <basegfx/polygon/b2dpolypolygoncutter.hxx>
+
+namespace basegfx
+{
+class b2dpolypolygoncutter : public CppUnit::TestFixture
+{
+public:
+ void testMergeToSinglePolyPolygon()
+ {
+ { // Adjacent polygons merged to one, closed manually.
+ B2DPolygon poly1{ { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 }, { 0, 0 } };
+ B2DPolygon poly2{ { 0, 1 }, { 1, 1 }, { 1, 2 }, { 0, 2 }, { 0, 1 } };
+ B2DPolyPolygon expected(
+ B2DPolygon{ { 1, 0 }, { 1, 1 }, { 1, 2 }, { 0, 2 }, { 0, 1 }, { 0, 0 } });
+ expected.setClosed(true);
+ B2DPolyPolygon result
+ = utils::mergeToSinglePolyPolygon({ B2DPolyPolygon(poly1), B2DPolyPolygon(poly2) });
+ CPPUNIT_ASSERT_EQUAL(expected, result);
+ }
+
+ { // Adjacent polygons merged to one, closed using setClosed().
+ B2DPolygon poly1{ { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 } };
+ B2DPolygon poly2{ { 0, 1 }, { 1, 1 }, { 1, 2 }, { 0, 2 } };
+ poly1.setClosed(true);
+ poly2.setClosed(true);
+ B2DPolyPolygon expected(
+ B2DPolygon{ { 0, 0 }, { 1, 0 }, { 1, 1 }, { 1, 2 }, { 0, 2 }, { 0, 1 } });
+ expected.setClosed(true);
+ B2DPolyPolygon result
+ = utils::mergeToSinglePolyPolygon({ B2DPolyPolygon(poly1), B2DPolyPolygon(poly2) });
+ CPPUNIT_ASSERT_EQUAL(expected, result);
+ }
+
+ { // Non-adjacent polygons, no merge.
+ B2DPolygon poly1{ { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 } };
+ B2DPolygon poly2{ { 0, 2 }, { 1, 3 }, { 1, 3 }, { 0, 3 } };
+ poly1.setClosed(true);
+ poly2.setClosed(true);
+ B2DPolyPolygon expected;
+ expected.append(poly1);
+ expected.append(poly2);
+ B2DPolyPolygon result
+ = utils::mergeToSinglePolyPolygon({ B2DPolyPolygon(poly1), B2DPolyPolygon(poly2) });
+ CPPUNIT_ASSERT_EQUAL(expected, result);
+ }
+
+ { // Horizontal and vertical rectangle that together form a cross.
+ B2DPolygon poly1{ { 1, 0 }, { 2, 0 }, { 2, 3 }, { 1, 3 } };
+ B2DPolygon poly2{ { 0, 1 }, { 3, 1 }, { 3, 2 }, { 0, 2 } };
+ poly1.setClosed(true);
+ poly2.setClosed(true);
+ B2DPolyPolygon expected(B2DPolygon{ { 1, 0 },
+ { 2, 0 },
+ { 2, 1 },
+ { 3, 1 },
+ { 3, 2 },
+ { 2, 2 },
+ { 2, 3 },
+ { 1, 3 },
+ { 1, 2 },
+ { 0, 2 },
+ { 0, 1 },
+ { 1, 1 } });
+ expected.setClosed(true);
+ B2DPolyPolygon result
+ = utils::mergeToSinglePolyPolygon({ B2DPolyPolygon(poly1), B2DPolyPolygon(poly2) });
+ CPPUNIT_ASSERT_EQUAL(expected, result);
+ }
+ }
+
+ CPPUNIT_TEST_SUITE(b2dpolypolygoncutter);
+ CPPUNIT_TEST(testMergeToSinglePolyPolygon);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+} // namespace basegfx
+
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx::b2dpolypolygoncutter);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */