summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2020-11-25 18:01:08 +0100
committerMiklos Vajna <vmiklos@collabora.com>2020-11-27 13:07:40 +0100
commit66db3307b75ce21767328a00371a8683207ddc99 (patch)
treebfe6bbbc90d4d051976c14114d0a93e69761dd65
parentd121a9959adb9bc2e3781ae24b3f36763cd6f0c8 (diff)
WMF export: just write the source data as is for from-WMF graphics
This was already working on master since commit 5868745db74ae930edb0058490076d82aaeafbe9 (emfplus: make VectorFormats Emf/Wmf/Svg work, 2017-06-12), but a matching testcase was missing. [ And on this branch, fix the actual problem by picking the small relevant subset of the above commit. ] (cherry picked from commit 6bb0e09e2423ae00e06e6b7ae2c5a0af6ca100a1) Conflicts: vcl/qa/cppunit/GraphicTest.cxx Change-Id: I7661cd5e66d13b1750f16c0c423c4b69420577a0
-rw-r--r--vcl/CppunitTest_vcl_graphic_test.mk48
-rw-r--r--vcl/Module_vcl.mk1
-rw-r--r--vcl/qa/cppunit/GraphicTest.cxx90
-rw-r--r--vcl/qa/cppunit/data/roundtrip.wmfbin0 -> 6475 bytes
-rw-r--r--vcl/source/filter/graphicfilter.cxx31
5 files changed, 165 insertions, 5 deletions
diff --git a/vcl/CppunitTest_vcl_graphic_test.mk b/vcl/CppunitTest_vcl_graphic_test.mk
new file mode 100644
index 000000000000..98eaae8800e7
--- /dev/null
+++ b/vcl/CppunitTest_vcl_graphic_test.mk
@@ -0,0 +1,48 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# 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/.
+#
+
+$(eval $(call gb_CppunitTest_CppunitTest,vcl_graphic_test))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,vcl_graphic_test, \
+ vcl/qa/cppunit/GraphicTest \
+))
+
+$(eval $(call gb_CppunitTest_use_externals,vcl_graphic_test,\
+ boost_headers \
+ glm_headers \
+))
+
+$(eval $(call gb_CppunitTest_set_include,vcl_graphic_test,\
+ $$(INCLUDE) \
+ -I$(SRCDIR)/vcl/inc \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,vcl_graphic_test, \
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ svt \
+ test \
+ tl \
+ unotest \
+ vcl \
+ utl \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,vcl_graphic_test))
+$(eval $(call gb_CppunitTest_use_ure,vcl_graphic_test))
+$(eval $(call gb_CppunitTest_use_vcl,vcl_graphic_test))
+$(eval $(call gb_CppunitTest_use_rdb,vcl_graphic_test,services))
+$(eval $(call gb_CppunitTest_use_configuration,vcl_graphic_test))
+
+# we need to explicitly depend on Library_gie because it's dynamically loaded for .gif
+$(call gb_CppunitTest_get_target,vcl_graphic_test) : $(call gb_Library_get_target,gie)
+
+# vim: set noet sw=4 ts=4:
diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk
index a5e4bf5d68d2..b74bc2e67208 100644
--- a/vcl/Module_vcl.mk
+++ b/vcl/Module_vcl.mk
@@ -154,6 +154,7 @@ $(eval $(call gb_Module_add_check_targets,vcl,\
CppunitTest_vcl_svm_test \
CppunitTest_vcl_pdfexport \
CppunitTest_vcl_errorhandler \
+ CppunitTest_vcl_graphic_test \
))
diff --git a/vcl/qa/cppunit/GraphicTest.cxx b/vcl/qa/cppunit/GraphicTest.cxx
new file mode 100644
index 000000000000..d71a85ebf07b
--- /dev/null
+++ b/vcl/qa/cppunit/GraphicTest.cxx
@@ -0,0 +1,90 @@
+/* -*- 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 <sal/config.h>
+#include <config_oox.h>
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <com/sun/star/beans/PropertyValue.hpp>
+
+#include <vcl/bitmapaccess.hxx>
+#include <vcl/graph.hxx>
+#include <vcl/graphicfilter.hxx>
+#include <tools/stream.hxx>
+#include <unotest/directories.hxx>
+#include <comphelper/hash.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#include <unotools/tempfile.hxx>
+
+using namespace css;
+
+namespace
+{
+class GraphicTest : public CppUnit::TestFixture
+{
+public:
+ ~GraphicTest();
+
+private:
+ void testWMFRoundtrip();
+
+ CPPUNIT_TEST_SUITE(GraphicTest);
+ CPPUNIT_TEST(testWMFRoundtrip);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+GraphicTest::~GraphicTest()
+{
+}
+
+void GraphicTest::testWMFRoundtrip()
+{
+ // Load a WMF file.
+ test::Directories aDirectories;
+ OUString aURL = aDirectories.getURLFromSrc("vcl/qa/cppunit/data/roundtrip.wmf");
+ SvFileStream aStream(aURL, StreamMode::READ);
+ sal_uInt64 nPos = aStream.Tell();
+ aStream.Seek(STREAM_SEEK_TO_END);
+ sal_uInt64 nExpectedSize = aStream.Tell();
+ aStream.Seek(nPos);
+ GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter();
+ Graphic aGraphic;
+ rGraphicFilter.ImportGraphic(aGraphic, OUString(), aStream);
+
+ // Save as WMF.
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ sal_uInt16 nFormat = rGraphicFilter.GetExportFormatNumberForShortName(u"WMF");
+ SvStream& rOutStream = *aTempFile.GetStream(StreamMode::READWRITE);
+ rGraphicFilter.ExportGraphic(aGraphic, OUString(), rOutStream, nFormat);
+
+ // Check if we preserved the WMF data perfectly.
+ nPos = rOutStream.Tell();
+ rOutStream.Seek(STREAM_SEEK_TO_END);
+ sal_uInt64 nActualSize = rOutStream.Tell();
+ rOutStream.Seek(nPos);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected less or equal than: 10
+ // - Actual : 3637
+ // i.e. we lost most of the WMF data on roundtrip. Still allow loosing some padding bytes at the
+ // very end, that's harmless.
+ CPPUNIT_ASSERT_LESSEQUAL(static_cast<sal_uInt64>(10), nExpectedSize - nActualSize);
+}
+
+} // namespace
+
+CPPUNIT_TEST_SUITE_REGISTRATION(GraphicTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qa/cppunit/data/roundtrip.wmf b/vcl/qa/cppunit/data/roundtrip.wmf
new file mode 100644
index 000000000000..83210546c373
--- /dev/null
+++ b/vcl/qa/cppunit/data/roundtrip.wmf
Binary files differ
diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx
index 1638ae023eb9..5b0e24c2ce86 100644
--- a/vcl/source/filter/graphicfilter.cxx
+++ b/vcl/source/filter/graphicfilter.cxx
@@ -1939,12 +1939,33 @@ sal_uInt16 GraphicFilter::ExportGraphic( const Graphic& rGraphic, const OUString
}
else if ( aFilterName.equalsIgnoreAsciiCase( EXP_WMF ) )
{
- // #i119735# just use GetGDIMetaFile, it will create a bufferd version of contained bitmap now automatically
- if ( !ConvertGDIMetaFileToWMF( aGraphic.GetGDIMetaFile(), rOStm, &aConfigItem ) )
- nStatus = GRFILTER_FORMATERROR;
+ bool bDone = false;
- if( rOStm.GetError() )
- nStatus = GRFILTER_IOERROR;
+ const GfxLink& rLink = aGraphic.GetLink();
+ if (rLink.GetDataSize() && rLink.GetType() == GfxLinkType::NativeWmf)
+ {
+ // The source is already in WMF, no need to convert anything.
+ rOStm.WriteBytes(rLink.GetData(), rLink.GetDataSize());
+
+ if (rOStm.GetError())
+ {
+ nStatus = GRFILTER_IOERROR;
+ }
+ else
+ {
+ bDone = true;
+ }
+ }
+
+ if (!bDone)
+ {
+ // #i119735# just use GetGDIMetaFile, it will create a bufferd version of contained bitmap now automatically
+ if ( !ConvertGDIMetaFileToWMF( aGraphic.GetGDIMetaFile(), rOStm, &aConfigItem ) )
+ nStatus = GRFILTER_FORMATERROR;
+
+ if( rOStm.GetError() )
+ nStatus = GRFILTER_IOERROR;
+ }
}
else if ( aFilterName.equalsIgnoreAsciiCase( EXP_EMF ) )
{