From b0b78838e795fcd7f3c53e7f74fb32b2921a5ccb Mon Sep 17 00:00:00 2001 From: Bartosz Kosiorek Date: Thu, 12 Nov 2020 21:48:44 +0100 Subject: [PATCH] tdf#35986 tdf#92315 tdf#116335 tdf#116622 Add support for MapMode TEXT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To properly import some EMF files, the proper implementation of MapMode Text needs to be done according to MS documentation. I have also added regression tests. Change-Id: Id788294a498b93bebb62118d13ea545f80a60f01 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105771 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl --- .../source/tools/primitive2dxmldump.cxx | 45 ++++++++++ emfio/qa/cppunit/emf/EmfImportTest.cxx | 81 ++++++++++++++---- emfio/qa/cppunit/emf/data/TextMapMode.emf | Bin 0 -> 46588 bytes emfio/source/reader/mtftools.cxx | 35 ++++++-- 4 files changed, 137 insertions(+), 24 deletions(-) create mode 100644 emfio/qa/cppunit/emf/data/TextMapMode.emf diff --git a/drawinglayer/source/tools/primitive2dxmldump.cxx b/drawinglayer/source/tools/primitive2dxmldump.cxx index b9c4e2f83d1d..7a19e0486c89 100644 --- a/drawinglayer/source/tools/primitive2dxmldump.cxx +++ b/drawinglayer/source/tools/primitive2dxmldump.cxx @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -206,7 +207,50 @@ void Primitive2dXmlDump::decomposeAndWrite( rWriter.endElement(); } break; + case PRIMITIVE2D_ID_POINTARRAYPRIMITIVE2D: + { + const PointArrayPrimitive2D& rPointArrayPrimitive2D = dynamic_cast(*pBasePrimitive); + rWriter.startElement("pointarray"); + rWriter.attribute("color", convertColorToString(rPointArrayPrimitive2D.getRGBColor())); + + const std::vector< basegfx::B2DPoint > aPositions = rPointArrayPrimitive2D.getPositions(); + for (std::vector::const_iterator iter = aPositions.begin(); iter != aPositions.end(); ++iter) + { + rWriter.startElement("point"); + rWriter.attribute("x", OUString::number(iter->getX())); + rWriter.attribute("y", OUString::number(iter->getY())); + rWriter.endElement(); + } + + rWriter.endElement(); + } + break; + case PRIMITIVE2D_ID_POLYGONSTROKEPRIMITIVE2D: + { + const PolygonStrokePrimitive2D& rPolygonStrokePrimitive2D = dynamic_cast(*pBasePrimitive); + rWriter.startElement("polygonstroke"); + + rWriter.startElement("polygon"); + rWriter.content(basegfx::utils::exportToSvgPoints(rPolygonStrokePrimitive2D.getB2DPolygon())); + rWriter.endElement(); + + rWriter.startElement("line"); + const drawinglayer::attribute::LineAttribute& aLineAttribute = rPolygonStrokePrimitive2D.getLineAttribute(); + rWriter.attribute("color", convertColorToString(aLineAttribute.getColor())); + rWriter.attribute("width", aLineAttribute.getWidth()); + + rWriter.endElement(); + + rWriter.startElement("stroke"); + const drawinglayer::attribute::StrokeAttribute& aStrokeAttribute = rPolygonStrokePrimitive2D.getStrokeAttribute(); + rWriter.attribute("fulldotdashlen", aStrokeAttribute.getFullDotDashLen()); + //rWriter.attribute("dotdasharray", aStrokeAttribute.getDotDashArray()); + rWriter.endElement(); + + rWriter.endElement(); + } + break; case PRIMITIVE2D_ID_POLYPOLYGONSTROKEPRIMITIVE2D: { const PolyPolygonStrokePrimitive2D& rPolyPolygonStrokePrimitive2D = dynamic_cast(*pBasePrimitive); @@ -434,6 +478,7 @@ void Primitive2dXmlDump::decomposeAndWrite( { rWriter.startElement("unhandled"); rWriter.attribute("id", OUStringToOString(sCurrentElementTag, RTL_TEXTENCODING_UTF8)); + rWriter.attribute("idNumber", nId); drawinglayer::primitive2d::Primitive2DContainer aPrimitiveContainer; pBasePrimitive->get2DDecomposition(aPrimitiveContainer, drawinglayer::geometry::ViewInformation2D()); diff --git a/emfio/qa/cppunit/emf/EmfImportTest.cxx b/emfio/qa/cppunit/emf/EmfImportTest.cxx index 9c03f92eb061..94914da60f8a 100644 --- a/emfio/qa/cppunit/emf/EmfImportTest.cxx +++ b/emfio/qa/cppunit/emf/EmfImportTest.cxx @@ -44,13 +44,12 @@ class Test : public test::BootstrapFixture, public XmlTestTools, public unotest: { uno::Reference mxComponent; - void checkRectPrimitive(Primitive2DSequence const & rPrimitive); - - void testWorking(); + void testPolyPolygon(); void TestDrawString(); void TestDrawStringTransparent(); void TestDrawLine(); void TestLinearGradient(); + void TestTextMapMode(); void TestPdfInEmf(); Primitive2DSequence parseEmf(const OUString& aSource); @@ -61,11 +60,12 @@ public: uno::Reference& getComponent() { return mxComponent; } CPPUNIT_TEST_SUITE(Test); - CPPUNIT_TEST(testWorking); + CPPUNIT_TEST(testPolyPolygon); CPPUNIT_TEST(TestDrawString); CPPUNIT_TEST(TestDrawStringTransparent); CPPUNIT_TEST(TestDrawLine); CPPUNIT_TEST(TestLinearGradient); + CPPUNIT_TEST(TestTextMapMode); CPPUNIT_TEST(TestPdfInEmf); CPPUNIT_TEST_SUITE_END(); }; @@ -105,24 +105,39 @@ Primitive2DSequence Test::parseEmf(const OUString& aSource) return xEmfParser->getDecomposition(aInputStream, aPath, aEmptyValues); } -void Test::checkRectPrimitive(Primitive2DSequence const & rPrimitive) +void Test::testPolyPolygon() { + Primitive2DSequence aSequence = parseEmf("/emfio/qa/cppunit/emf/data/fdo79679-2.emf"); + CPPUNIT_ASSERT_EQUAL(1, static_cast(aSequence.getLength())); drawinglayer::Primitive2dXmlDump dumper; - xmlDocUniquePtr pDocument = dumper.dumpAndParse(comphelper::sequenceToContainer(rPrimitive)); + xmlDocUniquePtr pDocument = dumper.dumpAndParse(comphelper::sequenceToContainer(aSequence)); CPPUNIT_ASSERT (pDocument); - // emfio: add examples (later) - // assertXPath(pDocument, "/primitive2D/transform/polypolygoncolor", "color", "#00cc00"); // rect background color - // assertXPath(pDocument, "/primitive2D/transform/polypolygoncolor", "height", "100"); // rect background height - // assertXPath(pDocument, "/primitive2D/transform/polypolygoncolor", "width", "100"); // rect background width -} + // Chart axis + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polypolygon", "path", "m0 0h19746v14817h-19746z"); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polypolygoncolor", 2); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polypolygoncolor[1]", "color", "#ffffff"); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polypolygoncolor[1]/polypolygon", "path", "m0 0h19780v14851h-19780z"); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polypolygoncolor[2]/polypolygon", "path", "m2574 13194v-12065h15303v12065z"); + + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polygonstroke", 116); + assertXPathContent(pDocument, "/primitive2D/metafile/transform/mask/polygonstroke[1]/polygon", "2574,13194 2574,1129 17877,1129 17877,13194"); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polygonstroke[1]/line", "color", "#ffffff"); + + assertXPathContent(pDocument, "/primitive2D/metafile/transform/mask/polygonstroke[10]/polygon", "8674,13194 8674,1129"); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/polygonstroke[10]/line", "color", "#000000"); + + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/textsimpleportion", 28); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/textsimpleportion[6]", "width", "459"); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/textsimpleportion[6]", "x", "9908"); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/textsimpleportion[6]", "text", "0.5"); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/textsimpleportion[6]", "fontcolor", "#000000"); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/pointarray", 98); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/pointarray[1]", "color", "#000000"); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/pointarray[1]/point", "x", "2574"); + assertXPath(pDocument, "/primitive2D/metafile/transform/mask/pointarray[1]/point", "y", "1129"); -void Test::testWorking() -{ - Primitive2DSequence aSequenceRect = parseEmf("/emfio/qa/cppunit/emf/data/fdo79679-2.emf"); - CPPUNIT_ASSERT_EQUAL(1, static_cast(aSequenceRect.getLength())); - checkRectPrimitive(aSequenceRect); } void Test::TestDrawString() @@ -221,6 +236,40 @@ void Test::TestLinearGradient() assertXPath(pDocument, "/primitive2D/metafile/transform/mask/svglineargradient[2]/polypolygon", "path", "m7615.75822989746 0.216110019646294h7615.75822989746v7610.21611001965h-7615.75822989746z"); } +void Test::TestTextMapMode() +{ + // Check import of EMF image with records: SETMAPMODE with MM_TEXT MapMode, POLYLINE16, EXTCREATEPEN, EXTTEXTOUTW + // MM_TEXT is mapped to one device pixel. Positive x is to the right; positive y is down. + Primitive2DSequence aSequence = parseEmf("/emfio/qa/cppunit/emf/data/TextMapMode.emf"); + CPPUNIT_ASSERT_EQUAL(1, static_cast(aSequence.getLength())); + drawinglayer::Primitive2dXmlDump dumper; + xmlDocUniquePtr pDocument = dumper.dumpAndParse(comphelper::sequenceToContainer(aSequence)); + CPPUNIT_ASSERT (pDocument); + + assertXPath(pDocument, "/primitive2D/metafile/transform/polypolygoncolor", 2); + assertXPath(pDocument, "/primitive2D/metafile/transform/polypolygoncolor[1]", "color", "#ffffff"); + assertXPath(pDocument, "/primitive2D/metafile/transform/polypolygoncolor[1]/polypolygon", "path", "m0 0h3542v4647h-3542z"); + + assertXPath(pDocument, "/primitive2D/metafile/transform/textsimpleportion", 20); + assertXPath(pDocument, "/primitive2D/metafile/transform/textsimpleportion[1]", "text", "N"); + assertXPath(pDocument, "/primitive2D/metafile/transform/textsimpleportion[1]", "fontcolor", "#4a70e3"); + assertXPath(pDocument, "/primitive2D/metafile/transform/textsimpleportion[1]", "x", "2099"); + assertXPath(pDocument, "/primitive2D/metafile/transform/textsimpleportion[1]", "y", "1859"); + + assertXPath(pDocument, "/primitive2D/metafile/transform/polygonstroke", 138); + assertXPathContent(pDocument, "/primitive2D/metafile/transform/polygonstroke[1]/polygon", "2142,1638 2142,1489"); + assertXPath(pDocument, "/primitive2D/metafile/transform/polygonstroke[1]/line", "color", "#4a70e3"); + assertXPath(pDocument, "/primitive2D/metafile/transform/polygonstroke[1]/line", "width", "11"); + + assertXPathContent(pDocument, "/primitive2D/metafile/transform/polygonstroke[10]/polygon", "1967,1029 1869,952"); + assertXPath(pDocument, "/primitive2D/metafile/transform/polygonstroke[10]/line", "color", "#4a70e3"); + assertXPath(pDocument, "/primitive2D/metafile/transform/polygonstroke[10]/line", "width", "11"); + + assertXPathContent(pDocument, "/primitive2D/metafile/transform/polygonstroke[20]/polygon", "2710,1113 2873,1330"); + assertXPath(pDocument, "/primitive2D/metafile/transform/polygonstroke[20]/line", "color", "#666666"); + assertXPath(pDocument, "/primitive2D/metafile/transform/polygonstroke[20]/line", "width", "11"); +} + void Test::TestPdfInEmf() { // Load a PPTX file, which has a shape, with a bitmap fill, which is an EMF, containing a PDF. diff --git a/emfio/qa/cppunit/emf/data/TextMapMode.emf b/emfio/qa/cppunit/emf/data/TextMapMode.emf new file mode 100644 index 0000000000000000000000000000000000000000..e0bbf73e278336f39c7947c68252c346d45e532d GIT binary patch literal 46588 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 xr*)m~-`N(mnMillX) * 100.0 / static_cast(mnPixX); @@ -464,10 +467,13 @@ namespace emfio } else { - fWidth /= mnWinExtX; - fHeight /= mnWinExtY; - fWidth *= mnDevWidth; - fHeight *= mnDevHeight; + if ( mnMapMode != MM_TEXT ) + { + fWidth /= mnWinExtX; + fHeight /= mnWinExtY; + fWidth *= mnDevWidth; + fHeight *= mnDevHeight; + } fWidth *= static_cast(mnMillX) * 100.0 / static_cast(mnPixX); fHeight *= static_cast(mnMillY) * 100.0 / static_cast(mnPixY); } @@ -2131,6 +2137,12 @@ namespace emfio pSave->maPathObj = maPathObj; pSave->maClipPath = maClipPath; + SAL_INFO("emfio", "\t\t GfxMode: " << mnGfxMode); + SAL_INFO("emfio", "\t\t MapMode: " << mnMapMode); + SAL_INFO("emfio", "\t\t WinOrg: " << mnWinOrgX << ", " << mnWinOrgY); + SAL_INFO("emfio", "\t\t WinExt: " << mnWinExtX << " x " << mnWinExtY); + SAL_INFO("emfio", "\t\t DevOrg: " << mnDevOrgX << ", " << mnDevOrgY); + SAL_INFO("emfio", "\t\t DevWidth/Height: " << mnDevWidth << " x " << mnDevHeight); mvSaveStack.push_back( pSave ); } @@ -2180,6 +2192,13 @@ namespace emfio mpGDIMetaFile->AddAction( new MetaRasterOpAction( meRasterOp ) ); meLatestRasterOp = meRasterOp; } + + SAL_INFO("emfio", "\t\t GfxMode: " << mnGfxMode); + SAL_INFO("emfio", "\t\t MapMode: " << mnMapMode); + SAL_INFO("emfio", "\t\t WinOrg: " << mnWinOrgX << ", " << mnWinOrgY); + SAL_INFO("emfio", "\t\t WinExt: " << mnWinExtX << " x " << mnWinExtY); + SAL_INFO("emfio", "\t\t DevOrg: " << mnDevOrgX << ", " << mnDevOrgY); + SAL_INFO("emfio", "\t\t DevWidth/Height: " << mnDevWidth << " x " << mnDevHeight); mvSaveStack.pop_back(); }