From 66b919c8674066871a06e7cdf5595dc6951524e0 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Thu, 3 Jan 2019 11:41:53 +0100 Subject: svm xml dumper: move this from test to vcl This is very useful functionality, this way it can be invoked from the debugger and/or nested into an outer xml dump (sw/sd doc model dump) more easily. Change-Id: If6c83b11d0f3e65fcce71e8d820c6bc354f64d68 Reviewed-on: https://gerrit.libreoffice.org/65834 Reviewed-by: Miklos Vajna Tested-by: Jenkins --- emfio/qa/cppunit/wmf/wmfimporttest.cxx | 17 +- filter/qa/cppunit/filters-pict-test.cxx | 3 +- include/test/mtfxmldump.hxx | 49 -- include/test/xmltesttools.hxx | 3 + include/vcl/mtfxmldump.hxx | 43 ++ solenv/clang-format/blacklist | 4 +- sw/qa/extras/layout/layout.cxx | 17 +- sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 3 +- sw/qa/extras/uiwriter/uiwriter.cxx | 3 +- test/Library_test.mk | 1 - test/source/mtfxmldump.cxx | 1062 ------------------------------ test/source/xmltesttools.cxx | 10 + vcl/Library_vcl.mk | 1 + vcl/README | 6 +- vcl/qa/cppunit/svm/svmtest.cxx | 7 +- vcl/source/gdi/mtfxmldump.cxx | 1049 +++++++++++++++++++++++++++++ 16 files changed, 1131 insertions(+), 1147 deletions(-) delete mode 100644 include/test/mtfxmldump.hxx create mode 100644 include/vcl/mtfxmldump.hxx delete mode 100644 test/source/mtfxmldump.cxx create mode 100644 vcl/source/gdi/mtfxmldump.cxx diff --git a/emfio/qa/cppunit/wmf/wmfimporttest.cxx b/emfio/qa/cppunit/wmf/wmfimporttest.cxx index 318f6a70826a..5f9de170c595 100644 --- a/emfio/qa/cppunit/wmf/wmfimporttest.cxx +++ b/emfio/qa/cppunit/wmf/wmfimporttest.cxx @@ -18,7 +18,6 @@ */ #include -#include #include #include #include @@ -74,7 +73,7 @@ void WmfTest::testNonPlaceableWmf() MetafileXmlDump dumper; dumper.filterAllActionTypes(); dumper.filterActionType(MetaActionType::POLYLINE, false); - xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile); + xmlDocPtr pDoc = dumpAndParse(dumper, aGDIMetaFile); CPPUNIT_ASSERT (pDoc); @@ -103,7 +102,7 @@ void WmfTest::testSine() MetafileXmlDump dumper; dumper.filterAllActionTypes(); dumper.filterActionType(MetaActionType::ISECTRECTCLIPREGION, false); - xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile); + xmlDocPtr pDoc = dumpAndParse(dumper, aGDIMetaFile); CPPUNIT_ASSERT (pDoc); @@ -119,7 +118,7 @@ void WmfTest::testEmfProblem() MetafileXmlDump dumper; dumper.filterAllActionTypes(); dumper.filterActionType(MetaActionType::ISECTRECTCLIPREGION, false); - xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile); + xmlDocPtr pDoc = dumpAndParse(dumper, aGDIMetaFile); CPPUNIT_ASSERT (pDoc); @@ -139,7 +138,7 @@ void WmfTest::testEmfLineStyles() dumper.filterAllActionTypes(); dumper.filterActionType(MetaActionType::LINE, false); dumper.filterActionType(MetaActionType::LINECOLOR, false); - xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile); + xmlDocPtr pDoc = dumpAndParse(dumper, aGDIMetaFile); CPPUNIT_ASSERT (pDoc); @@ -198,7 +197,7 @@ void WmfTest::testWorldTransformFontSize() MetafileXmlDump dumper; dumper.filterAllActionTypes(); dumper.filterActionType(MetaActionType::FONT, false); - xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile); + xmlDocPtr pDoc = dumpAndParse(dumper, aGDIMetaFile); CPPUNIT_ASSERT (pDoc); @@ -226,7 +225,7 @@ void WmfTest::testTdf93750() ReadWindowMetafile(aFileStream, aGDIMetaFile); MetafileXmlDump dumper; - xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile); + xmlDocPtr pDoc = dumpAndParse(dumper, aGDIMetaFile); CPPUNIT_ASSERT (pDoc); @@ -265,7 +264,7 @@ void WmfTest::testTdf39894() ReadWindowMetafile(aFileStream, aGDIMetaFile); MetafileXmlDump dumper; - xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile); + xmlDocPtr pDoc = dumpAndParse(dumper, aGDIMetaFile); CPPUNIT_ASSERT(pDoc); @@ -286,7 +285,7 @@ void WmfTest::testETO_PDY() ReadWindowMetafile(aFileStream, aGDIMetaFile); MetafileXmlDump dumper; - xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile); + xmlDocPtr pDoc = dumpAndParse(dumper, aGDIMetaFile); CPPUNIT_ASSERT(pDoc); diff --git a/filter/qa/cppunit/filters-pict-test.cxx b/filter/qa/cppunit/filters-pict-test.cxx index 9ca3ba5a7e15..4605cf6983f8 100644 --- a/filter/qa/cppunit/filters-pict-test.cxx +++ b/filter/qa/cppunit/filters-pict-test.cxx @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -86,7 +85,7 @@ void PictFilterTest::testDontClipTooMuch() MetafileXmlDump dumper; dumper.filterAllActionTypes(); dumper.filterActionType(MetaActionType::CLIPREGION, false); - xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile); + xmlDocPtr pDoc = dumpAndParse(dumper, aGDIMetaFile); CPPUNIT_ASSERT (pDoc); diff --git a/include/test/mtfxmldump.hxx b/include/test/mtfxmldump.hxx deleted file mode 100644 index b55de95258db..000000000000 --- a/include/test/mtfxmldump.hxx +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- 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/. - */ - -#ifndef INCLUDED_TEST_MTFXMLDUMP_HXX -#define INCLUDED_TEST_MTFXMLDUMP_HXX - -#include -#include -#include -#include -#include -#include - -namespace tools { class XmlWriter; } - -enum class MetaActionType; - -class OOO_DLLPUBLIC_TEST MetafileXmlDump final -{ - o3tl::enumarray maFilter; - - void writeXml(const GDIMetaFile& rMetaFile, tools::XmlWriter& rWriter); - -public: - MetafileXmlDump(); - ~MetafileXmlDump(); - - void filterActionType(const MetaActionType nActionType, bool bShouldFilter); - void filterAllActionTypes(); - - /** The actual result that will be used for testing. - - This function normally uses a SvMemoryStream for its operation; but - can use a physical file when a filename is specified in - pTempStreamName - this is useful when creating the test, to dump the - file for examination. - */ - xmlDocPtr dumpAndParse(const GDIMetaFile& rMetaFile, const OUString& rTempStreamName = OUString()); -}; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/test/xmltesttools.hxx b/include/test/xmltesttools.hxx index 231a3e448fd6..4f725f5948c5 100644 --- a/include/test/xmltesttools.hxx +++ b/include/test/xmltesttools.hxx @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -33,6 +34,8 @@ public: /// Return xmlDocPtr representation of the XML stream read from pStream. static xmlDocPtr parseXmlStream(SvStream* pStream); + static xmlDocPtr dumpAndParse(MetafileXmlDump& rDumper, const GDIMetaFile& rGDIMetaFile); + protected: XmlTestTools(); virtual ~XmlTestTools(); diff --git a/include/vcl/mtfxmldump.hxx b/include/vcl/mtfxmldump.hxx new file mode 100644 index 000000000000..797430d0cc6b --- /dev/null +++ b/include/vcl/mtfxmldump.hxx @@ -0,0 +1,43 @@ +/* -*- 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/. + */ + +#ifndef INCLUDED_VCL_MTFXMLDUMP_HXX +#define INCLUDED_VCL_MTFXMLDUMP_HXX + +#include +#include +#include +#include +#include + +namespace tools { class XmlWriter; } + +enum class MetaActionType; + +class VCL_DLLPUBLIC MetafileXmlDump final +{ + o3tl::enumarray maFilter; + + void writeXml(const GDIMetaFile& rMetaFile, tools::XmlWriter& rWriter); + +public: + MetafileXmlDump(); + ~MetafileXmlDump(); + + void filterActionType(const MetaActionType nActionType, bool bShouldFilter); + void filterAllActionTypes(); + + /** The actual result that will be used for testing. + */ + void dump(const GDIMetaFile& rMetaFile, SvStream& rStream); +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/solenv/clang-format/blacklist b/solenv/clang-format/blacklist index 9891f07f2f3c..cb825b74afef 100644 --- a/solenv/clang-format/blacklist +++ b/solenv/clang-format/blacklist @@ -7578,7 +7578,6 @@ include/test/container/xnamecontainer.hxx include/test/container/xnamed.hxx include/test/container/xnamereplace.hxx include/test/htmltesttools.hxx -include/test/mtfxmldump.hxx include/test/primitive2dxmldump.hxx include/test/screenshot_test.hxx include/test/setupvcl.hxx @@ -7984,6 +7983,7 @@ include/vcl/metric.hxx include/vcl/mnemonic.hxx include/vcl/mnemonicengine.hxx include/vcl/msgbox.hxx +include/vcl/mtfxmldump.hxx include/vcl/notebookbar.hxx include/vcl/oldprintadaptor.hxx include/vcl/opengl/GLMHelper.hxx @@ -16571,7 +16571,6 @@ test/source/container/xnamereplace.cxx test/source/diff/diff.cxx test/source/htmltesttools.cxx test/source/isheadless.hxx -test/source/mtfxmldump.cxx test/source/primitive2dxmldump.cxx test/source/screenshot_test.cxx test/source/setupvcl.cxx @@ -18080,6 +18079,7 @@ vcl/source/gdi/jobset.cxx vcl/source/gdi/lineinfo.cxx vcl/source/gdi/mapmod.cxx vcl/source/gdi/metaact.cxx +vcl/source/gdi/mtfxmldump.cxx vcl/source/gdi/octree.cxx vcl/source/gdi/oldprintadaptor.cxx vcl/source/gdi/pdfextoutdevdata.cxx diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index e2b3006c1b4e..b4b27ccaf337 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -9,7 +9,6 @@ #include #include -#include #include #include #include @@ -2290,7 +2289,7 @@ void SwLayoutWriter::testTdf116830() // Dump the rendering of the first page as an XML file. std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); MetafileXmlDump dumper; - xmlDocPtr pXmlDoc = dumper.dumpAndParse(*xMetaFile); + xmlDocPtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); CPPUNIT_ASSERT(pXmlDoc); // Assert that the yellow rectangle (cell background) is painted after the @@ -2317,7 +2316,7 @@ void SwLayoutWriter::testTdf114163() // Dump the rendering of the first page as an XML file. std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); MetafileXmlDump dumper; - xmlDocPtr pXmlDoc = dumper.dumpAndParse(*xMetaFile); + xmlDocPtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); CPPUNIT_ASSERT(pXmlDoc); assertXPathContent( @@ -2335,7 +2334,7 @@ void SwLayoutWriter::testTdf108021() // Dump the rendering of the first page as an XML file. std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); MetafileXmlDump dumper; - xmlDocPtr pXmlDoc = dumper.dumpAndParse(*xMetaFile); + xmlDocPtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); CPPUNIT_ASSERT(pXmlDoc); assertXPath( @@ -2353,7 +2352,7 @@ void SwLayoutWriter::testTdf116925() // Dump the rendering of the first page as an XML file. std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); MetafileXmlDump dumper; - xmlDocPtr pXmlDoc = dumper.dumpAndParse(*xMetaFile); + xmlDocPtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); CPPUNIT_ASSERT(pXmlDoc); assertXPathContent(pXmlDoc, @@ -2373,7 +2372,7 @@ void SwLayoutWriter::testTdf117028() // Dump the rendering of the first page as an XML file. std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); MetafileXmlDump dumper; - xmlDocPtr pXmlDoc = dumper.dumpAndParse(*xMetaFile); + xmlDocPtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); CPPUNIT_ASSERT(pXmlDoc); // The only polypolygon in the rendering result was the white background we @@ -2395,7 +2394,7 @@ void SwLayoutWriter::testTdf106390() // Dump the rendering of the first page as an XML file. std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); MetafileXmlDump dumper; - xmlDocPtr pXmlDoc = dumper.dumpAndParse(*xMetaFile); + xmlDocPtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); CPPUNIT_ASSERT(pXmlDoc); sal_Int32 nBottom = getXPath(pXmlDoc, "//sectrectclipregion", "bottom").toInt32(); @@ -2413,7 +2412,7 @@ void SwLayoutWriter::testTableExtrusion1() // Dump the rendering of the first page as an XML file. std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); MetafileXmlDump dumper; - xmlDocPtr pXmlDoc = dumper.dumpAndParse(*xMetaFile); + xmlDocPtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); CPPUNIT_ASSERT(pXmlDoc); sal_Int32 nRight = getXPath(pXmlDoc, "//sectrectclipregion", "right").toInt32(); sal_Int32 nLeft = static_cast(nRight * 0.95); @@ -2433,7 +2432,7 @@ void SwLayoutWriter::testTableExtrusion2() // Dump the rendering of the first page as an XML file. std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); MetafileXmlDump dumper; - xmlDocPtr pXmlDoc = dumper.dumpAndParse(*xMetaFile); + xmlDocPtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); CPPUNIT_ASSERT(pXmlDoc); // End point position of the outer table. sal_Int32 nX = getXPath(pXmlDoc, "(//polyline[1]/point)[2]", "x").toInt32(); diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index 982e02f57c87..095d938fc37f 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -63,7 +63,6 @@ #include #include #include -#include class Test : public SwModelTestBase { @@ -1288,7 +1287,7 @@ DECLARE_OOXMLIMPORT_TEST(testTdf100072, "tdf100072.docx") ReadGraphic(aStream, aGraphic); const GDIMetaFile& rMetaFile = aGraphic.GetGDIMetaFile(); MetafileXmlDump dumper; - xmlDocPtr pXmlDoc = dumper.dumpAndParse(rMetaFile); + xmlDocPtr pXmlDoc = dumpAndParse(dumper, rMetaFile); // Get first polyline rightside x coordinate sal_Int32 nFirstEnd = getXPath(pXmlDoc, "(//polyline)[1]/point[2]", "x").toInt32(); diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index 269e6b92d088..bc05aeaa0445 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -1704,7 +1703,7 @@ void SwUiWriterTest::testFdo87448() ReadGraphic(aStream, aGraphic); const GDIMetaFile& rMetaFile = aGraphic.GetGDIMetaFile(); MetafileXmlDump dumper; - xmlDocPtr pXmlDoc = dumper.dumpAndParse(rMetaFile); + xmlDocPtr pXmlDoc = dumpAndParse(dumper, rMetaFile); // The first polyline in the document has a number of points to draw arcs, // the last one jumps back to the start, so we call "end" the last but one. diff --git a/test/Library_test.mk b/test/Library_test.mk index 1e4a013e1e4b..d7b3641ef6f3 100644 --- a/test/Library_test.mk +++ b/test/Library_test.mk @@ -49,7 +49,6 @@ $(eval $(call gb_Library_add_exception_objects,test,\ test/source/callgrind \ test/source/xmltesttools \ test/source/htmltesttools \ - test/source/mtfxmldump \ test/source/primitive2dxmldump \ test/source/screenshot_test \ test/source/unoapi_property_testers \ diff --git a/test/source/mtfxmldump.cxx b/test/source/mtfxmldump.cxx deleted file mode 100644 index 593123054329..000000000000 --- a/test/source/mtfxmldump.cxx +++ /dev/null @@ -1,1062 +0,0 @@ -/* -*- 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/. - */ - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -namespace -{ - -OUString collectPushFlags(PushFlags nFlags) -{ - if ((nFlags & PushFlags::ALL) == PushFlags::ALL) - return OUString("PushAll"); - else if ((nFlags & PUSH_ALLFONT) == PUSH_ALLFONT) - return OUString("PushAllFont"); - else if ((nFlags & PUSH_ALLTEXT) == PUSH_ALLTEXT) - return OUString("PushAllText"); - - std::vector aStrings; - - if (nFlags & PushFlags::LINECOLOR) - aStrings.emplace_back("PushLineColor"); - if (nFlags & PushFlags::FILLCOLOR) - aStrings.emplace_back("PushFillColor"); - if (nFlags & PushFlags::FONT) - aStrings.emplace_back("PushFont"); - if (nFlags & PushFlags::TEXTCOLOR) - aStrings.emplace_back("PushTextColor"); - if (nFlags & PushFlags::MAPMODE) - aStrings.emplace_back("PushMapMode"); - if (nFlags & PushFlags::CLIPREGION) - aStrings.emplace_back("PushClipRegion"); - if (nFlags & PushFlags::RASTEROP) - aStrings.emplace_back("PushRasterOp"); - if (nFlags & PushFlags::TEXTFILLCOLOR) - aStrings.emplace_back("PushTextFillColor"); - if (nFlags & PushFlags::TEXTALIGN) - aStrings.emplace_back("PushTextAlign"); - if (nFlags & PushFlags::REFPOINT) - aStrings.emplace_back("PushRefPoint"); - if (nFlags & PushFlags::TEXTLINECOLOR) - aStrings.emplace_back("PushTextLineColor"); - if (nFlags & PushFlags::TEXTLAYOUTMODE) - aStrings.emplace_back("PushTextLayoutMode"); - if (nFlags & PushFlags::TEXTLANGUAGE) - aStrings.emplace_back("PushTextLanguage"); - if (nFlags & PushFlags::OVERLINECOLOR) - aStrings.emplace_back("PushOverlineColor"); - - OUString aString; - - if (aStrings.empty()) - return aString; - - aString = aStrings[0]; - for (size_t i = 1; i < aStrings.size(); ++i) - { - aString = aString + ", " + aStrings[i]; - } - return aString; -} - -OUString convertDrawTextFlagsToString(DrawTextFlags eDrawTextFlags) -{ - std::vector aStrings; - if (eDrawTextFlags & DrawTextFlags::Disable) - aStrings.emplace_back("Disable"); - if (eDrawTextFlags & DrawTextFlags::Mnemonic) - aStrings.emplace_back("Mnemonic"); - if (eDrawTextFlags & DrawTextFlags::Mono) - aStrings.emplace_back("Mono"); - if (eDrawTextFlags & DrawTextFlags::Clip) - aStrings.emplace_back("Clip"); - if (eDrawTextFlags & DrawTextFlags::Left) - aStrings.emplace_back("Left"); - if (eDrawTextFlags & DrawTextFlags::Center) - aStrings.emplace_back("Center"); - if (eDrawTextFlags & DrawTextFlags::Right) - aStrings.emplace_back("Right"); - if (eDrawTextFlags & DrawTextFlags::Top) - aStrings.emplace_back("Top"); - if (eDrawTextFlags & DrawTextFlags::VCenter) - aStrings.emplace_back("VCenter"); - if (eDrawTextFlags & DrawTextFlags::Bottom) - aStrings.emplace_back("Bottom"); - if (eDrawTextFlags & DrawTextFlags::EndEllipsis) - aStrings.emplace_back("EndEllipsis"); - if (eDrawTextFlags & DrawTextFlags::PathEllipsis) - aStrings.emplace_back("PathEllipsis"); - if (eDrawTextFlags & DrawTextFlags::MultiLine) - aStrings.emplace_back("MultiLine"); - if (eDrawTextFlags & DrawTextFlags::WordBreak) - aStrings.emplace_back("WordBreak"); - if (eDrawTextFlags & DrawTextFlags::NewsEllipsis) - aStrings.emplace_back("NewsEllipsis"); - if (eDrawTextFlags & DrawTextFlags::WordBreakHyphenation) - aStrings.emplace_back("WordBreakHyphenation"); - if (eDrawTextFlags & DrawTextFlags::CenterEllipsis) - aStrings.emplace_back("CenterEllipsis"); - if (eDrawTextFlags & DrawTextFlags::HideMnemonic) - aStrings.emplace_back("HideMnemonic"); - - OUString aString; - - if (aStrings.empty()) - return OUString("None"); - - aString = aStrings[0]; - for (size_t i = 1; i < aStrings.size(); ++i) - { - aString = aString + " " + aStrings[i]; - } - return aString; -}; - -OUString convertRopToString(RasterOp eRop) -{ - switch (eRop) - { - case RasterOp::OverPaint: return OUString("overpaint"); - case RasterOp::Xor: return OUString("xor"); - case RasterOp::N0: return OUString("0"); - case RasterOp::N1: return OUString("1"); - case RasterOp::Invert: return OUString("invert"); - } - return OUString(); -} - -OUString convertTextAlignToString(TextAlign eAlign) -{ - switch (eAlign) - { - case ALIGN_BASELINE: return OUString("baseline"); - case ALIGN_BOTTOM: return OUString("bottom"); - case ALIGN_TOP: return OUString("top"); - case TextAlign_FORCE_EQUAL_SIZE: return OUString("equalsize"); - } - return OUString(); -} - -OUString convertColorToString(Color aColor) -{ - OUString aRGBString = aColor.AsRGBHexString(); - return "#" + aRGBString; -} - -OUString convertLineStyleToString(LineStyle eAlign) -{ - switch (eAlign) - { - case LineStyle::NONE: return OUString("none"); - case LineStyle::Solid: return OUString("solid"); - case LineStyle::Dash: return OUString("dash"); - default: break; - } - return OUString(); -} - -OUString convertLineJoinToString(basegfx::B2DLineJoin eJoin) -{ - switch (eJoin) - { - default: - case basegfx::B2DLineJoin::NONE: return OUString("none"); - case basegfx::B2DLineJoin::Bevel: return OUString("bevel"); - case basegfx::B2DLineJoin::Miter: return OUString("miter"); - case basegfx::B2DLineJoin::Round: return OUString("round"); - } -} - -OUString convertLineCapToString(css::drawing::LineCap eCap) -{ - switch (eCap) - { - default: - case css::drawing::LineCap_BUTT: return OUString("butt"); - case css::drawing::LineCap_ROUND: return OUString("round"); - case css::drawing::LineCap_SQUARE: return OUString("square"); - } -} - -OUString convertPolygonFlags(PolyFlags eFlags) -{ - switch (eFlags) - { - default: - case PolyFlags::Normal: return OUString("normal"); - case PolyFlags::Control: return OUString("control"); - case PolyFlags::Smooth: return OUString("smooth"); - case PolyFlags::Symmetric: return OUString("symmetric"); - } -} - -OUString convertFontWeigthToString(FontWeight eFontWeight) -{ - switch (eFontWeight) - { - case WEIGHT_DONTKNOW: return OUString("unknown"); - case WEIGHT_THIN: return OUString("thin"); - case WEIGHT_ULTRALIGHT: return OUString("ultralight"); - case WEIGHT_LIGHT: return OUString("light"); - case WEIGHT_SEMILIGHT: return OUString("semilight"); - case WEIGHT_NORMAL: return OUString("normal"); - case WEIGHT_MEDIUM: return OUString("medium"); - case WEIGHT_SEMIBOLD: return OUString("semibold"); - case WEIGHT_BOLD: return OUString("bold"); - case WEIGHT_ULTRABOLD: return OUString("ultrabold"); - case WEIGHT_BLACK: return OUString("black"); - case FontWeight_FORCE_EQUAL_SIZE: return OUString("equalsize"); - } - return OUString(); -} - -OUString convertFontStrikeoutToString(FontStrikeout eFontStrikeout) -{ - switch (eFontStrikeout) - { - case STRIKEOUT_NONE: return OUString("none"); - case STRIKEOUT_SINGLE: return OUString("single"); - case STRIKEOUT_DOUBLE: return OUString("double"); - case STRIKEOUT_DONTKNOW: return OUString("dontknow"); - case STRIKEOUT_BOLD: return OUString("bold"); - case STRIKEOUT_SLASH: return OUString("slash"); - case STRIKEOUT_X: return OUString("x"); - case FontStrikeout_FORCE_EQUAL_SIZE: return OUString("equalsize"); - } - return OUString(); -} - -OUString convertFontLineStyleToString(FontLineStyle eFontLineStyle) -{ - switch (eFontLineStyle) - { - case LINESTYLE_NONE: return OUString("none"); - case LINESTYLE_SINGLE: return OUString("single"); - case LINESTYLE_DOUBLE: return OUString("double"); - case LINESTYLE_DOTTED: return OUString("dotted"); - case LINESTYLE_DONTKNOW: return OUString("dontknow"); - case LINESTYLE_DASH: return OUString("dash"); - case LINESTYLE_LONGDASH: return OUString("longdash"); - case LINESTYLE_DASHDOT: return OUString("dashdot"); - case LINESTYLE_DASHDOTDOT: return OUString("dashdotdot"); - case LINESTYLE_SMALLWAVE: return OUString("smallwave"); - case LINESTYLE_WAVE: return OUString("wave"); - case LINESTYLE_DOUBLEWAVE: return OUString("doublewave"); - case LINESTYLE_BOLD: return OUString("bold"); - case LINESTYLE_BOLDDOTTED: return OUString("bolddotted"); - case LINESTYLE_BOLDDASH: return OUString("bolddash"); - case LINESTYLE_BOLDLONGDASH: return OUString("boldlongdash"); - case LINESTYLE_BOLDDASHDOT: return OUString("bolddashdot"); - case LINESTYLE_BOLDDASHDOTDOT: return OUString("bolddashdotdot"); - case LINESTYLE_BOLDWAVE: return OUString("boldwave"); - case FontLineStyle_FORCE_EQUAL_SIZE: return OUString("equalsize"); - } - return OUString(); -} - -OString convertLineStyleToString(const MetaActionType nActionType) -{ - switch (nActionType) - { - case MetaActionType::NONE: return "null"; - case MetaActionType::PIXEL: return "pixel"; - case MetaActionType::POINT: return "point"; - case MetaActionType::LINE: return "line"; - case MetaActionType::RECT: return "rect"; - case MetaActionType::ROUNDRECT: return "roundrect"; - case MetaActionType::ELLIPSE: return "ellipse"; - case MetaActionType::ARC: return "arc"; - case MetaActionType::PIE: return "pie"; - case MetaActionType::CHORD: return "chord"; - case MetaActionType::POLYLINE: return "polyline"; - case MetaActionType::POLYGON: return "polygon"; - case MetaActionType::POLYPOLYGON: return "polypolygon"; - case MetaActionType::TEXT: return "text"; - case MetaActionType::TEXTARRAY: return "textarray"; - case MetaActionType::STRETCHTEXT: return "stretchtext"; - case MetaActionType::TEXTRECT: return "textrect"; - case MetaActionType::TEXTLINE: return "textline"; - case MetaActionType::BMP: return "bmp"; - case MetaActionType::BMPSCALE: return "bmpscale"; - case MetaActionType::BMPSCALEPART: return "bmpscalepart"; - case MetaActionType::BMPEX: return "bmpex"; - case MetaActionType::BMPEXSCALE: return "bmpexscale"; - case MetaActionType::BMPEXSCALEPART: return "bmpexscalepart"; - case MetaActionType::MASK: return "mask"; - case MetaActionType::MASKSCALE: return "maskscale"; - case MetaActionType::MASKSCALEPART: return "maskscalepart"; - case MetaActionType::GRADIENT: return "gradient"; - case MetaActionType::GRADIENTEX: return "gradientex"; - case MetaActionType::HATCH: return "hatch"; - case MetaActionType::WALLPAPER: return "wallpaper"; - case MetaActionType::CLIPREGION: return "clipregion"; - case MetaActionType::ISECTRECTCLIPREGION: return "sectrectclipregion"; - case MetaActionType::ISECTREGIONCLIPREGION: return "sectregionclipregion"; - case MetaActionType::MOVECLIPREGION: return "moveclipregion"; - case MetaActionType::LINECOLOR: return "linecolor"; - case MetaActionType::FILLCOLOR: return "fillcolor"; - case MetaActionType::TEXTCOLOR: return "textcolor"; - case MetaActionType::TEXTFILLCOLOR: return "textfillcolor"; - case MetaActionType::TEXTLINECOLOR: return "textlinecolor"; - case MetaActionType::OVERLINECOLOR: return "overlinecolor"; - case MetaActionType::TEXTALIGN: return "textalign"; - case MetaActionType::MAPMODE: return "mapmode"; - case MetaActionType::FONT: return "font"; - case MetaActionType::PUSH: return "push"; - case MetaActionType::POP: return "pop"; - case MetaActionType::RASTEROP: return "rasterop"; - case MetaActionType::Transparent: return "transparent"; - case MetaActionType::FLOATTRANSPARENT: return "floattransparent"; - case MetaActionType::EPS: return "eps"; - case MetaActionType::REFPOINT: return "refpoint"; - case MetaActionType::COMMENT: return "comment"; - case MetaActionType::LAYOUTMODE: return "layoutmode"; - case MetaActionType::TEXTLANGUAGE: return "textlanguage"; - } - return ""; -} - -OUString convertBitmapExTransparentType(TransparentType eType) -{ - switch (eType) - { - default: - case TransparentType::NONE: return OUString("none"); - case TransparentType::Bitmap: return OUString("bitmap"); - case TransparentType::Color: return OUString("color"); - } -} - -OUString convertMapUnitToString(MapUnit eUnit) -{ - switch (eUnit) - { - default: - case MapUnit::LASTENUMDUMMY: return OUString("LASTENUMDUMMY"); - case MapUnit::Map1000thInch: return OUString("Map1000thInch"); - case MapUnit::Map100thInch: return OUString("Map100thInch"); - case MapUnit::Map100thMM: return OUString("Map100thMM"); - case MapUnit::Map10thInch: return OUString("Map10thInch"); - case MapUnit::Map10thMM: return OUString("Map10thMM"); - case MapUnit::MapAppFont: return OUString("MapAppFont"); - case MapUnit::MapCM: return OUString("MapCM"); - case MapUnit::MapInch: return OUString("MapInch"); - case MapUnit::MapMM: return OUString("MapMM"); - case MapUnit::MapPixel: return OUString("MapPixel"); - case MapUnit::MapPoint: return OUString("MapPoint"); - case MapUnit::MapRelative: return OUString("MapRelative"); - case MapUnit::MapSysFont: return OUString("MapSysFont"); - case MapUnit::MapTwip: return OUString("MapTwip"); - } -} - -OUString convertFractionToString(const Fraction& aFraction) -{ - std::stringstream ss; - - ss << aFraction; - - return OUString::createFromAscii(ss.str().c_str()); -} - - -OUString hex32(sal_uInt32 nNumber) -{ - std::stringstream ss; - ss << std::hex << std::setfill ('0') << std::setw(8) << nNumber; - return OUString::createFromAscii(ss.str().c_str()); -} - -void writePoint(tools::XmlWriter& rWriter, Point const& rPoint) -{ - rWriter.attribute("x", rPoint.X()); - rWriter.attribute("y", rPoint.Y()); -} - -void writeStartPoint(tools::XmlWriter& rWriter, Point const& rPoint) -{ - rWriter.attribute("startx", rPoint.X()); - rWriter.attribute("starty", rPoint.Y()); -} - -void writeEndPoint(tools::XmlWriter& rWriter, Point const& rPoint) -{ - rWriter.attribute("endx", rPoint.X()); - rWriter.attribute("endy", rPoint.Y()); -} - -void writeSize(tools::XmlWriter& rWriter, Size const& rSize) -{ - rWriter.attribute("width", rSize.Width()); - rWriter.attribute("height", rSize.Height()); -} - -void writeRectangle(tools::XmlWriter& rWriter, tools::Rectangle const& rRectangle) -{ - rWriter.attribute("left", rRectangle.Left()); - rWriter.attribute("top", rRectangle.Top()); - rWriter.attribute("right", rRectangle.Right()); - rWriter.attribute("bottom", rRectangle.Bottom()); -} - -void writeLineInfo(tools::XmlWriter& rWriter, LineInfo const& rLineInfo) -{ - rWriter.attribute("style", convertLineStyleToString(rLineInfo.GetStyle())); - rWriter.attribute("width", rLineInfo.GetWidth()); - rWriter.attribute("dashlen", rLineInfo.GetDashLen()); - rWriter.attribute("dashcount", rLineInfo.GetDashCount()); - rWriter.attribute("dotlen", rLineInfo.GetDotLen()); - rWriter.attribute("dotcount", rLineInfo.GetDotCount()); - rWriter.attribute("distance", rLineInfo.GetDistance()); - rWriter.attribute("join", convertLineJoinToString(rLineInfo.GetLineJoin())); - rWriter.attribute("cap", convertLineCapToString(rLineInfo.GetLineCap())); -} - -} // anonymous namespace - -MetafileXmlDump::MetafileXmlDump() -{ - maFilter.fill(false); -} - -MetafileXmlDump::~MetafileXmlDump() -{} - -void MetafileXmlDump::filterActionType(const MetaActionType nActionType, bool bShouldFilter) -{ - maFilter[nActionType] = bShouldFilter; -} - -void MetafileXmlDump::filterAllActionTypes() -{ - maFilter.fill(true); -} - -xmlDocPtr MetafileXmlDump::dumpAndParse(const GDIMetaFile& rMetaFile, const OUString& rTempStreamName) -{ - std::unique_ptr pStream; - - if (rTempStreamName.isEmpty()) - pStream.reset(new SvMemoryStream()); - else - pStream.reset(new SvFileStream(rTempStreamName, StreamMode::STD_READWRITE | StreamMode::TRUNC)); - - tools::XmlWriter aWriter(pStream.get()); - aWriter.startDocument(); - aWriter.startElement("metafile"); - - writeXml(rMetaFile, aWriter); - - aWriter.endElement(); - aWriter.endDocument(); - - pStream->Seek(STREAM_SEEK_TO_BEGIN); - - xmlDocPtr pDoc = XmlTestTools::parseXmlStream(pStream.get()); - - return pDoc; -} - -void MetafileXmlDump::writeXml(const GDIMetaFile& rMetaFile, tools::XmlWriter& rWriter) -{ - for(size_t nAction = 0; nAction < rMetaFile.GetActionSize(); ++nAction) - { - MetaAction* pAction = rMetaFile.GetAction(nAction); - const MetaActionType nActionType = pAction->GetType(); - if (maFilter[nActionType]) - continue; - - OString sCurrentElementTag = convertLineStyleToString(nActionType); - - switch (nActionType) - { - case MetaActionType::PIXEL: - { - auto* pMetaAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writePoint(rWriter, pMetaAction->GetPoint()); - rWriter.attribute("color", convertColorToString(pMetaAction->GetColor())); - rWriter.endElement(); - } - break; - - case MetaActionType::POINT: - { - auto* pMetaAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writePoint(rWriter, pMetaAction->GetPoint()); - rWriter.endElement(); - } - break; - - case MetaActionType::RECT: - { - MetaRectAction* pMetaAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writeRectangle(rWriter, pMetaAction->GetRect()); - rWriter.endElement(); - } - break; - - case MetaActionType::ROUNDRECT: - { - auto pMetaAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writeRectangle(rWriter, pMetaAction->GetRect()); - rWriter.attribute("horizontalround", pMetaAction->GetHorzRound()); - rWriter.attribute("verticalround", pMetaAction->GetVertRound()); - rWriter.endElement(); - } - break; - - case MetaActionType::ELLIPSE: - { - auto pMetaAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writeRectangle(rWriter, pMetaAction->GetRect()); - rWriter.endElement(); - } - break; - - case MetaActionType::ARC: - { - auto pMetaAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writeRectangle(rWriter, pMetaAction->GetRect()); - writeStartPoint(rWriter, pMetaAction->GetStartPoint()); - writeEndPoint(rWriter, pMetaAction->GetEndPoint()); - rWriter.endElement(); - } - break; - - case MetaActionType::PIE: - { - auto pMetaAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writeRectangle(rWriter, pMetaAction->GetRect()); - writeStartPoint(rWriter, pMetaAction->GetStartPoint()); - writeEndPoint(rWriter, pMetaAction->GetEndPoint()); - rWriter.endElement(); - } - break; - - case MetaActionType::CHORD: - { - auto pMetaAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writeRectangle(rWriter, pMetaAction->GetRect()); - writeStartPoint(rWriter, pMetaAction->GetStartPoint()); - writeEndPoint(rWriter, pMetaAction->GetEndPoint()); - rWriter.endElement(); - } - break; - - case MetaActionType::LINE: - { - MetaLineAction* pMetaLineAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writeStartPoint(rWriter, pMetaLineAction->GetStartPoint()); - writeEndPoint(rWriter, pMetaLineAction->GetEndPoint()); - - writeLineInfo(rWriter, pMetaLineAction->GetLineInfo()); - rWriter.endElement(); - } - break; - - case MetaActionType::PUSH: - { - MetaPushAction* pMetaPushAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - rWriter.attribute("flags", collectPushFlags(pMetaPushAction->GetFlags())); - } - break; - - case MetaActionType::POP: - { - rWriter.endElement(); - } - break; - - case MetaActionType::RASTEROP: - { - MetaRasterOpAction* pMetaRasterOpAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - if (pMetaRasterOpAction->GetRasterOp() != RasterOp::OverPaint) - { - rWriter.attribute("operation", convertRopToString(pMetaRasterOpAction->GetRasterOp())); - } - rWriter.endElement(); - } - break; - - case MetaActionType::TEXTLINECOLOR: - { - MetaTextLineColorAction* pMetaTextLineColorAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - rWriter.attribute("color", convertColorToString(pMetaTextLineColorAction->GetColor())); - rWriter.endElement(); - } - break; - - case MetaActionType::TEXTFILLCOLOR: - { - MetaTextFillColorAction* pMetaTextFillColorAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - rWriter.attribute("color", convertColorToString(pMetaTextFillColorAction->GetColor())); - - if (pMetaTextFillColorAction->IsSetting()) - rWriter.attribute("setting", OUString("true")); - - rWriter.endElement(); - } - break; - - case MetaActionType::FONT: - { - MetaFontAction* pMetaFontAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - vcl::Font aFont = pMetaFontAction->GetFont(); - - rWriter.attribute("color", convertColorToString(aFont.GetColor())); - rWriter.attribute("fillcolor", convertColorToString(aFont.GetFillColor())); - rWriter.attribute("name", aFont.GetFamilyName()); - rWriter.attribute("stylename", aFont.GetStyleName()); - rWriter.attribute("width", aFont.GetFontSize().Width()); - rWriter.attribute("height", aFont.GetFontSize().Height()); - rWriter.attribute("orientation", aFont.GetOrientation()); - rWriter.attribute("weight", convertFontWeigthToString(aFont.GetWeight())); - - rWriter.endElement(); - } - break; - - case MetaActionType::TEXTALIGN: - { - MetaTextAlignAction* pMetaTextAlignAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - OUString sAlign = convertTextAlignToString(pMetaTextAlignAction->GetTextAlign()); - if (!sAlign.isEmpty()) - rWriter.attribute("align", sAlign); - rWriter.endElement(); - } - break; - - case MetaActionType::TEXTCOLOR: - { - MetaTextColorAction* pMetaTextColorAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - rWriter.attribute("color", convertColorToString(pMetaTextColorAction->GetColor())); - rWriter.endElement(); - } - break; - - case MetaActionType::TEXT: - { - auto* pMeta = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writePoint(rWriter, pMeta->GetPoint()); - rWriter.attribute("index", pMeta->GetIndex()); - rWriter.attribute("length", pMeta->GetLen()); - rWriter.startElement("textcontent"); - rWriter.content(pMeta->GetText()); - rWriter.endElement(); - - rWriter.endElement(); - } - break; - - case MetaActionType::TEXTARRAY: - { - MetaTextArrayAction* pMetaTextArrayAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - sal_Int32 aIndex = pMetaTextArrayAction->GetIndex(); - sal_Int32 aLength = pMetaTextArrayAction->GetLen(); - - writePoint(rWriter, pMetaTextArrayAction->GetPoint()); - rWriter.attribute("index", aIndex); - rWriter.attribute("length", aLength); - - if (pMetaTextArrayAction->GetDXArray()) - { - rWriter.startElement("dxarray"); - OUStringBuffer sDxLengthString; - for (sal_Int32 i = 0; i < aLength - aIndex; ++i) - { - sDxLengthString.append(OUString::number(pMetaTextArrayAction->GetDXArray()[aIndex + i])); - sDxLengthString.append(" "); - } - rWriter.content(sDxLengthString.makeStringAndClear()); - rWriter.endElement(); - } - - rWriter.startElement("text"); - rWriter.content(pMetaTextArrayAction->GetText()); - rWriter.endElement(); - - rWriter.endElement(); - } - break; - - case MetaActionType::STRETCHTEXT: - { - auto* pMeta = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - writePoint(rWriter, pMeta->GetPoint()); - rWriter.attribute("index", pMeta->GetIndex()); - rWriter.attribute("length", pMeta->GetLen()); - rWriter.attribute("width", pMeta->GetWidth()); - - rWriter.startElement("textcontent"); - rWriter.content(pMeta->GetText()); - rWriter.endElement(); - - rWriter.endElement(); - } - break; - - case MetaActionType::TEXTRECT: - { - auto* pMeta = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writeRectangle(rWriter, pMeta->GetRect()); - rWriter.startElement("textcontent"); - rWriter.content(pMeta->GetText()); - rWriter.endElement(); - - rWriter.startElement("style"); - rWriter.content(convertDrawTextFlagsToString(pMeta->GetStyle())); - rWriter.endElement(); - - rWriter.endElement(); - } - break; - - case MetaActionType::TEXTLINE: - { - auto* pMeta = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writePoint(rWriter, pMeta->GetStartPoint()); - rWriter.attribute("width", pMeta->GetWidth()); - rWriter.attribute("strikeout", convertFontStrikeoutToString(pMeta->GetStrikeout())); - rWriter.attribute("underline", convertFontLineStyleToString(pMeta->GetUnderline())); - rWriter.attribute("overline", convertFontLineStyleToString(pMeta->GetOverline())); - rWriter.endElement(); - } - break; - - case MetaActionType::LINECOLOR: - { - MetaLineColorAction* pMetaLineColorAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - rWriter.attribute("color", convertColorToString(pMetaLineColorAction->GetColor())); - rWriter.endElement(); - } - break; - - case MetaActionType::FILLCOLOR: - { - MetaFillColorAction* pMetaFillColorAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - rWriter.attribute("color", convertColorToString(pMetaFillColorAction->GetColor())); - rWriter.endElement(); - } - break; - - case MetaActionType::CLIPREGION: - { - const MetaClipRegionAction* pA = static_cast< const MetaClipRegionAction* >(pAction); - rWriter.startElement(sCurrentElementTag); - - // FIXME for now we dump only the bounding box; this is - // enough for the tests we have, but may need extending to - // dumping the real polypolygon in the future - tools::Rectangle aRectangle = pA->GetRegion().GetBoundRect(); - writeRectangle(rWriter, aRectangle); - rWriter.endElement(); - } - break; - - case MetaActionType::ISECTRECTCLIPREGION: - { - MetaISectRectClipRegionAction* pMetaISectRectClipRegionAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - tools::Rectangle aRectangle = pMetaISectRectClipRegionAction->GetRect(); - writeRectangle(rWriter, aRectangle); - rWriter.endElement(); - } - break; - - case MetaActionType::ISECTREGIONCLIPREGION: - { - MetaISectRegionClipRegionAction* pMetaISectRegionClipRegionAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - // FIXME for now we dump only the bounding box; this is - // enough for the tests we have, but may need extending to - // dumping the real polypolygon in the future - tools::Rectangle aRectangle = pMetaISectRegionClipRegionAction->GetRegion().GetBoundRect(); - writeRectangle(rWriter, aRectangle); - rWriter.endElement(); - } - break; - - case MetaActionType::POLYLINE: - { - MetaPolyLineAction* pMetaPolyLineAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - writeLineInfo(rWriter, pMetaPolyLineAction->GetLineInfo()); - - tools::Polygon aPolygon = pMetaPolyLineAction->GetPolygon(); - bool bFlags = aPolygon.HasFlags(); - for (sal_uInt16 i = 0; i < aPolygon.GetSize(); i++) - { - rWriter.startElement("point"); - writePoint(rWriter, aPolygon[i]); - if (bFlags) - rWriter.attribute("flags", convertPolygonFlags(aPolygon.GetFlags(i))); - rWriter.endElement(); - } - - rWriter.endElement(); - } - break; - - case MetaActionType::POLYGON: - { - MetaPolygonAction* pMetaPolygonAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - tools::Polygon aPolygon = pMetaPolygonAction->GetPolygon(); - bool bFlags = aPolygon.HasFlags(); - for (sal_uInt16 i = 0; i < aPolygon.GetSize(); i++) - { - rWriter.startElement("point"); - writePoint(rWriter, aPolygon[i]); - if (bFlags) - rWriter.attribute("flags", convertPolygonFlags(aPolygon.GetFlags(i))); - rWriter.endElement(); - } - - rWriter.endElement(); - } - break; - - case MetaActionType::POLYPOLYGON: - { - MetaPolyPolygonAction *const pMetaPolyPolygonAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - tools::PolyPolygon const& rPolyPolygon(pMetaPolyPolygonAction->GetPolyPolygon()); - - for (sal_uInt16 j = 0; j < rPolyPolygon.Count(); ++j) - { - rWriter.startElement("polygon"); - tools::Polygon const& rPolygon = rPolyPolygon[j]; - bool bFlags = rPolygon.HasFlags(); - for (sal_uInt16 i = 0; i < rPolygon.GetSize(); ++i) - { - rWriter.startElement("point"); - writePoint(rWriter, rPolygon[i]); - if (bFlags) - rWriter.attribute("flags", convertPolygonFlags(rPolygon.GetFlags(i))); - rWriter.endElement(); - } - rWriter.endElement(); - } - - rWriter.endElement(); - } - break; - - case MetaActionType::COMMENT: - { - MetaCommentAction* pMetaCommentAction = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - - if (pMetaCommentAction->GetDataSize() > 0) - { - rWriter.attribute("datasize", pMetaCommentAction->GetDataSize()); - } - if (!pMetaCommentAction->GetComment().isEmpty()) - { - rWriter.startElement("comment"); - rWriter.content(pMetaCommentAction->GetComment()); - rWriter.endElement(); - } - - rWriter.endElement(); - } - break; - - case MetaActionType::BMP: - { - auto pMeta = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writePoint(rWriter, pMeta->GetPoint()); - rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum())); - rWriter.endElement(); - } - break; - - case MetaActionType::BMPSCALE: - { - auto pMeta = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writePoint(rWriter, pMeta->GetPoint()); - writeSize(rWriter, pMeta->GetSize()); - rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum())); - rWriter.endElement(); - } - break; - - case MetaActionType::BMPSCALEPART: - { - auto pMeta = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - rWriter.attribute("destx", pMeta->GetDestPoint().X()); - rWriter.attribute("desty", pMeta->GetDestPoint().Y()); - rWriter.attribute("destwidth", pMeta->GetDestSize().Width()); - rWriter.attribute("destheight", pMeta->GetDestSize().Height()); - rWriter.attribute("srcx", pMeta->GetSrcPoint().X()); - rWriter.attribute("srcy", pMeta->GetSrcPoint().Y()); - rWriter.attribute("srcwidth", pMeta->GetSrcSize().Width()); - rWriter.attribute("srcheight", pMeta->GetSrcSize().Height()); - rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum())); - rWriter.endElement(); - } - break; - - case MetaActionType::BMPEX: - { - auto pMeta = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writePoint(rWriter, pMeta->GetPoint()); - rWriter.attribute("crc", hex32(pMeta->GetBitmapEx().GetBitmap().GetChecksum())); - rWriter.attribute("transparenttype", convertBitmapExTransparentType(pMeta->GetBitmapEx().GetTransparentType())); - rWriter.endElement(); - } - break; - - case MetaActionType::BMPEXSCALE: - { - auto pMeta = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writePoint(rWriter, pMeta->GetPoint()); - writeSize(rWriter, pMeta->GetSize()); - rWriter.attribute("crc", hex32(pMeta->GetBitmapEx().GetBitmap().GetChecksum())); - rWriter.attribute("transparenttype", convertBitmapExTransparentType(pMeta->GetBitmapEx().GetTransparentType())); - rWriter.endElement(); - } - break; - - case MetaActionType::BMPEXSCALEPART: - { - auto pMeta = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - rWriter.attribute("destx", pMeta->GetDestPoint().X()); - rWriter.attribute("desty", pMeta->GetDestPoint().Y()); - rWriter.attribute("destwidth", pMeta->GetDestSize().Width()); - rWriter.attribute("destheight", pMeta->GetDestSize().Height()); - rWriter.attribute("srcx", pMeta->GetSrcPoint().X()); - rWriter.attribute("srcy", pMeta->GetSrcPoint().Y()); - rWriter.attribute("srcwidth", pMeta->GetSrcSize().Width()); - rWriter.attribute("srcheight", pMeta->GetSrcSize().Height()); - rWriter.attribute("crc", hex32(pMeta->GetBitmapEx().GetBitmap().GetChecksum())); - rWriter.attribute("transparenttype", convertBitmapExTransparentType(pMeta->GetBitmapEx().GetTransparentType())); - rWriter.endElement(); - } - break; - - case MetaActionType::MASK: - { - auto pMeta = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writePoint(rWriter, pMeta->GetPoint()); - rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum())); - rWriter.attribute("color", convertColorToString(pMeta->GetColor())); - rWriter.endElement(); - } - break; - - case MetaActionType::MASKSCALE: - { - auto pMeta = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - writePoint(rWriter, pMeta->GetPoint()); - writeSize(rWriter, pMeta->GetSize()); - rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum())); - rWriter.attribute("color", convertColorToString(pMeta->GetColor())); - rWriter.endElement(); - } - break; - - case MetaActionType::MASKSCALEPART: - { - auto pMeta = static_cast(pAction); - rWriter.startElement(sCurrentElementTag); - rWriter.attribute("destx", pMeta->GetDestPoint().X()); - rWriter.attribute("desty", pMeta->GetDestPoint().Y()); - rWriter.attribute("destwidth", pMeta->GetDestSize().Width()); - rWriter.attribute("destheight", pMeta->GetDestSize().Height()); - rWriter.attribute("srcx", pMeta->GetSrcPoint().X()); - rWriter.attribute("srcy", pMeta->GetSrcPoint().Y()); - rWriter.attribute("srcwidth", pMeta->GetSrcSize().Width()); - rWriter.attribute("srcheight", pMeta->GetSrcSize().Height()); - rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum())); - rWriter.attribute("color", convertColorToString(pMeta->GetColor())); - rWriter.endElement(); - } - break; - - case MetaActionType::MAPMODE: - { - const MetaMapModeAction* pMeta = static_cast(pAction); - MapMode aMapMode = pMeta->GetMapMode(); - rWriter.startElement(sCurrentElementTag); - rWriter.attribute("mapunit", convertMapUnitToString( aMapMode.GetMapUnit() )); - writePoint(rWriter, aMapMode.GetOrigin()); - rWriter.attribute("scalex", convertFractionToString(aMapMode.GetScaleX())); - rWriter.attribute("scaley", convertFractionToString(aMapMode.GetScaleY())); - rWriter.endElement(); - } - break; - - default: - { - rWriter.element(sCurrentElementTag); - } - break; - } - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/test/source/xmltesttools.cxx b/test/source/xmltesttools.cxx index dd3179cb1e1f..00d156c40ecf 100644 --- a/test/source/xmltesttools.cxx +++ b/test/source/xmltesttools.cxx @@ -11,6 +11,8 @@ #include +#include + namespace { OUString convert(xmlChar const * string) { @@ -49,6 +51,14 @@ xmlDocPtr XmlTestTools::parseXmlStream(SvStream* pStream) return xmlParseDoc(reinterpret_cast(pBuffer.get())); } +xmlDocPtr XmlTestTools::dumpAndParse(MetafileXmlDump& rDumper, const GDIMetaFile& rGDIMetaFile) +{ + SvMemoryStream aStream; + rDumper.dump(rGDIMetaFile, aStream); + aStream.Seek(STREAM_SEEK_TO_BEGIN); + return XmlTestTools::parseXmlStream(&aStream); +} + xmlXPathObjectPtr XmlTestTools::getXPathNode(xmlDocPtr pXmlDoc, const OString& rXPath) { xmlXPathContextPtr pXmlXpathCtx = xmlXPathNewContext(pXmlDoc); diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index da9bc387ca2f..31e677b9e37d 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -260,6 +260,7 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/source/gdi/embeddedfontshelper \ vcl/source/gdi/extoutdevdata \ vcl/source/gdi/gdimtf \ + vcl/source/gdi/mtfxmldump \ vcl/source/gdi/gdimetafiletools \ vcl/source/gdi/gfxlink \ vcl/source/gdi/gradient \ diff --git a/vcl/README b/vcl/README index 9219c30b5b46..d8da537939b3 100644 --- a/vcl/README +++ b/vcl/README @@ -88,14 +88,10 @@ GDIMetafile is a vector drawing representation that corresponds directly to the SVM (StarView Metafile) format; it is extremely important as an intermediate format in all sorts of drawing and printing operations. -There is a class MetafileXmlDump in include/test/mtfxmldump.hxx that +There is a class MetafileXmlDump in include/vcl/mtfxmldump.hxx that can store a GDIMetafile as XML, which makes debugging much easier since you can just use "diff" to see changes. -To use it you need to link against "test" library and then (because -"test" is not part of the installation) run with: -LD_LIBRARY_PATH=workdir/LinkTarget/Library:workdir/UnpackedTarball/cppunit/src/cppunit/.libs instdir/program/soffice - == EMF+ == emf+ is vector file format used by MSO and is successor of wmf and diff --git a/vcl/qa/cppunit/svm/svmtest.cxx b/vcl/qa/cppunit/svm/svmtest.cxx index 116bf0ab6758..163522634781 100644 --- a/vcl/qa/cppunit/svm/svmtest.cxx +++ b/vcl/qa/cppunit/svm/svmtest.cxx @@ -10,7 +10,6 @@ #include #include -#include #include #include #include @@ -27,7 +26,7 @@ class SvmTest : public test::BootstrapFixture, public XmlTestTools return m_directories.getURLFromSrc(maDataUrl) + sFileName; }*/ - xmlDocPtr dumpMeta(const GDIMetaFile& rMetaFile, const OUString& rFileUrl = OUString()); + xmlDocPtr dumpMeta(const GDIMetaFile& rMetaFile); void checkVirtualDevice(xmlDocPtr pDoc); void checkErase(xmlDocPtr pDoc); @@ -188,10 +187,10 @@ static GDIMetaFile writeAndRead(GDIMetaFile& rMetaFile, const OUString& sUrl) } } -xmlDocPtr SvmTest::dumpMeta(const GDIMetaFile& rMetaFile, const OUString& rFileUrl) +xmlDocPtr SvmTest::dumpMeta(const GDIMetaFile& rMetaFile) { MetafileXmlDump dumper; - xmlDocPtr pDoc = dumper.dumpAndParse(rMetaFile, rFileUrl); + xmlDocPtr pDoc = dumpAndParse(dumper, rMetaFile); CPPUNIT_ASSERT (pDoc); checkVirtualDevice(pDoc); diff --git a/vcl/source/gdi/mtfxmldump.cxx b/vcl/source/gdi/mtfxmldump.cxx new file mode 100644 index 000000000000..2666ddd55d78 --- /dev/null +++ b/vcl/source/gdi/mtfxmldump.cxx @@ -0,0 +1,1049 @@ +/* -*- 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/. + */ + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +namespace +{ + +OUString collectPushFlags(PushFlags nFlags) +{ + if ((nFlags & PushFlags::ALL) == PushFlags::ALL) + return OUString("PushAll"); + else if ((nFlags & PUSH_ALLFONT) == PUSH_ALLFONT) + return OUString("PushAllFont"); + else if ((nFlags & PUSH_ALLTEXT) == PUSH_ALLTEXT) + return OUString("PushAllText"); + + std::vector aStrings; + + if (nFlags & PushFlags::LINECOLOR) + aStrings.emplace_back("PushLineColor"); + if (nFlags & PushFlags::FILLCOLOR) + aStrings.emplace_back("PushFillColor"); + if (nFlags & PushFlags::FONT) + aStrings.emplace_back("PushFont"); + if (nFlags & PushFlags::TEXTCOLOR) + aStrings.emplace_back("PushTextColor"); + if (nFlags & PushFlags::MAPMODE) + aStrings.emplace_back("PushMapMode"); + if (nFlags & PushFlags::CLIPREGION) + aStrings.emplace_back("PushClipRegion"); + if (nFlags & PushFlags::RASTEROP) + aStrings.emplace_back("PushRasterOp"); + if (nFlags & PushFlags::TEXTFILLCOLOR) + aStrings.emplace_back("PushTextFillColor"); + if (nFlags & PushFlags::TEXTALIGN) + aStrings.emplace_back("PushTextAlign"); + if (nFlags & PushFlags::REFPOINT) + aStrings.emplace_back("PushRefPoint"); + if (nFlags & PushFlags::TEXTLINECOLOR) + aStrings.emplace_back("PushTextLineColor"); + if (nFlags & PushFlags::TEXTLAYOUTMODE) + aStrings.emplace_back("PushTextLayoutMode"); + if (nFlags & PushFlags::TEXTLANGUAGE) + aStrings.emplace_back("PushTextLanguage"); + if (nFlags & PushFlags::OVERLINECOLOR) + aStrings.emplace_back("PushOverlineColor"); + + OUString aString; + + if (aStrings.empty()) + return aString; + + aString = aStrings[0]; + for (size_t i = 1; i < aStrings.size(); ++i) + { + aString = aString + ", " + aStrings[i]; + } + return aString; +} + +OUString convertDrawTextFlagsToString(DrawTextFlags eDrawTextFlags) +{ + std::vector aStrings; + if (eDrawTextFlags & DrawTextFlags::Disable) + aStrings.emplace_back("Disable"); + if (eDrawTextFlags & DrawTextFlags::Mnemonic) + aStrings.emplace_back("Mnemonic"); + if (eDrawTextFlags & DrawTextFlags::Mono) + aStrings.emplace_back("Mono"); + if (eDrawTextFlags & DrawTextFlags::Clip) + aStrings.emplace_back("Clip"); + if (eDrawTextFlags & DrawTextFlags::Left) + aStrings.emplace_back("Left"); + if (eDrawTextFlags & DrawTextFlags::Center) + aStrings.emplace_back("Center"); + if (eDrawTextFlags & DrawTextFlags::Right) + aStrings.emplace_back("Right"); + if (eDrawTextFlags & DrawTextFlags::Top) + aStrings.emplace_back("Top"); + if (eDrawTextFlags & DrawTextFlags::VCenter) + aStrings.emplace_back("VCenter"); + if (eDrawTextFlags & DrawTextFlags::Bottom) + aStrings.emplace_back("Bottom"); + if (eDrawTextFlags & DrawTextFlags::EndEllipsis) + aStrings.emplace_back("EndEllipsis"); + if (eDrawTextFlags & DrawTextFlags::PathEllipsis) + aStrings.emplace_back("PathEllipsis"); + if (eDrawTextFlags & DrawTextFlags::MultiLine) + aStrings.emplace_back("MultiLine"); + if (eDrawTextFlags & DrawTextFlags::WordBreak) + aStrings.emplace_back("WordBreak"); + if (eDrawTextFlags & DrawTextFlags::NewsEllipsis) + aStrings.emplace_back("NewsEllipsis"); + if (eDrawTextFlags & DrawTextFlags::WordBreakHyphenation) + aStrings.emplace_back("WordBreakHyphenation"); + if (eDrawTextFlags & DrawTextFlags::CenterEllipsis) + aStrings.emplace_back("CenterEllipsis"); + if (eDrawTextFlags & DrawTextFlags::HideMnemonic) + aStrings.emplace_back("HideMnemonic"); + + OUString aString; + + if (aStrings.empty()) + return OUString("None"); + + aString = aStrings[0]; + for (size_t i = 1; i < aStrings.size(); ++i) + { + aString = aString + " " + aStrings[i]; + } + return aString; +}; + +OUString convertRopToString(RasterOp eRop) +{ + switch (eRop) + { + case RasterOp::OverPaint: return OUString("overpaint"); + case RasterOp::Xor: return OUString("xor"); + case RasterOp::N0: return OUString("0"); + case RasterOp::N1: return OUString("1"); + case RasterOp::Invert: return OUString("invert"); + } + return OUString(); +} + +OUString convertTextAlignToString(TextAlign eAlign) +{ + switch (eAlign) + { + case ALIGN_BASELINE: return OUString("baseline"); + case ALIGN_BOTTOM: return OUString("bottom"); + case ALIGN_TOP: return OUString("top"); + case TextAlign_FORCE_EQUAL_SIZE: return OUString("equalsize"); + } + return OUString(); +} + +OUString convertColorToString(Color aColor) +{ + OUString aRGBString = aColor.AsRGBHexString(); + return "#" + aRGBString; +} + +OUString convertLineStyleToString(LineStyle eAlign) +{ + switch (eAlign) + { + case LineStyle::NONE: return OUString("none"); + case LineStyle::Solid: return OUString("solid"); + case LineStyle::Dash: return OUString("dash"); + default: break; + } + return OUString(); +} + +OUString convertLineJoinToString(basegfx::B2DLineJoin eJoin) +{ + switch (eJoin) + { + default: + case basegfx::B2DLineJoin::NONE: return OUString("none"); + case basegfx::B2DLineJoin::Bevel: return OUString("bevel"); + case basegfx::B2DLineJoin::Miter: return OUString("miter"); + case basegfx::B2DLineJoin::Round: return OUString("round"); + } +} + +OUString convertLineCapToString(css::drawing::LineCap eCap) +{ + switch (eCap) + { + default: + case css::drawing::LineCap_BUTT: return OUString("butt"); + case css::drawing::LineCap_ROUND: return OUString("round"); + case css::drawing::LineCap_SQUARE: return OUString("square"); + } +} + +OUString convertPolygonFlags(PolyFlags eFlags) +{ + switch (eFlags) + { + default: + case PolyFlags::Normal: return OUString("normal"); + case PolyFlags::Control: return OUString("control"); + case PolyFlags::Smooth: return OUString("smooth"); + case PolyFlags::Symmetric: return OUString("symmetric"); + } +} + +OUString convertFontWeigthToString(FontWeight eFontWeight) +{ + switch (eFontWeight) + { + case WEIGHT_DONTKNOW: return OUString("unknown"); + case WEIGHT_THIN: return OUString("thin"); + case WEIGHT_ULTRALIGHT: return OUString("ultralight"); + case WEIGHT_LIGHT: return OUString("light"); + case WEIGHT_SEMILIGHT: return OUString("semilight"); + case WEIGHT_NORMAL: return OUString("normal"); + case WEIGHT_MEDIUM: return OUString("medium"); + case WEIGHT_SEMIBOLD: return OUString("semibold"); + case WEIGHT_BOLD: return OUString("bold"); + case WEIGHT_ULTRABOLD: return OUString("ultrabold"); + case WEIGHT_BLACK: return OUString("black"); + case FontWeight_FORCE_EQUAL_SIZE: return OUString("equalsize"); + } + return OUString(); +} + +OUString convertFontStrikeoutToString(FontStrikeout eFontStrikeout) +{ + switch (eFontStrikeout) + { + case STRIKEOUT_NONE: return OUString("none"); + case STRIKEOUT_SINGLE: return OUString("single"); + case STRIKEOUT_DOUBLE: return OUString("double"); + case STRIKEOUT_DONTKNOW: return OUString("dontknow"); + case STRIKEOUT_BOLD: return OUString("bold"); + case STRIKEOUT_SLASH: return OUString("slash"); + case STRIKEOUT_X: return OUString("x"); + case FontStrikeout_FORCE_EQUAL_SIZE: return OUString("equalsize"); + } + return OUString(); +} + +OUString convertFontLineStyleToString(FontLineStyle eFontLineStyle) +{ + switch (eFontLineStyle) + { + case LINESTYLE_NONE: return OUString("none"); + case LINESTYLE_SINGLE: return OUString("single"); + case LINESTYLE_DOUBLE: return OUString("double"); + case LINESTYLE_DOTTED: return OUString("dotted"); + case LINESTYLE_DONTKNOW: return OUString("dontknow"); + case LINESTYLE_DASH: return OUString("dash"); + case LINESTYLE_LONGDASH: return OUString("longdash"); + case LINESTYLE_DASHDOT: return OUString("dashdot"); + case LINESTYLE_DASHDOTDOT: return OUString("dashdotdot"); + case LINESTYLE_SMALLWAVE: return OUString("smallwave"); + case LINESTYLE_WAVE: return OUString("wave"); + case LINESTYLE_DOUBLEWAVE: return OUString("doublewave"); + case LINESTYLE_BOLD: return OUString("bold"); + case LINESTYLE_BOLDDOTTED: return OUString("bolddotted"); + case LINESTYLE_BOLDDASH: return OUString("bolddash"); + case LINESTYLE_BOLDLONGDASH: return OUString("boldlongdash"); + case LINESTYLE_BOLDDASHDOT: return OUString("bolddashdot"); + case LINESTYLE_BOLDDASHDOTDOT: return OUString("bolddashdotdot"); + case LINESTYLE_BOLDWAVE: return OUString("boldwave"); + case FontLineStyle_FORCE_EQUAL_SIZE: return OUString("equalsize"); + } + return OUString(); +} + +OString convertLineStyleToString(const MetaActionType nActionType) +{ + switch (nActionType) + { + case MetaActionType::NONE: return "null"; + case MetaActionType::PIXEL: return "pixel"; + case MetaActionType::POINT: return "point"; + case MetaActionType::LINE: return "line"; + case MetaActionType::RECT: return "rect"; + case MetaActionType::ROUNDRECT: return "roundrect"; + case MetaActionType::ELLIPSE: return "ellipse"; + case MetaActionType::ARC: return "arc"; + case MetaActionType::PIE: return "pie"; + case MetaActionType::CHORD: return "chord"; + case MetaActionType::POLYLINE: return "polyline"; + case MetaActionType::POLYGON: return "polygon"; + case MetaActionType::POLYPOLYGON: return "polypolygon"; + case MetaActionType::TEXT: return "text"; + case MetaActionType::TEXTARRAY: return "textarray"; + case MetaActionType::STRETCHTEXT: return "stretchtext"; + case MetaActionType::TEXTRECT: return "textrect"; + case MetaActionType::TEXTLINE: return "textline"; + case MetaActionType::BMP: return "bmp"; + case MetaActionType::BMPSCALE: return "bmpscale"; + case MetaActionType::BMPSCALEPART: return "bmpscalepart"; + case MetaActionType::BMPEX: return "bmpex"; + case MetaActionType::BMPEXSCALE: return "bmpexscale"; + case MetaActionType::BMPEXSCALEPART: return "bmpexscalepart"; + case MetaActionType::MASK: return "mask"; + case MetaActionType::MASKSCALE: return "maskscale"; + case MetaActionType::MASKSCALEPART: return "maskscalepart"; + case MetaActionType::GRADIENT: return "gradient"; + case MetaActionType::GRADIENTEX: return "gradientex"; + case MetaActionType::HATCH: return "hatch"; + case MetaActionType::WALLPAPER: return "wallpaper"; + case MetaActionType::CLIPREGION: return "clipregion"; + case MetaActionType::ISECTRECTCLIPREGION: return "sectrectclipregion"; + case MetaActionType::ISECTREGIONCLIPREGION: return "sectregionclipregion"; + case MetaActionType::MOVECLIPREGION: return "moveclipregion"; + case MetaActionType::LINECOLOR: return "linecolor"; + case MetaActionType::FILLCOLOR: return "fillcolor"; + case MetaActionType::TEXTCOLOR: return "textcolor"; + case MetaActionType::TEXTFILLCOLOR: return "textfillcolor"; + case MetaActionType::TEXTLINECOLOR: return "textlinecolor"; + case MetaActionType::OVERLINECOLOR: return "overlinecolor"; + case MetaActionType::TEXTALIGN: return "textalign"; + case MetaActionType::MAPMODE: return "mapmode"; + case MetaActionType::FONT: return "font"; + case MetaActionType::PUSH: return "push"; + case MetaActionType::POP: return "pop"; + case MetaActionType::RASTEROP: return "rasterop"; + case MetaActionType::Transparent: return "transparent"; + case MetaActionType::FLOATTRANSPARENT: return "floattransparent"; + case MetaActionType::EPS: return "eps"; + case MetaActionType::REFPOINT: return "refpoint"; + case MetaActionType::COMMENT: return "comment"; + case MetaActionType::LAYOUTMODE: return "layoutmode"; + case MetaActionType::TEXTLANGUAGE: return "textlanguage"; + } + return ""; +} + +OUString convertBitmapExTransparentType(TransparentType eType) +{ + switch (eType) + { + default: + case TransparentType::NONE: return OUString("none"); + case TransparentType::Bitmap: return OUString("bitmap"); + case TransparentType::Color: return OUString("color"); + } +} + +OUString convertMapUnitToString(MapUnit eUnit) +{ + switch (eUnit) + { + default: + case MapUnit::LASTENUMDUMMY: return OUString("LASTENUMDUMMY"); + case MapUnit::Map1000thInch: return OUString("Map1000thInch"); + case MapUnit::Map100thInch: return OUString("Map100thInch"); + case MapUnit::Map100thMM: return OUString("Map100thMM"); + case MapUnit::Map10thInch: return OUString("Map10thInch"); + case MapUnit::Map10thMM: return OUString("Map10thMM"); + case MapUnit::MapAppFont: return OUString("MapAppFont"); + case MapUnit::MapCM: return OUString("MapCM"); + case MapUnit::MapInch: return OUString("MapInch"); + case MapUnit::MapMM: return OUString("MapMM"); + case MapUnit::MapPixel: return OUString("MapPixel"); + case MapUnit::MapPoint: return OUString("MapPoint"); + case MapUnit::MapRelative: return OUString("MapRelative"); + case MapUnit::MapSysFont: return OUString("MapSysFont"); + case MapUnit::MapTwip: return OUString("MapTwip"); + } +} + +OUString convertFractionToString(const Fraction& aFraction) +{ + std::stringstream ss; + + ss << aFraction; + + return OUString::createFromAscii(ss.str().c_str()); +} + + +OUString hex32(sal_uInt32 nNumber) +{ + std::stringstream ss; + ss << std::hex << std::setfill ('0') << std::setw(8) << nNumber; + return OUString::createFromAscii(ss.str().c_str()); +} + +void writePoint(tools::XmlWriter& rWriter, Point const& rPoint) +{ + rWriter.attribute("x", rPoint.X()); + rWriter.attribute("y", rPoint.Y()); +} + +void writeStartPoint(tools::XmlWriter& rWriter, Point const& rPoint) +{ + rWriter.attribute("startx", rPoint.X()); + rWriter.attribute("starty", rPoint.Y()); +} + +void writeEndPoint(tools::XmlWriter& rWriter, Point const& rPoint) +{ + rWriter.attribute("endx", rPoint.X()); + rWriter.attribute("endy", rPoint.Y()); +} + +void writeSize(tools::XmlWriter& rWriter, Size const& rSize) +{ + rWriter.attribute("width", rSize.Width()); + rWriter.attribute("height", rSize.Height()); +} + +void writeRectangle(tools::XmlWriter& rWriter, tools::Rectangle const& rRectangle) +{ + rWriter.attribute("left", rRectangle.Left()); + rWriter.attribute("top", rRectangle.Top()); + rWriter.attribute("right", rRectangle.Right()); + rWriter.attribute("bottom", rRectangle.Bottom()); +} + +void writeLineInfo(tools::XmlWriter& rWriter, LineInfo const& rLineInfo) +{ + rWriter.attribute("style", convertLineStyleToString(rLineInfo.GetStyle())); + rWriter.attribute("width", rLineInfo.GetWidth()); + rWriter.attribute("dashlen", rLineInfo.GetDashLen()); + rWriter.attribute("dashcount", rLineInfo.GetDashCount()); + rWriter.attribute("dotlen", rLineInfo.GetDotLen()); + rWriter.attribute("dotcount", rLineInfo.GetDotCount()); + rWriter.attribute("distance", rLineInfo.GetDistance()); + rWriter.attribute("join", convertLineJoinToString(rLineInfo.GetLineJoin())); + rWriter.attribute("cap", convertLineCapToString(rLineInfo.GetLineCap())); +} + +} // anonymous namespace + +MetafileXmlDump::MetafileXmlDump() +{ + maFilter.fill(false); +} + +MetafileXmlDump::~MetafileXmlDump() +{} + +void MetafileXmlDump::filterActionType(const MetaActionType nActionType, bool bShouldFilter) +{ + maFilter[nActionType] = bShouldFilter; +} + +void MetafileXmlDump::filterAllActionTypes() +{ + maFilter.fill(true); +} + +void MetafileXmlDump::dump(const GDIMetaFile& rMetaFile, SvStream& rStream) +{ + tools::XmlWriter aWriter(&rStream); + aWriter.startDocument(); + aWriter.startElement("metafile"); + + writeXml(rMetaFile, aWriter); + + aWriter.endElement(); + aWriter.endDocument(); +} + +void MetafileXmlDump::writeXml(const GDIMetaFile& rMetaFile, tools::XmlWriter& rWriter) +{ + for(size_t nAction = 0; nAction < rMetaFile.GetActionSize(); ++nAction) + { + MetaAction* pAction = rMetaFile.GetAction(nAction); + const MetaActionType nActionType = pAction->GetType(); + if (maFilter[nActionType]) + continue; + + OString sCurrentElementTag = convertLineStyleToString(nActionType); + + switch (nActionType) + { + case MetaActionType::PIXEL: + { + auto* pMetaAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writePoint(rWriter, pMetaAction->GetPoint()); + rWriter.attribute("color", convertColorToString(pMetaAction->GetColor())); + rWriter.endElement(); + } + break; + + case MetaActionType::POINT: + { + auto* pMetaAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writePoint(rWriter, pMetaAction->GetPoint()); + rWriter.endElement(); + } + break; + + case MetaActionType::RECT: + { + MetaRectAction* pMetaAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writeRectangle(rWriter, pMetaAction->GetRect()); + rWriter.endElement(); + } + break; + + case MetaActionType::ROUNDRECT: + { + auto pMetaAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writeRectangle(rWriter, pMetaAction->GetRect()); + rWriter.attribute("horizontalround", pMetaAction->GetHorzRound()); + rWriter.attribute("verticalround", pMetaAction->GetVertRound()); + rWriter.endElement(); + } + break; + + case MetaActionType::ELLIPSE: + { + auto pMetaAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writeRectangle(rWriter, pMetaAction->GetRect()); + rWriter.endElement(); + } + break; + + case MetaActionType::ARC: + { + auto pMetaAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writeRectangle(rWriter, pMetaAction->GetRect()); + writeStartPoint(rWriter, pMetaAction->GetStartPoint()); + writeEndPoint(rWriter, pMetaAction->GetEndPoint()); + rWriter.endElement(); + } + break; + + case MetaActionType::PIE: + { + auto pMetaAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writeRectangle(rWriter, pMetaAction->GetRect()); + writeStartPoint(rWriter, pMetaAction->GetStartPoint()); + writeEndPoint(rWriter, pMetaAction->GetEndPoint()); + rWriter.endElement(); + } + break; + + case MetaActionType::CHORD: + { + auto pMetaAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writeRectangle(rWriter, pMetaAction->GetRect()); + writeStartPoint(rWriter, pMetaAction->GetStartPoint()); + writeEndPoint(rWriter, pMetaAction->GetEndPoint()); + rWriter.endElement(); + } + break; + + case MetaActionType::LINE: + { + MetaLineAction* pMetaLineAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writeStartPoint(rWriter, pMetaLineAction->GetStartPoint()); + writeEndPoint(rWriter, pMetaLineAction->GetEndPoint()); + + writeLineInfo(rWriter, pMetaLineAction->GetLineInfo()); + rWriter.endElement(); + } + break; + + case MetaActionType::PUSH: + { + MetaPushAction* pMetaPushAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + rWriter.attribute("flags", collectPushFlags(pMetaPushAction->GetFlags())); + } + break; + + case MetaActionType::POP: + { + rWriter.endElement(); + } + break; + + case MetaActionType::RASTEROP: + { + MetaRasterOpAction* pMetaRasterOpAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + if (pMetaRasterOpAction->GetRasterOp() != RasterOp::OverPaint) + { + rWriter.attribute("operation", convertRopToString(pMetaRasterOpAction->GetRasterOp())); + } + rWriter.endElement(); + } + break; + + case MetaActionType::TEXTLINECOLOR: + { + MetaTextLineColorAction* pMetaTextLineColorAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + rWriter.attribute("color", convertColorToString(pMetaTextLineColorAction->GetColor())); + rWriter.endElement(); + } + break; + + case MetaActionType::TEXTFILLCOLOR: + { + MetaTextFillColorAction* pMetaTextFillColorAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + rWriter.attribute("color", convertColorToString(pMetaTextFillColorAction->GetColor())); + + if (pMetaTextFillColorAction->IsSetting()) + rWriter.attribute("setting", OUString("true")); + + rWriter.endElement(); + } + break; + + case MetaActionType::FONT: + { + MetaFontAction* pMetaFontAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + vcl::Font aFont = pMetaFontAction->GetFont(); + + rWriter.attribute("color", convertColorToString(aFont.GetColor())); + rWriter.attribute("fillcolor", convertColorToString(aFont.GetFillColor())); + rWriter.attribute("name", aFont.GetFamilyName()); + rWriter.attribute("stylename", aFont.GetStyleName()); + rWriter.attribute("width", aFont.GetFontSize().Width()); + rWriter.attribute("height", aFont.GetFontSize().Height()); + rWriter.attribute("orientation", aFont.GetOrientation()); + rWriter.attribute("weight", convertFontWeigthToString(aFont.GetWeight())); + + rWriter.endElement(); + } + break; + + case MetaActionType::TEXTALIGN: + { + MetaTextAlignAction* pMetaTextAlignAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + OUString sAlign = convertTextAlignToString(pMetaTextAlignAction->GetTextAlign()); + if (!sAlign.isEmpty()) + rWriter.attribute("align", sAlign); + rWriter.endElement(); + } + break; + + case MetaActionType::TEXTCOLOR: + { + MetaTextColorAction* pMetaTextColorAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + rWriter.attribute("color", convertColorToString(pMetaTextColorAction->GetColor())); + rWriter.endElement(); + } + break; + + case MetaActionType::TEXT: + { + auto* pMeta = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writePoint(rWriter, pMeta->GetPoint()); + rWriter.attribute("index", pMeta->GetIndex()); + rWriter.attribute("length", pMeta->GetLen()); + rWriter.startElement("textcontent"); + rWriter.content(pMeta->GetText()); + rWriter.endElement(); + + rWriter.endElement(); + } + break; + + case MetaActionType::TEXTARRAY: + { + MetaTextArrayAction* pMetaTextArrayAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + sal_Int32 aIndex = pMetaTextArrayAction->GetIndex(); + sal_Int32 aLength = pMetaTextArrayAction->GetLen(); + + writePoint(rWriter, pMetaTextArrayAction->GetPoint()); + rWriter.attribute("index", aIndex); + rWriter.attribute("length", aLength); + + if (pMetaTextArrayAction->GetDXArray()) + { + rWriter.startElement("dxarray"); + OUStringBuffer sDxLengthString; + for (sal_Int32 i = 0; i < aLength - aIndex; ++i) + { + sDxLengthString.append(OUString::number(pMetaTextArrayAction->GetDXArray()[aIndex + i])); + sDxLengthString.append(" "); + } + rWriter.content(sDxLengthString.makeStringAndClear()); + rWriter.endElement(); + } + + rWriter.startElement("text"); + rWriter.content(pMetaTextArrayAction->GetText()); + rWriter.endElement(); + + rWriter.endElement(); + } + break; + + case MetaActionType::STRETCHTEXT: + { + auto* pMeta = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + writePoint(rWriter, pMeta->GetPoint()); + rWriter.attribute("index", pMeta->GetIndex()); + rWriter.attribute("length", pMeta->GetLen()); + rWriter.attribute("width", pMeta->GetWidth()); + + rWriter.startElement("textcontent"); + rWriter.content(pMeta->GetText()); + rWriter.endElement(); + + rWriter.endElement(); + } + break; + + case MetaActionType::TEXTRECT: + { + auto* pMeta = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writeRectangle(rWriter, pMeta->GetRect()); + rWriter.startElement("textcontent"); + rWriter.content(pMeta->GetText()); + rWriter.endElement(); + + rWriter.startElement("style"); + rWriter.content(convertDrawTextFlagsToString(pMeta->GetStyle())); + rWriter.endElement(); + + rWriter.endElement(); + } + break; + + case MetaActionType::TEXTLINE: + { + auto* pMeta = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writePoint(rWriter, pMeta->GetStartPoint()); + rWriter.attribute("width", pMeta->GetWidth()); + rWriter.attribute("strikeout", convertFontStrikeoutToString(pMeta->GetStrikeout())); + rWriter.attribute("underline", convertFontLineStyleToString(pMeta->GetUnderline())); + rWriter.attribute("overline", convertFontLineStyleToString(pMeta->GetOverline())); + rWriter.endElement(); + } + break; + + case MetaActionType::LINECOLOR: + { + MetaLineColorAction* pMetaLineColorAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + rWriter.attribute("color", convertColorToString(pMetaLineColorAction->GetColor())); + rWriter.endElement(); + } + break; + + case MetaActionType::FILLCOLOR: + { + MetaFillColorAction* pMetaFillColorAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + rWriter.attribute("color", convertColorToString(pMetaFillColorAction->GetColor())); + rWriter.endElement(); + } + break; + + case MetaActionType::CLIPREGION: + { + const MetaClipRegionAction* pA = static_cast< const MetaClipRegionAction* >(pAction); + rWriter.startElement(sCurrentElementTag); + + // FIXME for now we dump only the bounding box; this is + // enough for the tests we have, but may need extending to + // dumping the real polypolygon in the future + tools::Rectangle aRectangle = pA->GetRegion().GetBoundRect(); + writeRectangle(rWriter, aRectangle); + rWriter.endElement(); + } + break; + + case MetaActionType::ISECTRECTCLIPREGION: + { + MetaISectRectClipRegionAction* pMetaISectRectClipRegionAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + tools::Rectangle aRectangle = pMetaISectRectClipRegionAction->GetRect(); + writeRectangle(rWriter, aRectangle); + rWriter.endElement(); + } + break; + + case MetaActionType::ISECTREGIONCLIPREGION: + { + MetaISectRegionClipRegionAction* pMetaISectRegionClipRegionAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + // FIXME for now we dump only the bounding box; this is + // enough for the tests we have, but may need extending to + // dumping the real polypolygon in the future + tools::Rectangle aRectangle = pMetaISectRegionClipRegionAction->GetRegion().GetBoundRect(); + writeRectangle(rWriter, aRectangle); + rWriter.endElement(); + } + break; + + case MetaActionType::POLYLINE: + { + MetaPolyLineAction* pMetaPolyLineAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + writeLineInfo(rWriter, pMetaPolyLineAction->GetLineInfo()); + + tools::Polygon aPolygon = pMetaPolyLineAction->GetPolygon(); + bool bFlags = aPolygon.HasFlags(); + for (sal_uInt16 i = 0; i < aPolygon.GetSize(); i++) + { + rWriter.startElement("point"); + writePoint(rWriter, aPolygon[i]); + if (bFlags) + rWriter.attribute("flags", convertPolygonFlags(aPolygon.GetFlags(i))); + rWriter.endElement(); + } + + rWriter.endElement(); + } + break; + + case MetaActionType::POLYGON: + { + MetaPolygonAction* pMetaPolygonAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + tools::Polygon aPolygon = pMetaPolygonAction->GetPolygon(); + bool bFlags = aPolygon.HasFlags(); + for (sal_uInt16 i = 0; i < aPolygon.GetSize(); i++) + { + rWriter.startElement("point"); + writePoint(rWriter, aPolygon[i]); + if (bFlags) + rWriter.attribute("flags", convertPolygonFlags(aPolygon.GetFlags(i))); + rWriter.endElement(); + } + + rWriter.endElement(); + } + break; + + case MetaActionType::POLYPOLYGON: + { + MetaPolyPolygonAction *const pMetaPolyPolygonAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + tools::PolyPolygon const& rPolyPolygon(pMetaPolyPolygonAction->GetPolyPolygon()); + + for (sal_uInt16 j = 0; j < rPolyPolygon.Count(); ++j) + { + rWriter.startElement("polygon"); + tools::Polygon const& rPolygon = rPolyPolygon[j]; + bool bFlags = rPolygon.HasFlags(); + for (sal_uInt16 i = 0; i < rPolygon.GetSize(); ++i) + { + rWriter.startElement("point"); + writePoint(rWriter, rPolygon[i]); + if (bFlags) + rWriter.attribute("flags", convertPolygonFlags(rPolygon.GetFlags(i))); + rWriter.endElement(); + } + rWriter.endElement(); + } + + rWriter.endElement(); + } + break; + + case MetaActionType::COMMENT: + { + MetaCommentAction* pMetaCommentAction = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + + if (pMetaCommentAction->GetDataSize() > 0) + { + rWriter.attribute("datasize", pMetaCommentAction->GetDataSize()); + } + if (!pMetaCommentAction->GetComment().isEmpty()) + { + rWriter.startElement("comment"); + rWriter.content(pMetaCommentAction->GetComment()); + rWriter.endElement(); + } + + rWriter.endElement(); + } + break; + + case MetaActionType::BMP: + { + auto pMeta = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writePoint(rWriter, pMeta->GetPoint()); + rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum())); + rWriter.endElement(); + } + break; + + case MetaActionType::BMPSCALE: + { + auto pMeta = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writePoint(rWriter, pMeta->GetPoint()); + writeSize(rWriter, pMeta->GetSize()); + rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum())); + rWriter.endElement(); + } + break; + + case MetaActionType::BMPSCALEPART: + { + auto pMeta = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + rWriter.attribute("destx", pMeta->GetDestPoint().X()); + rWriter.attribute("desty", pMeta->GetDestPoint().Y()); + rWriter.attribute("destwidth", pMeta->GetDestSize().Width()); + rWriter.attribute("destheight", pMeta->GetDestSize().Height()); + rWriter.attribute("srcx", pMeta->GetSrcPoint().X()); + rWriter.attribute("srcy", pMeta->GetSrcPoint().Y()); + rWriter.attribute("srcwidth", pMeta->GetSrcSize().Width()); + rWriter.attribute("srcheight", pMeta->GetSrcSize().Height()); + rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum())); + rWriter.endElement(); + } + break; + + case MetaActionType::BMPEX: + { + auto pMeta = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writePoint(rWriter, pMeta->GetPoint()); + rWriter.attribute("crc", hex32(pMeta->GetBitmapEx().GetBitmap().GetChecksum())); + rWriter.attribute("transparenttype", convertBitmapExTransparentType(pMeta->GetBitmapEx().GetTransparentType())); + rWriter.endElement(); + } + break; + + case MetaActionType::BMPEXSCALE: + { + auto pMeta = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writePoint(rWriter, pMeta->GetPoint()); + writeSize(rWriter, pMeta->GetSize()); + rWriter.attribute("crc", hex32(pMeta->GetBitmapEx().GetBitmap().GetChecksum())); + rWriter.attribute("transparenttype", convertBitmapExTransparentType(pMeta->GetBitmapEx().GetTransparentType())); + rWriter.endElement(); + } + break; + + case MetaActionType::BMPEXSCALEPART: + { + auto pMeta = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + rWriter.attribute("destx", pMeta->GetDestPoint().X()); + rWriter.attribute("desty", pMeta->GetDestPoint().Y()); + rWriter.attribute("destwidth", pMeta->GetDestSize().Width()); + rWriter.attribute("destheight", pMeta->GetDestSize().Height()); + rWriter.attribute("srcx", pMeta->GetSrcPoint().X()); + rWriter.attribute("srcy", pMeta->GetSrcPoint().Y()); + rWriter.attribute("srcwidth", pMeta->GetSrcSize().Width()); + rWriter.attribute("srcheight", pMeta->GetSrcSize().Height()); + rWriter.attribute("crc", hex32(pMeta->GetBitmapEx().GetBitmap().GetChecksum())); + rWriter.attribute("transparenttype", convertBitmapExTransparentType(pMeta->GetBitmapEx().GetTransparentType())); + rWriter.endElement(); + } + break; + + case MetaActionType::MASK: + { + auto pMeta = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writePoint(rWriter, pMeta->GetPoint()); + rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum())); + rWriter.attribute("color", convertColorToString(pMeta->GetColor())); + rWriter.endElement(); + } + break; + + case MetaActionType::MASKSCALE: + { + auto pMeta = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + writePoint(rWriter, pMeta->GetPoint()); + writeSize(rWriter, pMeta->GetSize()); + rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum())); + rWriter.attribute("color", convertColorToString(pMeta->GetColor())); + rWriter.endElement(); + } + break; + + case MetaActionType::MASKSCALEPART: + { + auto pMeta = static_cast(pAction); + rWriter.startElement(sCurrentElementTag); + rWriter.attribute("destx", pMeta->GetDestPoint().X()); + rWriter.attribute("desty", pMeta->GetDestPoint().Y()); + rWriter.attribute("destwidth", pMeta->GetDestSize().Width()); + rWriter.attribute("destheight", pMeta->GetDestSize().Height()); + rWriter.attribute("srcx", pMeta->GetSrcPoint().X()); + rWriter.attribute("srcy", pMeta->GetSrcPoint().Y()); + rWriter.attribute("srcwidth", pMeta->GetSrcSize().Width()); + rWriter.attribute("srcheight", pMeta->GetSrcSize().Height()); + rWriter.attribute("crc", hex32(pMeta->GetBitmap().GetChecksum())); + rWriter.attribute("color", convertColorToString(pMeta->GetColor())); + rWriter.endElement(); + } + break; + + case MetaActionType::MAPMODE: + { + const MetaMapModeAction* pMeta = static_cast(pAction); + MapMode aMapMode = pMeta->GetMapMode(); + rWriter.startElement(sCurrentElementTag); + rWriter.attribute("mapunit", convertMapUnitToString( aMapMode.GetMapUnit() )); + writePoint(rWriter, aMapMode.GetOrigin()); + rWriter.attribute("scalex", convertFractionToString(aMapMode.GetScaleX())); + rWriter.attribute("scaley", convertFractionToString(aMapMode.GetScaleY())); + rWriter.endElement(); + } + break; + + default: + { + rWriter.element(sCurrentElementTag); + } + break; + } + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit