summaryrefslogtreecommitdiff
path: root/editeng
diff options
context:
space:
mode:
Diffstat (limited to 'editeng')
-rw-r--r--editeng/qa/unit/core-test.cxx64
-rw-r--r--editeng/source/editeng/impedit3.cxx2
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);