xmloff/qa/unit/text.cxx | 37 +++++++++++++++++++++++++++++++++++++ xmloff/source/text/txtparae.cxx | 12 ++++++++++-- 2 files changed, 47 insertions(+), 2 deletions(-)
New commits: commit 5ef5b313ad0f6fdb8f8de0a7463cb2a0c4956f1a Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Tue Sep 20 09:10:25 2022 +0200 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Tue Sep 20 20:43:47 2022 +0200 tdf#150990 ODT export: fix zero layout size of scale/scale images The bugdoc has a broken image where both axis are set to a relative size of 255%, which means "keep aspect", and the expectation is that only one axis uses this to match the size of the other axis. The problem was that commit b578fa08a25a83abccad2386e12b707586fffb26 (ODT export: fix fallback svg:width/height for text frames with relative sizes, 2022-03-16) assumed that only one axis uses "scale", so we always get a non-zero layout size. Fix the problem by only using the layout size when exactly one axis uses the "scale" percentage, which is the expected the case. This way we just keep the aspect ratio of broken documents, then the UI will in practice ignore the scale request of the width. Change-Id: I2dbd6bb92f912f6185422fd301b99b284a66ef74 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140218 Reviewed-by: Miklos Vajna <vmik...@collabora.com> Tested-by: Jenkins (cherry picked from commit 80550ade305b9e68c6281a258d162bc2c413713a) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140167 Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/xmloff/qa/unit/text.cxx b/xmloff/qa/unit/text.cxx index d5c8f0b6e22a..af0fba426822 100644 --- a/xmloff/qa/unit/text.cxx +++ b/xmloff/qa/unit/text.cxx @@ -385,6 +385,43 @@ CPPUNIT_TEST_FIXTURE(XmloffStyleTest, testRelativeWidth) assertXPath(pXmlDoc, "//draw:frame", "width", "3.1492in"); } +CPPUNIT_TEST_FIXTURE(XmloffStyleTest, testScaleWidthAndHeight) +{ + // Given a broken document where both IsSyncHeightToWidth and IsSyncWidthToHeight are set to + // true: + getComponent() = loadFromDesktop("private:factory/swriter"); + uno::Reference<lang::XMultiServiceFactory> xMSF(getComponent(), uno::UNO_QUERY); + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<text::XTextContent> xTextFrame( + xMSF->createInstance("com.sun.star.text.TextFrame"), uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xTextFrameProps(xTextFrame, uno::UNO_QUERY); + xTextFrameProps->setPropertyValue("Width", uno::Any(static_cast<sal_Int16>(2000))); + xTextFrameProps->setPropertyValue("Height", uno::Any(static_cast<sal_Int16>(1000))); + xTextFrameProps->setPropertyValue("IsSyncHeightToWidth", uno::Any(true)); + xTextFrameProps->setPropertyValue("IsSyncWidthToHeight", uno::Any(true)); + uno::Reference<text::XText> xText = xTextDocument->getText(); + uno::Reference<text::XTextCursor> xCursor = xText->createTextCursor(); + xText->insertTextContent(xCursor, xTextFrame, /*bAbsorb=*/false); + + // When exporting to ODT: + uno::Reference<frame::XStorable> xStorable(getComponent(), uno::UNO_QUERY); + uno::Sequence<beans::PropertyValue> aStoreProps = comphelper::InitPropertySequence({ + { "FilterName", uno::Any(OUString("writer8")) }, + }); + utl::TempFile aTempFile; + aTempFile.EnableKillingFile(); + xStorable->storeToURL(aTempFile.GetURL(), aStoreProps); + + // Then make sure that we still export a non-zero size: + std::unique_ptr<SvStream> pStream = parseExportStream(aTempFile, "content.xml"); + xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get()); + // Without the accompanying fix in place, this failed with: + // - Expected: 0.7874in + // - Actual : 0in + // i.e. the exported size was 0, not 2000 mm100 in inches. + assertXPath(pXmlDoc, "//draw:frame", "width", "0.7874in"); +} + CPPUNIT_TEST_FIXTURE(XmloffStyleTest, testContentControlExport) { // Given a document with a content control around one or more text portions: diff --git a/xmloff/source/text/txtparae.cxx b/xmloff/source/text/txtparae.cxx index 3612bbe33490..e310d4c9c2cd 100644 --- a/xmloff/source/text/txtparae.cxx +++ b/xmloff/source/text/txtparae.cxx @@ -2866,6 +2866,14 @@ XMLShapeExportFlags XMLTextParagraphExport::addTextFrameAttributes( rPropSet->getPropertyValue("LayoutSize") >>= aLayoutSize; } + bool bUseLayoutSize = true; + if (bSyncWidth && bSyncHeight) + { + // This is broken, width depends on height and height depends on width. Don't use the + // invalid layout size we got. + bUseLayoutSize = false; + } + // svg:width sal_Int16 nWidthType = SizeType::FIX; if( xPropSetInfo->hasPropertyByName( gsWidthType ) ) @@ -2891,7 +2899,7 @@ XMLShapeExportFlags XMLTextParagraphExport::addTextFrameAttributes( } else { - if (nRelWidth > 0 || bSyncWidth) + if ((nRelWidth > 0 || bSyncWidth) && bUseLayoutSize) { // Relative width: write the layout size for the fallback width. sValue.setLength(0); @@ -2947,7 +2955,7 @@ XMLShapeExportFlags XMLTextParagraphExport::addTextFrameAttributes( } else { - if (nRelHeight > 0 || bSyncHeight) + if ((nRelHeight > 0 || bSyncHeight) && bUseLayoutSize) { // Relative height: write the layout size for the fallback height. sValue.setLength(0);