svx/qa/unit/unodraw.cxx | 36 ++++++++++++++++++++++++++++++ svx/source/unodraw/UnoGraphicExporter.cxx | 36 +++++++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 1 deletion(-)
New commits: commit 00b0ff0687081bd6e88d3c3b0a1352c291fa6bb8 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Thu Feb 10 20:08:11 2022 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Fri Feb 11 08:25:11 2022 +0100 PNG export: allow setting filter data keys from the cmdline For example, to set a custom pixel size: soffice --convert-to 'png:draw_png_Export:{"PixelHeight":{"type":"long","value":"192"},"PixelWidth":{"type":"long","value":"192"}}' test.odg Change-Id: I628717ba36b6ad1ac03911eec06855c1745ef258 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129801 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/svx/qa/unit/unodraw.cxx b/svx/qa/unit/unodraw.cxx index 7e69ba8d4f05..5d2814e2c21a 100644 --- a/svx/qa/unit/unodraw.cxx +++ b/svx/qa/unit/unodraw.cxx @@ -19,6 +19,7 @@ #include <com/sun/star/table/XCellRange.hpp> #include <com/sun/star/text/XTextRange.hpp> #include <com/sun/star/text/ControlCharacter.hpp> +#include <com/sun/star/frame/XStorable.hpp> #include <comphelper/processfactory.hxx> #include <comphelper/propertysequence.hxx> @@ -32,6 +33,9 @@ #include <svx/sdr/contact/viewcontact.hxx> #include <svx/sdr/contact/viewobjectcontact.hxx> #include <test/xmltesttools.hxx> +#include <unotools/streamwrap.hxx> +#include <unotools/mediadescriptor.hxx> +#include <vcl/filter/PngImageReader.hxx> #include <sdr/contact/objectcontactofobjlistpainter.hxx> @@ -208,6 +212,38 @@ CPPUNIT_TEST_FIXTURE(UnodrawTest, testTitleShapeBullets) // were merged together (e.g. 1 bullet instead of 2 bullets for bulleted paragraphs). CPPUNIT_ASSERT(xTextE->hasMoreElements()); } + +CPPUNIT_TEST_FIXTURE(UnodrawTest, testPngExport) +{ + // Given an empty Impress document: + mxComponent = loadFromDesktop("private:factory/simpress", + "com.sun.star.presentation.PresentationDocument"); + + // When exporting that document to PNG with a JSON size: + uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY_THROW); + SvMemoryStream aStream; + uno::Reference<io::XOutputStream> xOut = new utl::OOutputStreamWrapper(aStream); + utl::MediaDescriptor aMediaDescriptor; + aMediaDescriptor["FilterName"] <<= OUString("impress_png_Export"); + aMediaDescriptor["FilterOptions"] + <<= OUString("{\"PixelHeight\":{\"type\":\"long\",\"value\":\"192\"}," + "\"PixelWidth\":{\"type\":\"long\",\"value\":\"192\"}}"); + aMediaDescriptor["OutputStream"] <<= xOut; + xStorable->storeToURL("private:stream", aMediaDescriptor.getAsConstPropertyValueList()); + + // Then make sure that the size request is handled: + aStream.Seek(STREAM_SEEK_TO_BEGIN); + vcl::PngImageReader aPngReader(aStream); + BitmapEx aBitmapEx; + aPngReader.read(aBitmapEx); + Size aSize = aBitmapEx.GetSizePixel(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 192 + // - Actual : 595 + // i.e. it was not possible to influence the size from the cmdline. + CPPUNIT_ASSERT_EQUAL(static_cast<tools::Long>(192), aSize.getHeight()); + CPPUNIT_ASSERT_EQUAL(static_cast<tools::Long>(192), aSize.getWidth()); +} } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/source/unodraw/UnoGraphicExporter.cxx b/svx/source/unodraw/UnoGraphicExporter.cxx index 7626579502e7..832699357257 100644 --- a/svx/source/unodraw/UnoGraphicExporter.cxx +++ b/svx/source/unodraw/UnoGraphicExporter.cxx @@ -64,6 +64,9 @@ #include <svx/xlineit0.hxx> #include <editeng/flditem.hxx> #include <svtools/optionsdrawinglayer.hxx> +#include <comphelper/sequenceashashmap.hxx> +#include <comphelper/propertysequence.hxx> +#include <comphelper/sequence.hxx> #include "UnoGraphicExporter.hxx" #include <memory> @@ -402,8 +405,39 @@ VclPtr<VirtualDevice> GraphicExporter::CreatePageVDev( SdrPage* pPage, tools::Lo return pVDev; } -void GraphicExporter::ParseSettings( const Sequence< PropertyValue >& aDescriptor, ExportSettings& rSettings ) +void GraphicExporter::ParseSettings(const Sequence<PropertyValue>& rDescriptor, + ExportSettings& rSettings) { + Sequence<PropertyValue> aDescriptor = rDescriptor; + if (aDescriptor.hasElements()) + { + comphelper::SequenceAsHashMap aMap(aDescriptor); + Sequence<PropertyValue> aFilterData; + OUString aFilterOptions; + auto it = aMap.find("FilterData"); + if (it != aMap.end()) + { + it->second >>= aFilterData; + } + it = aMap.find("FilterOptions"); + if (it != aMap.end()) + { + it->second >>= aFilterOptions; + } + if (!aFilterData.hasElements() && !aFilterOptions.isEmpty()) + { + // Allow setting filter data keys from the cmdline. + std::vector<PropertyValue> aData + = comphelper::JsonToPropertyValues(aFilterOptions.toUtf8()); + aFilterData = comphelper::containerToSequence(aData); + if (aFilterData.hasElements()) + { + aMap["FilterData"] <<= aFilterData; + aDescriptor = aMap.getAsConstPropertyValueList(); + } + } + } + for( const PropertyValue& rValue : aDescriptor ) { if ( rValue.Name == "FilterName" )