From a574572f3147179626061ebf1076540cc110b155 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Fri, 12 Dec 2025 08:32:04 +0100 Subject: [PATCH] tdf#169680 DOCX import: fix unexpected stretched image Open the bugdoc, the music notes picture inside is not readable. This went wrong in commit edda1e5fc8113aa4744e32f97c96a3cc311485ca (DOCX import: lazy-read images without external headers, 2018-04-20), and later commit c3ce373227433f40d686847a22e78651bedbab24 (tdf#156593 FILEOPEN OOXML: image shown in full instead of cropped, 2023-10-27) fixed a similar problem, this bugdoc is still bad. Note how the second commit looks for the .tiff extension, while this bugdoc has a .TIF image. Fix the problem by looking for both extensions, in a case-insensitive way. A future possibility would be to improve OInputCompStream's XPropertySet implementation, so next to its Compressed and Size properties, it would also expose the image/tiff MIME type, and then we would not have to guess content based on the file extension. Change-Id: I81519119bae698bf1cca34792fcf1aa6587b48a8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195542 Reviewed-by: Miklos Vajna Tested-by: Jenkins --- oox/CppunitTest_oox_helper.mk | 48 ++++++++++++++++++++++++ oox/Module_oox.mk | 1 + oox/qa/unit/data/tif-crop.docx | Bin 0 -> 46618 bytes oox/qa/unit/helper.cxx | 56 ++++++++++++++++++++++++++++ oox/source/helper/graphichelper.cxx | 4 +- 5 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 oox/CppunitTest_oox_helper.mk create mode 100644 oox/qa/unit/data/tif-crop.docx create mode 100644 oox/qa/unit/helper.cxx diff --git a/oox/CppunitTest_oox_helper.mk b/oox/CppunitTest_oox_helper.mk new file mode 100644 index 000000000000..755f0d6ec4ec --- /dev/null +++ b/oox/CppunitTest_oox_helper.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,oox_helper)) + +$(eval $(call gb_CppunitTest_use_externals,oox_helper,\ + boost_headers \ +)) + +$(eval $(call gb_CppunitTest_add_exception_objects,oox_helper, \ + oox/qa/unit/helper \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,oox_helper, \ + comphelper \ + cppu \ + cppuhelper \ + oox \ + sal \ + subsequenttest \ + test \ + unotest \ + utl \ + tl \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,oox_helper)) + +$(eval $(call gb_CppunitTest_use_ure,oox_helper)) +$(eval $(call gb_CppunitTest_use_vcl,oox_helper)) + +$(eval $(call gb_CppunitTest_use_rdb,oox_helper,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,oox_helper,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,oox_helper)) + +# vim: set noet sw=4 ts=4: diff --git a/oox/Module_oox.mk b/oox/Module_oox.mk index f1d88c2dee21..07e33ec774d8 100644 --- a/oox/Module_oox.mk +++ b/oox/Module_oox.mk @@ -37,6 +37,7 @@ $(eval $(call gb_Module_add_check_targets,oox,\ CppunitTest_oox_mcgr \ CppunitTest_oox_testscene3d \ CppunitTest_oox_wpc_drawing_canvas \ + CppunitTest_oox_helper \ )) endif diff --git a/oox/qa/unit/data/tif-crop.docx b/oox/qa/unit/data/tif-crop.docx new file mode 100644 index 0000000000000000000000000000000000000000..46fd22c972d2627d0c8c1eace5c1110a51882ab2 GIT binary patch literal 46618 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 literal 0 HcmV?d00001 diff --git a/oox/qa/unit/helper.cxx b/oox/qa/unit/helper.cxx new file mode 100644 index 000000000000..d9739e925dc3 --- /dev/null +++ b/oox/qa/unit/helper.cxx @@ -0,0 +1,56 @@ +/* -*- 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 + +using namespace ::com::sun::star; + +namespace +{ +/// Covers oox/source/helper/ fixes. +class Test : public UnoApiTest +{ +public: + Test() + : UnoApiTest(u"/oox/qa/unit/data/"_ustr) + { + } +}; + +CPPUNIT_TEST_FIXTURE(Test, testImportTifCrop) +{ + // Given a cropped .TIF file in a document: + // When loading that document: + loadFromFile(u"tif-crop.docx"); + + // Then make sure the result has the correct crop rectangle: + uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + text::GraphicCrop aCrop; + xShape->getPropertyValue(u"GraphicCrop"_ustr) >>= aCrop; + // Without the accompanying fix in place, this failed with: + // - Expected: 3928 + // - Actual : 24553 + // i.e. lazy-loading lead to some unexpected crop rectangle, the image was not readable. + CPPUNIT_ASSERT_EQUAL(static_cast(3928), aCrop.Top); + CPPUNIT_ASSERT_EQUAL(static_cast(6660), aCrop.Bottom); + CPPUNIT_ASSERT_EQUAL(static_cast(1732), aCrop.Left); + CPPUNIT_ASSERT_EQUAL(static_cast(1145), aCrop.Right); +} +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/helper/graphichelper.cxx b/oox/source/helper/graphichelper.cxx index c68ebe7e295c..4a6e42c2e2f0 100644 --- a/oox/source/helper/graphichelper.cxx +++ b/oox/source/helper/graphichelper.cxx @@ -288,7 +288,9 @@ Reference< XGraphic > GraphicHelper::importEmbeddedGraphic( const OUString& rStr // we are using MapUnit::MapPixel, but in case of cropped images we are using MapUnit::Map100thMM // and the crop values are relative to original bitmap size. auto xStream = mxStorage->openInputStream(rStreamName); - xGraphic = importGraphic(xStream, pExtHeader, !rStreamName.endsWith(".tiff")); + bool bLazyLoad = !rStreamName.endsWithIgnoreAsciiCase(".tiff") + && !rStreamName.endsWithIgnoreAsciiCase(".tif"); + xGraphic = importGraphic(xStream, pExtHeader, bLazyLoad); if (xGraphic.is()) mxGraphicMapper->putGraphic(rStreamName, xGraphic); }