diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-09-02 15:40:53 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-09-02 15:41:31 +0200 |
commit | 53a40c43a1ac88e761e97a2832367525ee6b0426 (patch) | |
tree | 8f0b28c5490d759daa16dcf18c98717ba3b58ac6 | |
parent | cc88a88caad591270760d947848ad0a032d32bdb (diff) |
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
-rw-r--r-- | vcl/win/source/gdi/winlayout.cxx | 8 |
1 files changed, 7 insertions, 1 deletions
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(); |