vcl/source/gdi/CommonSalLayout.cxx | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
New commits: commit c73f32dd137710ad4c322c45eb00743538dc6149 Author: Khaled Hosny <kha...@aliftype.com> AuthorDate: Sat Aug 20 15:45:49 2022 +0200 Commit: خالد حسني <kha...@aliftype.com> CommitDate: Sat Aug 20 16:32:09 2022 +0200 Fix displacement of Arabic combining marks This reverts part of: commit 5e2b7a656024b621bdeeb6efd977331191b66d9d Author: Khaled Hosny <kha...@aliftype.com> Date: Fri Aug 12 02:12:04 2022 +0200 Streamline Kashida validation logic Reverts an unnecessary change that was supposed to be a harmless simplification. Also add a warning to my future self not to try to do this again. Change-Id: I9213b6d0fb50f13fa98ed97b226f8fa1f3a807dc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138588 Tested-by: Jenkins Reviewed-by: خالد حسني <kha...@aliftype.com> diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx index 4072a47d7109..73b7e58ae43d 100644 --- a/vcl/source/gdi/CommonSalLayout.cxx +++ b/vcl/source/gdi/CommonSalLayout.cxx @@ -716,19 +716,28 @@ void GenericSalLayout::ApplyDXArray(const double* pDXArray, const sal_Bool* pKas m_GlyphItems[i].addNewWidth(nDiff); m_GlyphItems[i].adjustLinearPosX(nDelta + nDiff); + // Warning: + // If you are tempted to improve the two loops below, think again. + // Even though I wrote this code, I no longer understand how it + // works, and every time I think I finally got it, I introduce a + // bug. - Khaled + + // Adjust the X position of the rest of the glyphs in the cluster. size_t j = i; while (j > 0) { --j; - if (!(m_GlyphItems[j].IsDiacritic() || m_GlyphItems[j].IsInCluster())) + if (!m_GlyphItems[j].IsInCluster()) break; + m_GlyphItems[j].adjustLinearPosX(nDelta + nDiff); + } - if (m_GlyphItems[j].IsInCluster()) - // Adjust X position of the remainder of the cluster. - m_GlyphItems[j].adjustLinearPosX(nDelta + nDiff); - else - // Move non-spacing marks to keep attached to this cluster. - m_GlyphItems[j].adjustLinearPosX(nDiff); + // Move any non-spacing marks to keep attached to this cluster. + while (j > 0) + { + if (!m_GlyphItems[j].IsDiacritic()) + break; + m_GlyphItems[j--].adjustLinearPosX(nDiff); } // This is a Kashida insertion position, mark it. Kashida glyphs