From 9e3eee88338c45424b24040f731083f9f59cfbe2 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Tue, 17 May 2022 16:11:25 +0200 Subject: sw HTML export: avoid pixel height when height is scale and width is relative Commit b17180a84cb4561b8a7bbf9e2281c91fffd56f87 (write out image size in html export for 'keep ratio' images, 2021-06-29) changed the sw HTML export to write the layout size of images in case one dimension is "keep ratio" and the other is some more concrete value. This is useful in case that other dimension is a fixed value, because "keep ratio" on the UI only means to keep the ratio as the size changes, it does not mean that the ratio will be the original ratio of the bitmap. However, it's problematic to write this layout size of the "keep ratio" dimension when the other dimension is relative, as this will mean the image's aspect ratio will change if the user resizes the browser window. Fix the problem by extending the way we write the "height" and "width" of fly frames: 1) Write a percentage in case of relative sizes 2) Write an explicit "auto" (or just omit the attribute in XHTML mode) in case the size is "keep ratio" and the other dimension is a relative size 3) Write the layout size in other cases (fixed size or "keep ratio", but the other dimension is a fixed size) Note that HTML itself has no concept of relative sizes where 100% is not the parent's size (e.g. page, not paragraph) and also has no concept of keeping an aspect ratio which is not the aspect ratio of the bitmap, so those cases remain unchanged. Change-Id: Ic5c7dc4d697160eff81e960a2f7d335fb78ab7c0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134482 Reviewed-by: Miklos Vajna Tested-by: Jenkins --- sw/qa/extras/htmlexport/htmlexport.cxx | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'sw/qa') diff --git a/sw/qa/extras/htmlexport/htmlexport.cxx b/sw/qa/extras/htmlexport/htmlexport.cxx index 639b744b05da..a85715f6bebc 100644 --- a/sw/qa/extras/htmlexport/htmlexport.cxx +++ b/sw/qa/extras/htmlexport/htmlexport.cxx @@ -2290,6 +2290,40 @@ CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testTableBackground) assertXPathNoAttribute(pXmlDoc, "//reqif-xhtml:table[2]/reqif-xhtml:tr[1]", "bgcolor"); } +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testImageKeepRatio) +{ + // Given a document with an image: width is relative, height is "keep ratio": + createSwDoc(); + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xTextGraphic( + xFactory->createInstance("com.sun.star.text.TextGraphicObject"), uno::UNO_QUERY); + xTextGraphic->setPropertyValue("AnchorType", + uno::Any(text::TextContentAnchorType_AS_CHARACTER)); + xTextGraphic->setPropertyValue("RelativeWidth", uno::Any(static_cast(42))); + xTextGraphic->setPropertyValue("IsSyncHeightToWidth", uno::Any(true)); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xBodyText = xTextDocument->getText(); + uno::Reference xCursor(xBodyText->createTextCursor()); + uno::Reference xTextContent(xTextGraphic, uno::UNO_QUERY); + xBodyText->insertTextContent(xCursor, xTextContent, false); + + // When exporting to HTML: + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + + // Then make sure that the width is not a fixed size, that would break on resizing the browser + // window: + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: auto + // - Actual : 2 + // i.e. a static (CSS pixel) height was written. + assertXPath(pDoc, "/html/body/p/img", "height", "auto"); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3