sw/CppunitTest_sw_writerfilter_rtftok.mk | 11 +++ sw/qa/writerfilter/rtftok/data/image-size-in-shape-text.rtf | 37 ++++++++++++ sw/qa/writerfilter/rtftok/rtfdocumentimpl.cxx | 29 ++++++++- sw/source/writerfilter/rtftok/rtfdocumentimpl.cxx | 9 ++ 4 files changed, 82 insertions(+), 4 deletions(-)
New commits: commit 94418dd07322d94825bd86f9a496d28c43421317 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Tue Jun 17 08:47:09 2025 +0200 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Tue Jun 17 09:58:20 2025 +0200 tdf#167044 sw RTF import: fix bad image size in shape text Regression from commit 57d9cc81b058757421cd082e5dbe32a919716807 (tdf#127806: RTF import: use shape dimensions for pib picture, 2022-09-01), open the bugdoc, the icon image inside the shape should be about 0.37cm x 0.37cm, is about 14.98 cm x 12.66 cm. What happens is that \pict was assumed to be inside the property value of a shape, in which case both the shape and the picture can have a size, and the old use-case requires to ignore the inner size. The new use-case is two user-visible shapes: an outer text frame and an inner small icon image, inside shape text. The different sizes are wanted in this case. Fix the problem by conditionally going back to the old behavior of not inheriting size for the inner shape. The name of the destination at the top of the parser stack is different for the "in property value" and the "in shape text" cases, so this keeps the old use-case working while restores the wanted small size for the new use-case. Here the difference between the old and new size was so large that the end-user saw this as "the image was not visible previously". Change-Id: Ife93089b967fc26b7180775db8fc507a896d160b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186593 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/sw/CppunitTest_sw_writerfilter_rtftok.mk b/sw/CppunitTest_sw_writerfilter_rtftok.mk index 67207f27a9ae..9458f205da9d 100644 --- a/sw/CppunitTest_sw_writerfilter_rtftok.mk +++ b/sw/CppunitTest_sw_writerfilter_rtftok.mk @@ -34,6 +34,9 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_writerfilter_rtftok, \ oox \ sal \ subsequenttest \ + svl \ + sw \ + swqahelper \ test \ unotest \ utl \ @@ -41,6 +44,14 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_writerfilter_rtftok, \ vcl \ )) +$(eval $(call gb_CppunitTest_set_include,sw_writerfilter_rtftok,\ + -I$(SRCDIR)/sw/inc \ + -I$(SRCDIR)/sw/source/core/inc \ + -I$(SRCDIR)/sw/source/uibase/inc \ + -I$(SRCDIR)/sw/qa/inc \ + $$(INCLUDE) \ +)) + $(eval $(call gb_CppunitTest_use_sdk_api,sw_writerfilter_rtftok)) $(eval $(call gb_CppunitTest_use_ure,sw_writerfilter_rtftok)) diff --git a/sw/qa/writerfilter/rtftok/data/image-size-in-shape-text.rtf b/sw/qa/writerfilter/rtftok/data/image-size-in-shape-text.rtf new file mode 100644 index 000000000000..2499e319916b --- /dev/null +++ b/sw/qa/writerfilter/rtftok/data/image-size-in-shape-text.rtf @@ -0,0 +1,37 @@ +{ tf1 +\paperw11907\paperh16840\margl1588\margr1588\margt1276\margb1276 +{\shp +{\*\shpinst\shpleft56\shptop50\shpright8864\shpbottom8198\shpfhdr0\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz0\shplid1026 +{\sp +{\sn shapeType} +{\sv 202} +} +{\shptxt before\par +\pard +{\*\shppict +{\pict +{\*\picprop\shplid1025 +{\sp +{\sn shapeType} +{\sv 75} +} +} +\picscalex82\picscaley82\picw450\pich450\picwgoal255\pichgoal255\pngblip +89504e470d0a1a0a0000000d49484452000000110000001108030000000cb3b7c800000001735247420240c07dc500000171504c544500000000000800001300 +000703003a00003d0400550f006a2019112214723130613f2fab453d1f493b3d493b4e5a4f4c5a564c514d54514d56554f574543654e496d5c566f5e59715e5a +715f5a705e5970484772464d96635344645e6e665f6b665f6d6161467374b582772497978f94919ead921bb2af01a9a019beb713d5bd0ed3b710c4b700c2aa1c +ceae12dedb06dece0eeebf00e9d200ead202e8cc05ecce03ffdf00f3d606e8c300fcdf0effd900e7d300ecc602ffd700ffde00ebc61ef7cb00ffdf01f7c400f8 +c600f9c600ffd100fecc00ffd300fcc700f8c500ffce00ffd500eed035efca32f2e500ffff00f5f314ece902eae300ffff09ffff1dfff703eae407fbeb04ffff +06ffff03fff60cffff12fff40afffb06ffff05f8e30affeb05fffc00faf202fffe10ffed0effea00fffa00fff400fff40dffe407ffec00ffed00fff500fff900 +fffe12ffe50cffe800fff000fff800fff902fffd05ffe000ffe900ffe400ffe703ffe700ffff2df031d6100000000174524e530040e6d8660000000970485973 +00000ec400000ec401952b0e1b0000001974455874536f667477617265004d6963726f736f6674204f66666963657fed3571000000b74944415428cf6360c001 +fcfc55d00402aa02955044828243fc15519484eaab0787212bf20b6664e1f7174012088f6062e38b344028328af2e761978df617842b318ef157e6548e8dd382 +2932894f48d4e0d54c4a4e14822a314d314b35574b4bcf88d08628b2b0ccb4cab2d6c9cec9cdcb15062bb1c9b7b52b6066d52d2c2a2ed10329b27770b42a2de3 +e0f629b02aafa814018af81a3a39bbb8dabab97b387b7a797381b4a98a8a894bc8c94b8a8b4b2948cb600b18005842252806b751530000000049454e44ae426082} +} + after\par +} +} +} +\par +} diff --git a/sw/qa/writerfilter/rtftok/rtfdocumentimpl.cxx b/sw/qa/writerfilter/rtftok/rtfdocumentimpl.cxx index e7ef9548078e..d89ffe382206 100644 --- a/sw/qa/writerfilter/rtftok/rtfdocumentimpl.cxx +++ b/sw/qa/writerfilter/rtftok/rtfdocumentimpl.cxx @@ -7,7 +7,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include <test/unoapi_test.hxx> +#include <swmodeltestbase.hxx> #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/drawing/XDrawPageSupplier.hpp> @@ -18,16 +18,18 @@ #include <vcl/graph.hxx> +#include <fmtfsize.hxx> + using namespace ::com::sun::star; namespace { /// Tests for sw/source/writerfilter/rtftok/rtfdocumentimpl.cxx. -class Test : public UnoApiTest +class Test : public SwModelTestBase { public: Test() - : UnoApiTest(u"/sw/qa/writerfilter/rtftok/data/"_ustr) + : SwModelTestBase(u"/sw/qa/writerfilter/rtftok/data/"_ustr) { } }; @@ -111,6 +113,27 @@ CPPUNIT_TEST_FIXTURE(Test, testOldParaNumLeftMargin) // i.e. the left indent was 0, not 1191 twips (from the file) in mm100. CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2101), nParaLeftMargin); } + +CPPUNIT_TEST_FIXTURE(Test, testImageSizeInShapeText) +{ + // Given an RTF document with a shape and an icon image inside that: + // When loading this document: + createSwDoc("image-size-in-shape-text.rtf"); + + // Then make sure that the icon image has the correct (small) size: + SwDoc* pDoc = getSwDoc(); + const sw::FrameFormats<sw::SpzFrameFormat*>& rFlyFormats = *pDoc->GetSpzFrameFormats(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rFlyFormats.size()); + const sw::SpzFrameFormat& rImageFlyFormat = *rFlyFormats[1]; + const SwFormatFrameSize& rImageSize = rImageFlyFormat.GetFrameSize(); + // 255 * 0.82 in the RTF file. + SwTwips nExpected = 209; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 209 + // - Actual : 8808 + // i.e. the size of the icon was inherited from the containing shape, losing the own size. + CPPUNIT_ASSERT_EQUAL(nExpected, rImageSize.GetWidth()); +} } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/writerfilter/rtftok/rtfdocumentimpl.cxx b/sw/source/writerfilter/rtftok/rtfdocumentimpl.cxx index a4dd2ac93cba..53926cb2bae0 100644 --- a/sw/source/writerfilter/rtftok/rtfdocumentimpl.cxx +++ b/sw/source/writerfilter/rtftok/rtfdocumentimpl.cxx @@ -1031,7 +1031,14 @@ void RTFDocumentImpl::resolvePict(bool const bInline, uno::Reference<drawing::XS } uno::Reference<drawing::XShape> xShape(rShape); - if (m_aStates.top().getInShape() && xShape.is()) + + // \pict may be inside a shape property value, in which case the current destination is + // SHAPEINSTRUCTION. Or we may be inside shape text, when \pict is processed immediately. + bool bInShapeText = m_aStates.top().getDestination() == Destination::PICT; + + // Only ignore the inner size for a shape property value, not for an inline shape inside shape + // text: + if (m_aStates.top().getInShape() && xShape.is() && !bInShapeText) { awt::Size aSize = xShape->getSize(); if (aSize.Width || aSize.Height)