tdf#37281 tdf#45820 tdf#48916 tdf#55058 EMF Implement complex clipping

As the visual glitches were resolved with:
https://gerrit.libreoffice.org/c/core/+/113423

It is time for enabling complex clipping.

Change-Id: I12edc88fc9a55c8deedf3d87faeb50cfe0067a01
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113520
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Reviewed-by: Bartosz Kosiorek <gang65@poczta.onet.pl>
This commit is contained in:
Bartosz Kosiorek
2021-04-03 15:30:46 +02:00
parent 58db3df246
commit aa17ea3d36
5 changed files with 50 additions and 25 deletions
@@ -311,6 +311,15 @@ void Primitive2dXmlDump::decomposeAndWrite(
}
break;
case PRIMITIVE2D_ID_GROUPPRIMITIVE2D:
{
const GroupPrimitive2D& rGroupPrimitive2D = dynamic_cast<const GroupPrimitive2D&>(*pBasePrimitive);
rWriter.startElement("group");
decomposeAndWrite(rGroupPrimitive2D.getChildren(), rWriter);
rWriter.endElement();
}
break;
case PRIMITIVE2D_ID_MASKPRIMITIVE2D:
{
const MaskPrimitive2D& rMaskPrimitive2D = dynamic_cast<const MaskPrimitive2D&>(*pBasePrimitive);
+30
View File
@@ -51,6 +51,7 @@ class Test : public test::BootstrapFixture, public XmlTestTools, public unotest:
void TestLinearGradient();
void TestTextMapMode();
void TestEnglishMapMode();
void TestDrawPolyLine16WithClip();
void TestFillRegion();
void TestCreatePen();
void TestPdfInEmf();
@@ -70,6 +71,7 @@ public:
CPPUNIT_TEST(TestLinearGradient);
CPPUNIT_TEST(TestTextMapMode);
CPPUNIT_TEST(TestEnglishMapMode);
CPPUNIT_TEST(TestDrawPolyLine16WithClip);
CPPUNIT_TEST(TestFillRegion);
CPPUNIT_TEST(TestCreatePen);
CPPUNIT_TEST(TestPdfInEmf);
@@ -311,6 +313,34 @@ void Test::TestEnglishMapMode()
}
void Test::TestDrawPolyLine16WithClip()
{
// Check import of EMF image with records:
// CREATEBRUSHINDIRECT, FILLRGN, BEGINPATH, POLYGON16, SELECTCLIPPATH, MODIFYWORLDTRANSFORM, SELECTOBJECT
Primitive2DSequence aSequence = parseEmf(u"/emfio/qa/cppunit/emf/data/TestDrawPolyLine16WithClip.emf");
CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aSequence.getLength()));
drawinglayer::Primitive2dXmlDump dumper;
xmlDocUniquePtr pDocument = dumper.dumpAndParse(comphelper::sequenceToContainer<Primitive2DContainer>(aSequence));
CPPUNIT_ASSERT (pDocument);
assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polypolygon", "path", "m0 0h3943v3939h-3943z");
assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polypolygoncolor", 1);
assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polypolygoncolor[1]/polypolygon",
"path", "m1323 0h1323v1322h1323v1322h-1323v1322h-1323v-1322h-1323v-1322h1323z");
assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polypolygoncolor[1]", "color", "#b4ffff");
assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polygonhairline", 1);
assertXPathContent(pDocument, "/primitive2D/metafile/transform/mask/polygonhairline[1]/polygon",
"1323,0 2646,0 2646,1322 3969,1322 3969,2644 2646,2644 2646,3966 1323,3966 1323,2644 0,2644 0,1322 1323,1322");
assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polygonhairline[1]", "color", "#000000");
assertXPath(pDocument, "/primitive2D/metafile/transform/mask/group[1]/mask/polypolygon", "path", "m2646 0v1322h1323v1322h-1323v1322h-1323v-1322h-1323v-1322h1323v-1322");
assertXPathContent(pDocument, "/primitive2D/metafile/transform/mask/group[1]/mask/polygonstroke/polygon", "0,793 3969,4230");
}
void Test::TestFillRegion()
{
// Check import of EMF image with records: CREATEBRUSHINDIRECT, FILLRGN. The SETICMMODE is also used.
+5 -4
View File
@@ -126,10 +126,11 @@ void WmfTest::testEmfProblem()
CPPUNIT_ASSERT(pDoc);
assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "top", "427");
assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "left", "740");
assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "bottom", "2823");
assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "right", "1876");
assertXPath(pDoc, "/metafile/sectrectclipregion", 2);
assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "top", "2125");
assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "left", "1084");
assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "bottom", "2927");
assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "right", "2376");
}
void WmfTest::testEmfLineStyles()
+6 -21
View File
@@ -1188,31 +1188,16 @@ namespace emfio
mbComplexClip = rClipPoly.count() > 1
|| !basegfx::utils::isRectangle(rClipPoly);
static bool bEnableComplexClipViaRegion = getenv("SAL_WMF_COMPLEXCLIP_VIA_REGION") != nullptr;
if (bEnableComplexClipViaRegion)
// This makes cases like tdf#45820 work in reasonable time.
if (mbComplexClip)
{
//this makes cases like tdf#45820 work in reasonable time, and I feel in theory should
//be just fine. In practice I see the output is different so needs work before its the
//default, but for file fuzzing it should be good enough
if (mbComplexClip)
{
mpGDIMetaFile->AddAction(
new MetaISectRegionClipRegionAction(
vcl::Region(rClipPoly)));
mbComplexClip = false;
}
else
{
mpGDIMetaFile->AddAction(
new MetaISectRectClipRegionAction(
vcl::unotools::rectangleFromB2DRectangle(
rClipPoly.getB2DRange())));
}
mpGDIMetaFile->AddAction(
new MetaISectRegionClipRegionAction(
vcl::Region(rClipPoly)));
mbComplexClip = false;
}
else
{
//normal case
mpGDIMetaFile->AddAction(
new MetaISectRectClipRegionAction(
vcl::unotools::rectangleFromB2DRectangle(