tdf#167044 sw RTF import: fix bad image size in shape text
Regression from commit 57d9cc81b0
(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/+/186602
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
This commit is contained in:
@@ -31,9 +31,13 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_writerfilter_rtftok, \
|
||||
comphelper \
|
||||
cppu \
|
||||
cppuhelper \
|
||||
editeng \
|
||||
oox \
|
||||
sal \
|
||||
subsequenttest \
|
||||
svl \
|
||||
sw \
|
||||
swqahelper \
|
||||
test \
|
||||
unotest \
|
||||
utl \
|
||||
@@ -41,6 +45,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))
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
{\rtf1
|
||||
\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
|
||||
}
|
||||
@@ -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: */
|
||||
|
||||
@@ -1033,7 +1033,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)
|
||||
|
||||
Reference in New Issue
Block a user