vcl/qa/cppunit/GraphicTest.cxx | 36 ++++++++++++++++++++++++++++++++++++ vcl/qa/cppunit/data/to-wmf.emf |binary vcl/source/filter/graphicfilter.cxx | 6 +++++- vcl/source/filter/wmf/enhwmf.cxx | 5 ++++- 4 files changed, 45 insertions(+), 2 deletions(-)
New commits: commit f38c84f1dd1f78763bc72496ff251216bc1209a0 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Tue Dec 8 15:15:47 2020 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Wed Dec 9 11:15:31 2020 +0100 emfio: allow disabling EMF+ via a bootstrap variable Bootstrap variables have multiple sources, so the environment variable way continues to work. This also allows disabling EMF+ using the -env:EMF_PLUS_DISABLE=1 cmdline parameter, which is useful when soffice is not started in a shell. (cherry picked from commit 71a1ea29b8793a8db012dd3452ef0dd87f1be36a) Conflicts: emfio/source/reader/emfreader.cxx Change-Id: I76e82b77d70910ba4843db6ab998b0b1ea4a31f5 diff --git a/vcl/source/filter/wmf/enhwmf.cxx b/vcl/source/filter/wmf/enhwmf.cxx index 0a22ab3762fd..b10c61a14766 100644 --- a/vcl/source/filter/wmf/enhwmf.cxx +++ b/vcl/source/filter/wmf/enhwmf.cxx @@ -21,6 +21,7 @@ #include <basegfx/matrix/b2dhommatrix.hxx> #include <vcl/dibtools.hxx> #include <o3tl/make_unique.hxx> +#include <rtl/bootstrap.hxx> #include "winmtf.hxx" @@ -648,7 +649,9 @@ bool EnhWMFReader::ReadEnhWMF() bool bStatus = ReadHeader(); bool bHaveDC = false; - static bool bEnableEMFPlus = ( getenv( "EMF_PLUS_DISABLE" ) == nullptr ); + OUString aEMFPlusDisable; + rtl::Bootstrap::get("EMF_PLUS_DISABLE", aEMFPlusDisable); + bool bEnableEMFPlus = aEMFPlusDisable.isEmpty(); while( bStatus && nRecordCount-- && pWMF->good()) { commit 61809810c13778607f4cd3eaff6e490c3c6dd50d Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Mon Dec 7 17:10:56 2020 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Wed Dec 9 10:19:38 2020 +0100 vcl graphic export: convert EMF to WMF when WMF is requested Regression from commit 5868745db74ae930edb0058490076d82aaeafbe9 (emfplus: make VectorFormats Emf/Wmf/Svg work, 2017-06-12), we used to export graphic data as-is when the requested format is WMF and the source format is EMF or WMF. Restrict the as-is copying to the WMF source format only. (cherry picked from commit 24deea41f820399593210c8806edd68940f77c20) Conflicts: vcl/qa/cppunit/GraphicTest.cxx vcl/source/filter/graphicfilter.cxx Change-Id: Iad40aee79df5ae367ae37c2fb3d5f4dfad8a40fc diff --git a/vcl/qa/cppunit/GraphicTest.cxx b/vcl/qa/cppunit/GraphicTest.cxx index d71a85ebf07b..5012ae723bb5 100644 --- a/vcl/qa/cppunit/GraphicTest.cxx +++ b/vcl/qa/cppunit/GraphicTest.cxx @@ -24,6 +24,7 @@ #include <comphelper/hash.hxx> #include <unotools/ucbstreamhelper.hxx> #include <unotools/tempfile.hxx> +#include <vcl/cvtgrf.hxx> using namespace css; @@ -36,9 +37,11 @@ public: private: void testWMFRoundtrip(); + void testEmfToWmfConversion(); CPPUNIT_TEST_SUITE(GraphicTest); CPPUNIT_TEST(testWMFRoundtrip); + CPPUNIT_TEST(testEmfToWmfConversion); CPPUNIT_TEST_SUITE_END(); }; @@ -46,6 +49,8 @@ GraphicTest::~GraphicTest() { } +char const DATA_DIRECTORY[] = "/vcl/qa/cppunit/data/"; + void GraphicTest::testWMFRoundtrip() { // Load a WMF file. @@ -81,6 +86,37 @@ void GraphicTest::testWMFRoundtrip() CPPUNIT_ASSERT_LESSEQUAL(static_cast<sal_uInt64>(10), nExpectedSize - nActualSize); } +void GraphicTest::testEmfToWmfConversion() +{ + // Load EMF data. + GraphicFilter aGraphicFilter; + test::Directories aDirectories; + OUString aURL = aDirectories.getURLFromSrc(DATA_DIRECTORY) + "to-wmf.emf"; + SvFileStream aStream(aURL, StreamMode::READ); + Graphic aGraphic; + // This similar to an application/x-openoffice-wmf mime type in manifest.xml in the ODF case. + sal_uInt16 nFormat = aGraphicFilter.GetImportFormatNumberForShortName(u"WMF"); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(ERRCODE_NONE), + aGraphicFilter.ImportGraphic(aGraphic, OUString(), aStream, nFormat)); + + // Save as WMF. + sal_uInt16 nFilterType = aGraphicFilter.GetExportFormatNumberForShortName(u"WMF"); + SvMemoryStream aGraphicStream; + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(ERRCODE_NONE), + aGraphicFilter.ExportGraphic(aGraphic, OUString(), + aGraphicStream, + nFilterType)); + aGraphicStream.Seek(0); + sal_uInt32 nHeader = 0; + aGraphicStream.ReadUInt32(nHeader); + // 0xd7cdc69a in the spec. + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0x9ac6cdd7 + // - Actual : 1 + // i.e. EMF data was requested to be converted to WMF, but the output was still EMF. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(0x9ac6cdd7), nHeader); +} + } // namespace CPPUNIT_TEST_SUITE_REGISTRATION(GraphicTest); diff --git a/vcl/qa/cppunit/data/to-wmf.emf b/vcl/qa/cppunit/data/to-wmf.emf new file mode 100644 index 000000000000..e1a7b9f9e517 Binary files /dev/null and b/vcl/qa/cppunit/data/to-wmf.emf differ diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx index 5b0e24c2ce86..cc287b0b896c 100644 --- a/vcl/source/filter/graphicfilter.cxx +++ b/vcl/source/filter/graphicfilter.cxx @@ -1942,7 +1942,11 @@ sal_uInt16 GraphicFilter::ExportGraphic( const Graphic& rGraphic, const OUString bool bDone = false; const GfxLink& rLink = aGraphic.GetLink(); - if (rLink.GetDataSize() && rLink.GetType() == GfxLinkType::NativeWmf) + bool bIsEMF = rLink.IsEMF(); + + // VectorGraphicDataType::Wmf means WMF or EMF, allow direct write in the WMF case + // only. + if (rLink.GetDataSize() && rLink.GetType() == GfxLinkType::NativeWmf && !bIsEMF) { // The source is already in WMF, no need to convert anything. rOStm.WriteBytes(rLink.GetData(), rLink.GetDataSize()); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits