diff options
Diffstat (limited to 'editeng')
-rw-r--r-- | editeng/qa/unit/core-test.cxx | 64 | ||||
-rw-r--r-- | editeng/source/editeng/impedit3.cxx | 2 |
2 files changed, 66 insertions, 0 deletions
diff --git a/editeng/qa/unit/core-test.cxx b/editeng/qa/unit/core-test.cxx index e40d5f0bf4c9..75e19df6028d 100644 --- a/editeng/qa/unit/core-test.cxx +++ b/editeng/qa/unit/core-test.cxx @@ -18,6 +18,7 @@ #include <sfx2/app.hxx> #include <svl/itempool.hxx> +#include <editeng/adjustitem.hxx> #include <editeng/editeng.hxx> #include <editeng/eeitem.hxx> #include <editeng/lspcitem.hxx> @@ -123,6 +124,7 @@ public: void testMoveParagraph(); void testCreateLines(); void testTdf154248MultilineFieldWrapping(); + void testTdf151748StaleKashidaArray(); DECL_STATIC_LINK( Test, CalcFieldValueHdl, EditFieldInfo*, void ); @@ -154,6 +156,7 @@ public: CPPUNIT_TEST(testMoveParagraph); CPPUNIT_TEST(testCreateLines); CPPUNIT_TEST(testTdf154248MultilineFieldWrapping); + CPPUNIT_TEST(testTdf151748StaleKashidaArray); CPPUNIT_TEST_SUITE_END(); private: @@ -2293,6 +2296,67 @@ void Test::testTdf154248MultilineFieldWrapping() } } +void Test::testTdf151748StaleKashidaArray() +{ + ScopedVclPtrInstance<VirtualDevice> pVirtualDevice(DeviceFormat::WITHOUT_ALPHA); + + EditEngine aEditEngine(mpItemPool.get()); + aEditEngine.SetRefDevice(pVirtualDevice.get()); + aEditEngine.SetPaperSize(Size(1500, 500)); + aEditEngine.SetDefaultHorizontalTextDirection(EEHorizontalTextDirection::R2L); + aEditEngine.SetText(u"خط تخوردگی و توسط"_ustr); + + CPPUNIT_ASSERT_EQUAL(true, aEditEngine.IsFormatted()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aEditEngine.GetParagraphCount()); + + SfxItemSet aSet{ aEditEngine.GetParaAttribs(0) }; + aSet.Put(SvxAdjustItem{ SvxAdjust::Block, EE_PARA_JUST }); + aEditEngine.SetParaAttribs(0, aSet); + + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Block, aEditEngine.GetParaAttrib(0, EE_PARA_JUST).GetAdjust()); + CPPUNIT_ASSERT_EQUAL(true, aEditEngine.IsFormatted()); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), aEditEngine.GetLineCount(0)); + + // Initial state: Check that a kashida array has been created + { + ParaPortionList& rParagraphPortionList = aEditEngine.GetParaPortions(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rParagraphPortionList.Count()); + + EditLineList& rLines = rParagraphPortionList.getRef(0).GetLines(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), rLines.Count()); + EditLine const& rLine = rLines[0]; + + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), rLine.GetStart()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(11), rLine.GetEnd()); + + std::vector<sal_Bool> const& rArray = rLine.GetKashidaArray(); + CPPUNIT_ASSERT_EQUAL(size_t(17), rArray.size()); + } + + // Resize the paper so there is no longer room for kashida + aEditEngine.SetPaperSize(Size(1400, 500)); + + // Follow-up state: Check that the kashida array has been cleared + { + ParaPortionList& rParagraphPortionList = aEditEngine.GetParaPortions(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rParagraphPortionList.Count()); + + EditLineList& rLines = rParagraphPortionList.getRef(0).GetLines(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), rLines.Count()); + EditLine const& rLine = rLines[0]; + + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), rLine.GetStart()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(11), rLine.GetEnd()); + + std::vector<sal_Bool> const& rArray = rLine.GetKashidaArray(); + + // Since there is no room for kashida, the kashida array should be empty. + // Without the bug fix, this will be 17: + CPPUNIT_ASSERT_EQUAL(size_t(0), rArray.size()); + } +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); } diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx index 8d6abb99920b..408964373c48 100644 --- a/editeng/source/editeng/impedit3.cxx +++ b/editeng/source/editeng/impedit3.cxx @@ -2367,6 +2367,8 @@ void ImpEditEngine::ImpAdjustBlocks(ParaPortion& rParaPortion, EditLine& rLine, // Mark Kashida positions, so that VCL knows where to insert Kashida and // where to only expand the width. + // The underlying array may be reused across updates. Ensure there is no stale data. + rLine.GetKashidaArray().clear(); if (nKashidas) { rLine.GetKashidaArray().resize(rLine.GetCharPosArray().size(), false); |