From 53a40c43a1ac88e761e97a2832367525ee6b0426 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Wed, 2 Sep 2015 15:40:53 +0200 Subject: tdf#93857 opengl: adapt UniscribeLayout's DrawCachedGlyphs() to FillDXArray() The problem was UniscribeLayout::DrawCachedGlyphs() counted the total advance value unconditionally from mpGlyphAdvances, while UniscribeLayout::FillDXArray() (which provides advance values to e.g. Writer) only used mpGlyphAdvances in case of NULL mpJustifications. Fix this by first checking mpJustifications in UniscribeLayout::DrawCachedGlyphs(), too. With this, e.g. typing "x" in Writer 10 times will not result in a "misplaced" cursor caret. Change-Id: I16c7a258ff77b25c5121b9b974e72ad6efe5e9fc --- vcl/win/source/gdi/winlayout.cxx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx index f7bc83b051cc..6fc12454e9d8 100644 --- a/vcl/win/source/gdi/winlayout.cxx +++ b/vcl/win/source/gdi/winlayout.cxx @@ -1736,6 +1736,12 @@ bool UniscribeLayout::DrawCachedGlyphs(SalGraphics& rGraphics) const Point aPos = GetDrawPosition( aRelPos ); int nAdvance = 0; + + // This has to be in sync with UniscribeLayout::FillDXArray(), so that + // actual and reported glyph positions (used for e.g. cursor caret + // positioning) match. + const int* pGlyphWidths = mpJustifications ? mpJustifications : mpGlyphAdvances; + for (int i = nMinGlyphPos; i < nEndGlyphPos; i++) { assert(mrWinFontEntry.GlyphIsCached(mpOutGlyphs[i])); @@ -1759,7 +1765,7 @@ bool UniscribeLayout::DrawCachedGlyphs(SalGraphics& rGraphics) const rChunk.maLocation[n].getWidth(), rChunk.maLocation[n].getHeight()); // ??? pImpl->DrawMask(*rChunk.mpTexture, salColor, a2Rects); } - nAdvance += mpGlyphAdvances[i]; + nAdvance += pGlyphWidths[i]; } } pImpl->PostDraw(); -- cgit v1.2.3