From 27bb23bd7bdac4c649f2f9fa0fd6fa6f830472b94aea407c0830163e0a3fe99d Mon Sep 17 00:00:00 2001 From: Danilo Spinella Date: Wed, 2 Nov 2022 10:09:41 +0000 Subject: [PATCH] Accepting request 1031922 from LibreOffice:7.4 - Fix bsc#1202866 - LO-L3: PPTX: indentation of list items far too far to the left (overruns bullet items) * bsc1202866.patch OBS-URL: https://build.opensuse.org/request/show/1031922 OBS-URL: https://build.opensuse.org/package/show/LibreOffice:Factory/libreoffice?expand=0&rev=1045 --- bsc1202866.patch | 235 +++++++++++++++++++++++++++++++++++++++++ libreoffice.changes | 6 ++ libreoffice.spec | 3 + poppler-22.09.0.tar.xz | 3 + 4 files changed, 247 insertions(+) create mode 100644 bsc1202866.patch create mode 100644 poppler-22.09.0.tar.xz diff --git a/bsc1202866.patch b/bsc1202866.patch new file mode 100644 index 0000000..a06265b --- /dev/null +++ b/bsc1202866.patch @@ -0,0 +1,235 @@ +From b05c289cf0278ff9737dd928c5a97611e69219a8 Mon Sep 17 00:00:00 2001 +From: Sarper Akdemir +Date: Mon, 24 Oct 2022 01:50:36 +0300 +Subject: [PATCH 1/3] tdf#149961 pptx import: fix indents for autofitted + texboxes + +For autofitted textboxes, Impress scales the indents with the +text size while PowerPoint doesn't. + +Scale the indents inversely propotional to autofit font +scale so that the visual appearance on import is similar to +PowerPoint. + +Change-Id: I7876b35a1f4221789564fcf23ccbe3fe21db3d48 +Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141717 +Tested-by: Jenkins +Reviewed-by: Miklos Vajna +Signed-off-by: Xisco Fauli +Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141939 +Reviewed-by: Andras Timar +--- + oox/inc/drawingml/textparagraph.hxx | 3 +- + oox/inc/drawingml/textparagraphproperties.hxx | 1 + + oox/source/drawingml/textbody.cxx | 5 ++- + oox/source/drawingml/textparagraph.cxx | 5 ++- + .../drawingml/textparagraphproperties.cxx | 10 ++++- + .../pptx/tdf149961-autofitIndentation.pptx | Bin 0 -> 34123 bytes + sd/qa/unit/import-tests2.cxx | 40 ++++++++++++++++++ + 7 files changed, 58 insertions(+), 6 deletions(-) + create mode 100644 sd/qa/unit/data/pptx/tdf149961-autofitIndentation.pptx + +diff --git a/oox/inc/drawingml/textparagraph.hxx b/oox/inc/drawingml/textparagraph.hxx +index 1f43249372a5..4920c99da7c5 100644 +--- a/oox/inc/drawingml/textparagraph.hxx ++++ b/oox/inc/drawingml/textparagraph.hxx +@@ -77,7 +77,8 @@ public: + const TextListStyle& rMasterTextListStyle, + const TextListStyle& rTextListStyle, + bool bFirst, +- float nDefaultCharHeight) const; ++ float nDefaultCharHeight, ++ sal_Int32 nAutofitFontScale) const; + + bool HasMathXml() const + { +diff --git a/oox/inc/drawingml/textparagraphproperties.hxx b/oox/inc/drawingml/textparagraphproperties.hxx +index 8ea56a7b0736..083b61e37da7 100644 +--- a/oox/inc/drawingml/textparagraphproperties.hxx ++++ b/oox/inc/drawingml/textparagraphproperties.hxx +@@ -103,6 +103,7 @@ public: + const BulletList* pMasterBuList, + bool bApplyBulletList, + float fFontSize, ++ sal_Int32 nAutofitFontScale = 100000, + bool bPushDefaultValues = false ) const; + + /** Returns the largest character size of this paragraph. If possible the +diff --git a/oox/source/drawingml/textbody.cxx b/oox/source/drawingml/textbody.cxx +index 0f053ab6ad74..1be15c4f885d 100644 +--- a/oox/source/drawingml/textbody.cxx ++++ b/oox/source/drawingml/textbody.cxx +@@ -65,7 +65,7 @@ void TextBody::insertAt( + for (auto const& paragraph : maParagraphs) + { + paragraph->insertAt(rFilterBase, xText, xAt, rTextStyleProperties, aMasterTextStyle, +- maTextListStyle, (nIndex == 0), nCharHeight); ++ maTextListStyle, (nIndex == 0), nCharHeight, getTextProperties().mnFontScale); + ++nIndex; + } + } +@@ -148,7 +148,8 @@ void TextBody::ApplyStyleEmpty( + float nCharHeight = xProps->getPropertyValue("CharHeight").get(); + TextParagraphProperties aParaProp; + aParaProp.apply(*pTextParagraphStyle); +- aParaProp.pushToPropSet(&rFilterBase, xProps, aioBulletList, &pTextParagraphStyle->getBulletList(), true, nCharHeight, true); ++ aParaProp.pushToPropSet(&rFilterBase, xProps, aioBulletList, &pTextParagraphStyle->getBulletList(), ++ true, nCharHeight, getTextProperties().mnFontScale, true); + } + } + +diff --git a/oox/source/drawingml/textparagraph.cxx b/oox/source/drawingml/textparagraph.cxx +index f91ee279bb3b..80f9fd3739b3 100644 +--- a/oox/source/drawingml/textparagraph.cxx ++++ b/oox/source/drawingml/textparagraph.cxx +@@ -87,7 +87,8 @@ void TextParagraph::insertAt( + const Reference < XTextCursor > &xAt, + const TextCharacterProperties& rTextStyleProperties, + const TextListStyle& rMasterTextListStyle, +- const TextListStyle& rTextListStyle, bool bFirst, float nDefaultCharHeight) const ++ const TextListStyle& rTextListStyle, bool bFirst, ++ float nDefaultCharHeight, sal_Int32 nAutofitFontScale) const + { + try { + sal_Int32 nParagraphSize = 0; +@@ -175,7 +176,7 @@ void TextParagraph::insertAt( + } + + float fCharacterSize = nCharHeight > 0 ? GetFontHeight ( nCharHeight ) : pTextParagraphStyle->getCharHeightPoints( 12 ); +- aParaProp.pushToPropSet( &rFilterBase, xProps, aioBulletList, &pTextParagraphStyle->getBulletList(), true, fCharacterSize, true ); ++ aParaProp.pushToPropSet( &rFilterBase, xProps, aioBulletList, &pTextParagraphStyle->getBulletList(), true, fCharacterSize, nAutofitFontScale, true ); + } + + // empty paragraphs do not have bullets in ppt +diff --git a/oox/source/drawingml/textparagraphproperties.cxx b/oox/source/drawingml/textparagraphproperties.cxx +index 23efb301e963..0006b7530a76 100644 +--- a/oox/source/drawingml/textparagraphproperties.cxx ++++ b/oox/source/drawingml/textparagraphproperties.cxx +@@ -405,7 +405,7 @@ void TextParagraphProperties::apply( const TextParagraphProperties& rSourceProps + + void TextParagraphProperties::pushToPropSet( const ::oox::core::XmlFilterBase* pFilterBase, + const Reference < XPropertySet >& xPropSet, PropertyMap& rioBulletMap, const BulletList* pMasterBuList, bool bApplyBulletMap, float fCharacterSize, +- bool bPushDefaultValues ) const ++ sal_Int32 nAutofitFontScale, bool bPushDefaultValues ) const + { + PropertySet aPropSet( xPropSet ); + aPropSet.setProperties( maTextParagraphPropertyMap ); +@@ -431,6 +431,14 @@ void TextParagraphProperties::pushToPropSet( const ::oox::core::XmlFilterBase* p + std::optional< sal_Int32 > noParaLeftMargin( moParaLeftMargin ); + std::optional< sal_Int32 > noFirstLineIndentation( moFirstLineIndentation ); + ++ // tdf#149961 Impress scales the indents when text is autofitted while Powerpoint doesn't ++ // Try to counteract this by multiplying indents by the inverse of the autofit font scale. ++ if ( nAutofitFontScale ) ++ { ++ if ( noParaLeftMargin ) noParaLeftMargin = *noParaLeftMargin * MAX_PERCENT / nAutofitFontScale; ++ if ( noFirstLineIndentation ) noFirstLineIndentation = *noFirstLineIndentation * MAX_PERCENT / nAutofitFontScale; ++ } ++ + if ( nNumberingType != NumberingType::NUMBER_NONE ) + { + if ( noParaLeftMargin ) + +From df3b9d85b71df464731b02f1ff425bfd09b2db20 Mon Sep 17 00:00:00 2001 +From: Sarper Akdemir +Date: Mon, 24 Oct 2022 14:16:16 +0300 +Subject: [PATCH 2/3] related tdf#149961 pptx export: scale indents for + autofitted textboxes + +For autofitted textboxes, Impress scales the indents with +the text size while PowerPoint doesn't. + +Try to compensate for this by scaling exported indents +proportionally to the font scale on autofitted textboxes. + +Change-Id: Ib0f967e923d23553b4cdbd1bbe2e137d97b1b2e5 +Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141758 +Tested-by: Jenkins +Reviewed-by: Miklos Vajna +Signed-off-by: Xisco Fauli +--- + include/oox/export/drawingml.hxx | 2 +- + oox/source/export/drawingml.cxx | 26 +++++++++++++++--- + .../data/odp/autofitted-textbox-indent.odp | Bin 0 -> 12486 bytes + sd/qa/unit/export-tests-ooxml3.cxx | 22 +++++++++++++++ + 4 files changed, 45 insertions(+), 5 deletions(-) + create mode 100644 sd/qa/unit/data/odp/autofitted-textbox-indent.odp + +diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx +index c80024ea1fdd..674457b3c6e4 100644 +--- a/include/oox/export/drawingml.hxx ++++ b/include/oox/export/drawingml.hxx +@@ -302,7 +302,7 @@ public: + + @returns true if any paragraph properties were written + */ +- bool WriteParagraphProperties(const css::uno::Reference< css::text::XTextContent >& rParagraph, float fFirstCharHeight, sal_Int32 nElement); ++ bool WriteParagraphProperties(const css::uno::Reference< css::text::XTextContent >& rParagraph, const css::uno::Reference& rXShapePropSet, float fFirstCharHeight, sal_Int32 nElement); + void WriteParagraphNumbering(const css::uno::Reference< css::beans::XPropertySet >& rXPropSet, float fFirstCharHeight, + sal_Int16 nLevel ); + void WriteParagraphTabStops(const css::uno::Reference& rXPropSet); +diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx +index 0ab497a4fed3..5ee48ff6e338 100644 +--- a/oox/source/export/drawingml.cxx ++++ b/oox/source/export/drawingml.cxx +@@ -3020,7 +3020,7 @@ void DrawingML::WriteLinespacing(const LineSpacing& rSpacing, float fFirstCharHe + } + } + +-bool DrawingML::WriteParagraphProperties( const Reference< XTextContent >& rParagraph, float fFirstCharHeight, sal_Int32 nElement) ++bool DrawingML::WriteParagraphProperties(const Reference& rParagraph, const Reference& rXShapePropSet, float fFirstCharHeight, sal_Int32 nElement) + { + Reference< XPropertySet > rXPropSet( rParagraph, UNO_QUERY ); + Reference< XPropertyState > rXPropState( rParagraph, UNO_QUERY ); +@@ -3110,6 +3110,24 @@ bool DrawingML::WriteParagraphProperties( const Reference< XTextContent >& rPara + return false; + } + ++ // for autofitted textboxes, scale the indents ++ if (GetProperty(rXShapePropSet, "TextFitToSize") && mAny.get() == TextFitToSizeType_AUTOFIT) ++ { ++ SvxShapeText* pTextShape = dynamic_cast(rXShapePropSet.get()); ++ if (pTextShape) ++ { ++ SdrTextObj* pTextObject = dynamic_cast(pTextShape->GetSdrObject()); ++ if (pTextObject) ++ { ++ const auto nFontScaleY = pTextObject->GetFontScaleY(); ++ nLeftMargin = nLeftMargin * nFontScaleY / 100; ++ nLineIndentation = nLineIndentation * nFontScaleY / 100; ++ nParaLeftMargin = nParaLeftMargin * nFontScaleY / 100; ++ nParaFirstLineIndent = nParaFirstLineIndent * nFontScaleY / 100; ++ } ++ } ++ } ++ + if (nParaLeftMargin) // For Paragraph + mpFS->startElementNS( XML_a, nElement, + XML_lvl, sax_fastparser::UseIf(OString::number(nLevel), nLevel > 0), +@@ -3197,7 +3215,7 @@ void DrawingML::WriteLstStyles(const css::uno::ReferencegetPropertyValue("CharHeight").get(); + + mpFS->startElementNS(XML_a, XML_lstStyle); +- if( !WriteParagraphProperties(rParagraph, fFirstCharHeight, XML_lvl1pPr) ) ++ if( !WriteParagraphProperties(rParagraph, rXShapePropSet, fFirstCharHeight, XML_lvl1pPr) ) + mpFS->startElementNS(XML_a, XML_lvl1pPr); + WriteRunProperties(xFirstRunPropSet, false, XML_defRPr, true, rbOverridingCharHeight, + rnCharHeight, GetScriptType(rRun->getString()), rXShapePropSet); +@@ -3239,7 +3257,7 @@ void DrawingML::WriteParagraph( const Reference< XTextContent >& rParagraph, + rnCharHeight = 100 * fFirstCharHeight; + rbOverridingCharHeight = true; + } +- WriteParagraphProperties(rParagraph, fFirstCharHeight, XML_pPr); ++ WriteParagraphProperties(rParagraph, rXShapePropSet, fFirstCharHeight, XML_pPr); + bPropertiesWritten = true; + } + WriteRun( run, rbOverridingCharHeight, rnCharHeight, rXShapePropSet); +@@ -3733,7 +3751,7 @@ void DrawingML::WriteText(const Reference& rXIface, bool bBodyPr, bo + if( aAny >>= xParagraph ) + { + mpFS->startElementNS(XML_a, XML_p); +- WriteParagraphProperties(xParagraph, nCharHeight, XML_pPr); ++ WriteParagraphProperties(xParagraph, rXPropSet, nCharHeight, XML_pPr); + sal_Int16 nDummy = -1; + WriteRunProperties(rXPropSet, false, XML_endParaRPr, false, + bOverridingCharHeight, nCharHeight, nDummy, rXPropSet); diff --git a/libreoffice.changes b/libreoffice.changes index dae78a3..d1fc3bc 100644 --- a/libreoffice.changes +++ b/libreoffice.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Fri Oct 28 09:38:35 UTC 2022 - Andras Timar + +- Fix bsc#1202866 - LO-L3: PPTX: indentation of list items far too far to the left (overruns bullet items) + * bsc1202866.patch + ------------------------------------------------------------------- Wed Oct 26 08:41:00 UTC 2022 - Andras Timar diff --git a/libreoffice.spec b/libreoffice.spec index d306f0b..6608361 100644 --- a/libreoffice.spec +++ b/libreoffice.spec @@ -111,6 +111,8 @@ Patch10: fix_gtk_popover_on_3.20.patch Patch13: libreoffice-7.4.1.2-grep.patch # LO-L3: Text box shows that does not show in PowerPoint Patch14: bsc1201095.patch +# LO-L3: PPTX: indentation of list items far too far to the left (overruns bullet items) +Patch15: bsc1202866.patch # Build with java 8 Patch101: 0001-Revert-java-9-changes.patch # try to save space by using hardlinks @@ -1032,6 +1034,7 @@ Provides %{langname} translations and additional resources (help files, etc.) fo %endif %patch13 -p1 %patch14 -p1 +%patch15 -p1 %patch990 -p1 %patch991 -p1 diff --git a/poppler-22.09.0.tar.xz b/poppler-22.09.0.tar.xz new file mode 100644 index 0000000..0202bf4 --- /dev/null +++ b/poppler-22.09.0.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7a8f748211359cadb774ba3e18ecda6464b34027045c0648eb30d5852a41e2e +size 1842704