From 370e262391c09ef9f592fc5ddee81a3340d32681 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Thu, 24 Sep 2026 23:19:06 +0000 Subject: [PATCH] Related: tdf#163590 apply the autofit scales stored in pptx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A PPTX shape keeps the fit the file was saved with until its text is edited, and after that it is fitted by our own rules. The fontScale and lnSpcReduction of a normAutofit never reached the shape, for three reasons. Import passed fractions to the TextFitToSizeFontScale and TextFitToSizeSpacingScale properties, which are percentages. A missing lnSpcReduction was read as 100000, a full reduction, instead of 0. When both properties were set in one setPropertyValues call along with TextFitToSize, the collected fit item was applied last and overwrote the scales. Change-Id: I6b7fcfb6a1822f289f18b8ce77e78526a80f8944 Signed-off-by: Caolán McNamara Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/13539 Tested-by: Jenkins CPCI Reviewed-by: Miklos Vajna (cherry picked from commit c6938c35aa527883e2fd867f36e22c396601d376) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211506 Reviewed-by: Xisco Fauli Tested-by: Jenkins --- oox/inc/drawingml/textbodyproperties.hxx | 2 +- .../drawingml/textbodypropertiescontext.cxx | 7 ++-- sd/qa/unit/TextFittingTest.cxx | 33 ++++++++++++++++++ sd/qa/unit/data/pptx/TextFittingStored.pptx | Bin 0 -> 46607 bytes svx/source/svdraw/svdotxed.cxx | 14 ++++++++ svx/source/unodraw/unoshape.cxx | 31 ++++++++-------- 6 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 sd/qa/unit/data/pptx/TextFittingStored.pptx diff --git a/oox/inc/drawingml/textbodyproperties.hxx b/oox/inc/drawingml/textbodyproperties.hxx index 46cf99614c56..2a977c879d7e 100644 --- a/oox/inc/drawingml/textbodyproperties.hxx +++ b/oox/inc/drawingml/textbodyproperties.hxx @@ -50,7 +50,7 @@ struct TextBodyProperties OUString msPrst; /// Normal autofit: font scale (default: 100%). sal_Int32 mnFontScale = 100000; - sal_Int32 mnSpacingScale = 100000; + sal_Int32 mnSpacingReduction = 0; OUString msHorzOverflow; std::optional< sal_Int32 > moVertOverflow{}; diff --git a/oox/source/drawingml/textbodypropertiescontext.cxx b/oox/source/drawingml/textbodypropertiescontext.cxx index 2508513f89d1..a20d97debb89 100644 --- a/oox/source/drawingml/textbodypropertiescontext.cxx +++ b/oox/source/drawingml/textbodypropertiescontext.cxx @@ -238,9 +238,10 @@ ContextHandlerRef TextBodyPropertiesContext::onCreateContext( sal_Int32 aElement mrTextBodyProp.maPropertyMap.setProperty( PROP_TextFitToSize, TextFitToSizeType_AUTOFIT); mrTextBodyProp.maPropertyMap.setProperty(PROP_TextAutoGrowHeight, false); mrTextBodyProp.mnFontScale = rAttribs.getInteger(XML_fontScale, 100000); - mrTextBodyProp.mnSpacingScale = rAttribs.getInteger(XML_lnSpcReduction, 100000); - mrTextBodyProp.maPropertyMap.setProperty(PROP_TextFitToSizeFontScale, mrTextBodyProp.mnFontScale / 100000.0); - mrTextBodyProp.maPropertyMap.setProperty(PROP_TextFitToSizeSpacingScale, 1.0 - mrTextBodyProp.mnSpacingScale / 100000.0); + mrTextBodyProp.mnSpacingReduction = rAttribs.getInteger(XML_lnSpcReduction, 0); + // The two properties are percentages. + mrTextBodyProp.maPropertyMap.setProperty(PROP_TextFitToSizeFontScale, mrTextBodyProp.mnFontScale / 1000.0); + mrTextBodyProp.maPropertyMap.setProperty(PROP_TextFitToSizeSpacingScale, 100.0 - mrTextBodyProp.mnSpacingReduction / 1000.0); break; } case A_TOKEN( spAutoFit ): diff --git a/sd/qa/unit/TextFittingTest.cxx b/sd/qa/unit/TextFittingTest.cxx index 74bfce98e669..d45d379c579a 100644 --- a/sd/qa/unit/TextFittingTest.cxx +++ b/sd/qa/unit/TextFittingTest.cxx @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include #include #include @@ -203,6 +205,37 @@ CPPUNIT_TEST_FIXTURE(TextFittingTest, testTestBulletDifferenceViewAndEdit) CPPUNIT_ASSERT_EQUAL(false, pView->IsTextEdit()); } +CPPUNIT_TEST_FIXTURE(TextFittingTest, testStoredFitKeptUntilEdited) +{ + // The first slide stores a fit of 55 percent font with 20 percent less line spacing, though + // its text fits at full size. The stored fit is shown until the text is edited, and then the + // text is fitted afresh. + createSdImpressDoc("pptx/TextFittingStored.pptx"); + auto pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + auto pBody = DynCastSdrTextObj(pViewShell->GetActualPage()->GetObj(1)); + CPPUNIT_ASSERT(pBody); + + const SdrTextFitToSizeTypeItem& rStored = pBody->GetMergedItem(SDRATTR_TEXT_FITTOSIZE); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.55, rStored.getFontScale(), 1E-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.8, rStored.getSpacingScale(), 1E-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.55, pBody->GetFontScale(), 1E-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.8, pBody->GetSpacingScale(), 1E-4); + + SdrView* pView = pViewShell->GetView(); + Scheduler::ProcessEventsToIdle(); + pView->SdrBeginTextEdit(pBody); + CPPUNIT_ASSERT(pView->IsTextEdit()); + EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); + rEditView.SetSelection(ESelection(0, 0)); + rEditView.InsertText(u"x"_ustr); + pView->SdrEndTextEdit(); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, pBody->GetFontScale(), 1E-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, pBody->GetSpacingScale(), 1E-4); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/data/pptx/TextFittingStored.pptx b/sd/qa/unit/data/pptx/TextFittingStored.pptx new file mode 100644 index 0000000000000000000000000000000000000000..358f6a3c245e9bc4a0e73e088419f93b3132970c GIT binary patch literal 46607 zcmeFZQ*#XBGuj_tfCB6Y80{{Sk14PxcYW5{**|iF zXs=1@Vren{Yt(9$9$x4X$ybQUGM>3QT?ns?2Z;F@Kp1;f@)?N3X}^<>_;(N@ zvD{JsJR1M)F1oOOf)$xl1>bUjU67cTQN-Hno?weEAay#V@TR#p624_Y5ASPf3 zheOzcWIoHJ;|-HGswV1`yMk(h)bgC?J~mz-wDvGxM1S#TezYxm@01+GU~C_aIra>a z#A7tz9F93=7AUNPPT?^c>MP{nkKEtuSHbbB@x%k{V; zB=CAq@#A~l<2Lw1T9(nGKKM+&Av9mAMFfFpd;kNmsU2MqzSKxReEx7fx*szHsz3~B zRW3G#6sHhD#ATR;hq}S;DIWb+k7?RBu~Zqo05ht$v`O*EBVm%@9buhKI`cqGT zN!PxpF40Sm40h$*eJOimHG9UR+JuJifFF{Ehu>&y$&eh^x9sVTF>)4ka7M6K6Kr=w zl|Yb9%%N*4j3^sOi>0)`=lJTvMilC(k*Hw;!olG~Qnr6Sz5@d69I4!B zrIzL(Po5UP((;fguRe$0BIO8G8n0Irxi?X`qFBG*&sF6ETWi5D)d{AWc`vzOC_UC{ zAP{E(N24*Tap@!l2-o@)lf8zgKjrx?Yf`u=iCEo=(uRX0aYh=F|5FZ{pHl7H1HUb$ zD+®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 #include #include +#include +#include #include #include @@ -287,6 +289,18 @@ void SdrTextObj::EndTextEdit(SdrOutliner& rOutl) SetOutlinerParaObject(std::move(pNewText)); } + // The fit stored with the shape belongs to the text before the edit, so fit afresh. + if (IsAutoFit()) + { + SdrTextFitToSizeTypeItem aItem(GetObjectItem(SDRATTR_TEXT_FITTOSIZE)); + if (aItem.getFontScale() != 0.0 || aItem.getSpacingScale() != 0.0) + { + aItem.setFontScale(0.0); + aItem.setSpacingScale(0.0); + SetObjectItem(aItem); + } + } + if (isAnnotationObject()) { auto xTextAPI(getAnnotationData()->mxAnnotation->getTextApiObject()); diff --git a/svx/source/unodraw/unoshape.cxx b/svx/source/unodraw/unoshape.cxx index 2a412c6f6f59..61f59f2b8863 100644 --- a/svx/source/unodraw/unoshape.cxx +++ b/svx/source/unodraw/unoshape.cxx @@ -2341,26 +2341,27 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertyMapEn } case OWN_ATTR_TEXTFITTOSIZE_FONT_SCALE: - { - double fScale = 0.0; - if (rValue >>= fScale) - { - SdrTextFitToSizeTypeItem aItem(pSdrObject->GetMergedItem(SDRATTR_TEXT_FITTOSIZE)); - aItem.setFontScale(fScale / 100.0); - pSdrObject->SetMergedItem(aItem); - return true; - } - break; - } - case OWN_ATTR_TEXTFITTOSIZE_SPACING_SCALE: { double fScale = 0.0; if (rValue >>= fScale) { - SdrTextFitToSizeTypeItem aItem(pSdrObject->GetMergedItem(SDRATTR_TEXT_FITTOSIZE)); - aItem.setSpacingScale(fScale / 100.0); - pSdrObject->SetMergedItem(aItem); + // A multi-property call may already hold the fit item to apply at the end. + std::optional& rCollected = mpImpl->moItemSet; + const bool bCollected = mbIsMultiPropertyCall && rCollected + && rCollected->GetItemState(SDRATTR_TEXT_FITTOSIZE) + == SfxItemState::SET; + SdrTextFitToSizeTypeItem aItem( + bCollected ? rCollected->Get(SDRATTR_TEXT_FITTOSIZE) + : pSdrObject->GetMergedItem(SDRATTR_TEXT_FITTOSIZE)); + if (pProperty->nWID == OWN_ATTR_TEXTFITTOSIZE_FONT_SCALE) + aItem.setFontScale(fScale / 100.0); + else + aItem.setSpacingScale(fScale / 100.0); + if (bCollected) + rCollected->Put(aItem); + else + pSdrObject->SetMergedItem(aItem); return true; } break;