summaryrefslogtreecommitdiff
path: root/filter/qa
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2020-02-26 13:03:17 +0100
committerMiklos Vajna <vmiklos@collabora.com>2020-02-26 17:03:49 +0100
commit31b2a9b2c17f7dbf6c2ef4998c9d192ca5c70f98 (patch)
tree7b45f1801963c245f24909318c81f0ae955d113a /filter/qa
parentaf17b2cd26a1e36edf0b995f81a2e0757086dad1 (diff)
sw SVG export: try to reuse original bitmap data for JPG and PNG bitmaps
Writer shapes are implemented using SwXShape, Impress shapes use SdrGrafObj. So switch to working with the XShape interface, which is supported by both. Also, don't work with the transformed graphic if it has the same checksum as the original graphic: the transformed graphic is not linked to the original JPG/PNG data. Now selecting an image in Writer Online has the same speedup that Impress Online already had. Change-Id: Iab2791c5f5c7a2754e3de0ebb2d6ea664f6c77e4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89542 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'filter/qa')
-rw-r--r--filter/qa/unit/data/preserve-jpg.odtbin0 -> 10052 bytes
-rw-r--r--filter/qa/unit/svg.cxx123
2 files changed, 123 insertions, 0 deletions
diff --git a/filter/qa/unit/data/preserve-jpg.odt b/filter/qa/unit/data/preserve-jpg.odt
new file mode 100644
index 000000000000..83768bd47afb
--- /dev/null
+++ b/filter/qa/unit/data/preserve-jpg.odt
Binary files differ
diff --git a/filter/qa/unit/svg.cxx b/filter/qa/unit/svg.cxx
new file mode 100644
index 000000000000..379189b98365
--- /dev/null
+++ b/filter/qa/unit/svg.cxx
@@ -0,0 +1,123 @@
+/* -*- 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 <test/bootstrapfixture.hxx>
+#include <unotest/macros_test.hxx>
+#include <test/xmltesttools.hxx>
+
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/io/XOutputStream.hpp>
+#include <com/sun/star/frame/DispatchHelper.hpp>
+#include <unotools/streamwrap.hxx>
+#include <unotools/mediadescriptor.hxx>
+#include <tools/stream.hxx>
+#include <comphelper/processfactory.hxx>
+
+using namespace ::com::sun::star;
+
+char const DATA_DIRECTORY[] = "/filter/qa/unit/data/";
+
+namespace
+{
+void dispatchCommand(const uno::Reference<lang::XComponent>& xComponent, const OUString& rCommand,
+ const uno::Sequence<beans::PropertyValue>& rPropertyValues)
+{
+ uno::Reference<frame::XController> xController
+ = uno::Reference<frame::XModel>(xComponent, uno::UNO_QUERY_THROW)->getCurrentController();
+ CPPUNIT_ASSERT(xController.is());
+ uno::Reference<frame::XDispatchProvider> xFrame(xController->getFrame(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFrame.is());
+
+ uno::Reference<uno::XComponentContext> xContext = ::comphelper::getProcessComponentContext();
+ uno::Reference<frame::XDispatchHelper> xDispatchHelper(frame::DispatchHelper::create(xContext));
+ CPPUNIT_ASSERT(xDispatchHelper.is());
+
+ xDispatchHelper->executeDispatch(xFrame, rCommand, OUString(), 0, rPropertyValues);
+}
+}
+
+/// SVG filter tests.
+class SvgFilterTest : public test::BootstrapFixture, public unotest::MacrosTest, public XmlTestTools
+{
+private:
+ uno::Reference<uno::XComponentContext> mxComponentContext;
+ uno::Reference<lang::XComponent> mxComponent;
+
+public:
+ void setUp() override;
+ void tearDown() override;
+ void registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) override;
+ uno::Reference<lang::XComponent>& getComponent() { return mxComponent; }
+ void load(const OUString& rURL);
+};
+
+void SvgFilterTest::setUp()
+{
+ test::BootstrapFixture::setUp();
+
+ mxComponentContext.set(comphelper::getComponentContext(getMultiServiceFactory()));
+ mxDesktop.set(frame::Desktop::create(mxComponentContext));
+}
+
+void SvgFilterTest::tearDown()
+{
+ if (mxComponent.is())
+ mxComponent->dispose();
+
+ test::BootstrapFixture::tearDown();
+}
+
+void SvgFilterTest::load(const OUString& rFileName)
+{
+ OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + rFileName;
+ mxComponent = loadFromDesktop(aURL);
+}
+
+void SvgFilterTest::registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx)
+{
+ xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("svg"), BAD_CAST("http://www.w3.org/2000/svg"));
+}
+
+CPPUNIT_TEST_FIXTURE(SvgFilterTest, testPreserveJpg)
+{
+#if !defined(MACOSX)
+ // Load a document with a jpeg image in it.
+ load("preserve-jpg.odt");
+
+ // Select the image.
+ dispatchCommand(getComponent(), ".uno:JumpToNextFrame", {});
+
+ // Export the selection to SVG.
+ uno::Reference<frame::XStorable> xStorable(getComponent(), uno::UNO_QUERY_THROW);
+ SvMemoryStream aStream;
+ uno::Reference<io::XOutputStream> xOut = new utl::OOutputStreamWrapper(aStream);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OUString("writer_svg_Export");
+ aMediaDescriptor["SelectionOnly"] <<= true;
+ aMediaDescriptor["OutputStream"] <<= xOut;
+ xStorable->storeToURL("private:stream", aMediaDescriptor.getAsConstPropertyValueList());
+ aStream.Seek(STREAM_SEEK_TO_BEGIN);
+
+ // Make sure the the original JPG data is reused and we don't perform a PNG re-compress.
+ xmlDocPtr pXmlDoc = parseXmlStream(&aStream);
+ OUString aAttributeValue = getXPath(pXmlDoc, "//svg:image", "href");
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expression: aAttributeValue.startsWith("data:image/jpeg")
+ // i.e. the SVG export result re-compressed the image as PNG, even if the original and the
+ // transformed image is the same, so there is no need for that.
+ CPPUNIT_ASSERT(aAttributeValue.startsWith("data:image/jpeg"));
+#endif
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */