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:
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
|
||||
Binary file not shown.
@@ -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()
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user