From bb4fcc3d968367d682d6da057083378e9d171a22 Mon Sep 17 00:00:00 2001 From: Miklos Vajna <vmiklos@collabora.com> Date: Fri, 22 Mar 2019 13:51:39 +0100 Subject: Related: tdf#124109 sw: save one vcl layout call in SwFntObj::DrawText() Commit 436b829f5b904d76039db0818cff5dedf1ae89f1 (sw: save one vcl layout call in SwFntObj::DrawText(), 2018-08-16) did this unconditionally, which broke kashida justification. Re-introduce the same mechanism, but this time opt out in the kashida case to keep that working. This means that for Latin scripts we are back to 2 layout calls (instead of 3) for each keypress in Writer. Change-Id: I890f0ab04d1f5dce561f1536d7c8a6d67a639813 Reviewed-on: https://gerrit.libreoffice.org/69557 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins --- sw/source/core/txtnode/fntcache.cxx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'sw') diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx index 07889531a4ed..e749bc2bdac4 100644 --- a/sw/source/core/txtnode/fntcache.cxx +++ b/sw/source/core/txtnode/fntcache.cxx @@ -1492,6 +1492,7 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf ) long nSpaceAdd = rInf.GetSpace() / SPACING_PRECISION_FACTOR; bool bNoHalfSpace = false; + bool bCacheLayout = true; if ( rInf.GetFont() && rInf.GetLen() ) { @@ -1534,7 +1535,12 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf ) if ( pSI && pSI->CountKashida() && pSI->KashidaJustify( pKernArray.get(), pScrArray.get(), rInf.GetIdx(), rInf.GetLen(), nSpaceAdd ) != -1 ) + { nSpaceAdd = 0; + // Layout can't be reused in this case, it would lead to missing gaps in + // place of kashida. + bCacheLayout = false; + } else bNoHalfSpace = true; } @@ -1815,8 +1821,12 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf ) ? (rInf.GetIdx() ? 1 : 0) : sal_Int32(rInf.GetIdx()); aGlyphsKey = SwTextGlyphsKey{ &rInf.GetOut(), *pStr, nTmpIdx, nLen }; + if (bCacheLayout) + pGlyphs = lcl_CreateLayout(aGlyphsKey, m_aTextGlyphs[aGlyphsKey]); + else + pGlyphs = nullptr; rInf.GetOut().DrawTextArray( aTextOriginPos, *pStr, pKernArray.get(), - nTmpIdx , nLen ); + nTmpIdx , nLen, SalLayoutFlags::NONE, pGlyphs ); if (bBullet) { rInf.GetOut().Push(); -- cgit