From 6c042848b688f64b3c56d65dd9dc5fe85412660a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Vajngerl?= Date: Fri, 5 May 2023 15:34:38 +0900 Subject: [PATCH] Change text auto-fit alg. to also increase the scaling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When in edit mode, the text can be deleted, so the text box size can become smaller, but the auto-fit algorithm didn't take into account. In this case we already have the font and spacing scaling already set to a specific value and we need to find a scaling value where the margin is the smallest. This change also adds a test for the issue. Change-Id: I6c52f06dfbf5a1e582f7b31aceabf4736498ee90 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151412 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl --- editeng/source/editeng/editeng.cxx | 16 +++ include/editeng/editeng.hxx | 5 +- sd/CppunitTest_sd_textfitting_tests.mk | 79 +++++++++++++ sd/Module_sd.mk | 1 + sd/qa/unit/TextFittingTest.cxx | 154 +++++++++++++++++++++++++ sd/qa/unit/data/TextFitting.odp | Bin 0 -> 12191 bytes svx/source/svdraw/svdotext.cxx | 20 +++- 7 files changed, 272 insertions(+), 3 deletions(-) create mode 100644 sd/CppunitTest_sd_textfitting_tests.mk create mode 100644 sd/qa/unit/TextFittingTest.cxx create mode 100644 sd/qa/unit/data/TextFitting.odp diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx index 5b70a2c2288b..d263363253e1 100644 --- a/editeng/source/editeng/editeng.cxx +++ b/editeng/source/editeng/editeng.cxx @@ -2275,11 +2275,27 @@ void EditEngine::getGlobalSpacingScale(double& rX, double& rY) const pImpEditEngine->getSpacingScale(rX, rY); } +basegfx::B2DTuple EditEngine::getGlobalSpacingScale() const +{ + double x = 0.0; + double y = 0.0; + pImpEditEngine->getSpacingScale(x, y); + return {x, y}; +} + void EditEngine::getGlobalFontScale(double& rX, double& rY) const { pImpEditEngine->getFontScale(rX, rY); } +basegfx::B2DTuple EditEngine::getGlobalFontScale() const +{ + double x = 0.0; + double y = 0.0; + pImpEditEngine->getFontScale(x, y); + return {x, y}; +} + void EditEngine::setRoundFontSizeToPt(bool bRound) const { pImpEditEngine->setRoundToNearestPt(bRound); diff --git a/include/editeng/editeng.hxx b/include/editeng/editeng.hxx index b3d67c1c472e..b31b77160ad5 100644 --- a/include/editeng/editeng.hxx +++ b/include/editeng/editeng.hxx @@ -16,7 +16,7 @@ * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -// MyEDITENG, due to exported EditEng + #ifndef INCLUDED_EDITENG_EDITENG_HXX #define INCLUDED_EDITENG_EDITENG_HXX @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -418,7 +419,9 @@ public: void setGlobalScale(double fFontScaleX, double fFontScaleY, double fSpacingScaleX, double fSpacingScaleY); void getGlobalSpacingScale(double& rX, double& rY) const; + basegfx::B2DTuple getGlobalSpacingScale() const; void getGlobalFontScale(double& rX, double& rY) const; + basegfx::B2DTuple getGlobalFontScale() const; void setRoundFontSizeToPt(bool bRound) const; diff --git a/sd/CppunitTest_sd_textfitting_tests.mk b/sd/CppunitTest_sd_textfitting_tests.mk new file mode 100644 index 000000000000..20e302d86793 --- /dev/null +++ b/sd/CppunitTest_sd_textfitting_tests.mk @@ -0,0 +1,79 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sd_textfitting_tests)) + +$(eval $(call gb_CppunitTest_use_externals,sd_textfitting_tests,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_textfitting_tests)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sd_textfitting_tests, \ + sd/qa/unit/TextFittingTest \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sd_textfitting_tests, \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + for \ + forui \ + i18nlangtag \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sd \ + sfx \ + sot \ + subsequenttest \ + svl \ + svt \ + svx \ + svxcore \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_set_include,sd_textfitting_tests,\ + -I$(SRCDIR)/sd/source/ui/inc \ + -I$(SRCDIR)/sd/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sd_textfitting_tests)) +$(eval $(call gb_CppunitTest_use_ure,sd_textfitting_tests)) +$(eval $(call gb_CppunitTest_use_vcl,sd_textfitting_tests)) +$(eval $(call gb_CppunitTest_use_rdb,sd_textfitting_tests,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,sd_textfitting_tests,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,sd_textfitting_tests)) + +$(eval $(call gb_CppunitTest_add_arguments,sd_textfitting_tests, \ + -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sd/Module_sd.mk b/sd/Module_sd.mk index 93cf5e0dc6e8..9b7736a41a5f 100644 --- a/sd/Module_sd.mk +++ b/sd/Module_sd.mk @@ -49,6 +49,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,sd,\ CppunitTest_sd_filter_eppt \ CppunitTest_sd_shape_import_export_tests \ CppunitTest_sd_a11y \ + CppunitTest_sd_textfitting_tests \ )) endif diff --git a/sd/qa/unit/TextFittingTest.cxx b/sd/qa/unit/TextFittingTest.cxx new file mode 100644 index 000000000000..5cbe8a6b9c69 --- /dev/null +++ b/sd/qa/unit/TextFittingTest.cxx @@ -0,0 +1,154 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include "sdmodeltestbase.hxx" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace css; + +class TextFittingTest : public SdModelTestBase +{ +public: + TextFittingTest() + : SdModelTestBase("/sd/qa/unit/data/") + { + } +}; + +CPPUNIT_TEST_FIXTURE(TextFittingTest, testTest) +{ + createSdImpressDoc("TextFitting.odp"); + + SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXImpressDocument); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pPage = pViewShell->GetActualPage(); + auto pTextObject = DynCastSdrTextObj(pPage->GetObj(0)); + CPPUNIT_ASSERT(pTextObject); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(100.0, pTextObject->GetFontScale(), 1E-2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(100.0, pTextObject->GetSpacingScale(), 1E-2); + + { + OutlinerParaObject* pOutlinerParagraphObject = pTextObject->GetOutlinerParaObject(); + const EditTextObject& aEdit = pOutlinerParagraphObject->GetTextObject(); + CPPUNIT_ASSERT_EQUAL(OUString(u"D1"), aEdit.GetText(0)); + CPPUNIT_ASSERT_EQUAL(OUString(u"D2"), aEdit.GetText(1)); + CPPUNIT_ASSERT_EQUAL(OUString(u"D3"), aEdit.GetText(2)); + } + + sd::ViewShell* pViewShell1 = pXImpressDocument->GetDocShell()->GetViewShell(); + SdrView* pView1 = pViewShell1->GetView(); + Scheduler::ProcessEventsToIdle(); + pView1->SdrBeginTextEdit(pTextObject); + CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit()); + + auto* pOLV = pView1->GetTextEditOutlinerView(); + CPPUNIT_ASSERT(pOLV); + auto& rEditView = pOLV->GetEditView(); + auto* pEditEngine = rEditView.GetEditEngine(); + CPPUNIT_ASSERT(pEditEngine); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), pEditEngine->GetParagraphCount()); + + // Add paragraph 4 + rEditView.SetSelection(ESelection(3, 0, 3, 0)); + rEditView.InsertText(u"\nD4"); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pEditEngine->GetParagraphCount()); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(87.49, pEditEngine->getGlobalFontScale().getY(), 1E-2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(90.0, pEditEngine->getGlobalSpacingScale().getY(), 1E-2); + + // Add paragraph 5 + rEditView.SetSelection(ESelection(4, 0, 4, 0)); + rEditView.InsertText(u"\nD5"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pEditEngine->GetParagraphCount()); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(54.68, pEditEngine->getGlobalFontScale().getY(), 1E-2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(100.0, pEditEngine->getGlobalSpacingScale().getY(), 1E-2); + + // Add paragraph 6 + rEditView.SetSelection(ESelection(5, 0, 5, 0)); + rEditView.InsertText(u"\nD6"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), pEditEngine->GetParagraphCount()); + + // Delete paragraph 6 + rEditView.SetSelection(ESelection(4, EE_TEXTPOS_MAX_COUNT, 5, EE_TEXTPOS_MAX_COUNT)); + rEditView.DeleteSelected(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pEditEngine->GetParagraphCount()); + + // Delete paragraph 5 + rEditView.SetSelection(ESelection(3, EE_TEXTPOS_MAX_COUNT, 4, EE_TEXTPOS_MAX_COUNT)); + rEditView.DeleteSelected(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pEditEngine->GetParagraphCount()); + + // Delete paragraph 4 + rEditView.SetSelection(ESelection(2, EE_TEXTPOS_MAX_COUNT, 3, EE_TEXTPOS_MAX_COUNT)); + rEditView.DeleteSelected(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), pEditEngine->GetParagraphCount()); + + // not ideal - scaling should be 100%, but close enough + CPPUNIT_ASSERT_DOUBLES_EQUAL(99.05, pEditEngine->getGlobalFontScale().getY(), 1E-2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(100.0, pEditEngine->getGlobalSpacingScale().getY(), 1E-2); + + // are we still in text edit mode? + CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit()); + pView1->SdrEndTextEdit(); + CPPUNIT_ASSERT_EQUAL(false, pView1->IsTextEdit()); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(100.0, pTextObject->GetFontScale(), 1E-2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(100.0, pTextObject->GetSpacingScale(), 1E-2); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/qa/unit/data/TextFitting.odp b/sd/qa/unit/data/TextFitting.odp new file mode 100644 index 0000000000000000000000000000000000000000..1d4d4fd7ef65c9c5f9ea31754d58cc95e73353c7 GIT binary patch literal 12191 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 b+x=BZ7UDH32fRk3$N;+6G?hNx&%6Hyy2q@% literal 0 HcmV?d00001 diff --git a/svx/source/svdraw/svdotext.cxx b/svx/source/svdraw/svdotext.cxx index f2951787b551..a27e112d85cb 100644 --- a/svx/source/svdraw/svdotext.cxx +++ b/svx/source/svdraw/svdotext.cxx @@ -1303,7 +1303,11 @@ void SdrTextObj::autoFitTextForCompatibility(SdrOutliner& rOutliner, const Size& else fCurrentFitFactor = double(rTextBoxSize.Height()) / aCurrentTextBoxSize.Height(); - if (fCurrentFitFactor >= 1.0) + double fInitialFontScaleY = 0.0; + double fInitialSpacing = 0.0; + rOutliner.getGlobalScale(o3tl::temporary(double()), fInitialFontScaleY, o3tl::temporary(double()), fInitialSpacing); + + if (fCurrentFitFactor >= 1.0 && fInitialFontScaleY >= 100.0 && fInitialSpacing >= 100.0) return; sal_Int32 nFontHeight = GetObjectItemSet().Get(EE_CHAR_FONTHEIGHT).GetHeight(); @@ -1313,9 +1317,21 @@ void SdrTextObj::autoFitTextForCompatibility(SdrOutliner& rOutliner, const Size& double fMaxY = fMaxScale; double fBestFontScale = 0.0; - double fBestSpacing = fMaxScale; + double fBestSpacing = 100.0; double fBestFitFactor = fCurrentFitFactor; + if (fCurrentFitFactor >= 1.0) + { + fMinY = fInitialFontScaleY; + fBestFontScale = fInitialFontScaleY; + fBestSpacing = fInitialSpacing; + fBestFitFactor = fCurrentFitFactor; + } + else + { + fMaxY = std::min(fInitialFontScaleY, fMaxScale); + } + double fInTheMidle = 0.5; int iteration = 0;