vcl/quartz/ctlayout.cxx | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-)
New commits: commit 4adebd56d21cf104dca28a62c7015466a7a0c357 Author: Herbert Dürr <h...@apache.org> Date: Tue May 20 12:00:50 2014 +0000 Resolves: #i124935# fix expanded/condensed text breaking... in the CoreText engine the concept of an extra-width per code-unit was obsolete at least since apps supported unicode with its different normalization forms, diacritical marks, surrogate-pairs, non-printing characters such as ZWJ/ZWNJ/RLM, etc. so of course modern engines like CoreText don't aid this typographical crime. The fix here extends the CTLayout::GetTextBreak() method to handle the obsolete semantic of per code-unit extra-widths by successively approximating the number of involved code-units. (cherry picked from commit a9b9ceff86f35be1eeff5f251d24e338db760a1e) Conflicts: vcl/aqua/source/gdi/ctlayout.cxx Change-Id: I52a7f7488a9e8a303ed7271df2a24a3c85098ce3 (cherry picked from commit 687f0c9300d499b78deea2890b4c2019adb2d67d) Reviewed-on: https://gerrit.libreoffice.org/9627 Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> Tested-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> diff --git a/vcl/quartz/ctlayout.cxx b/vcl/quartz/ctlayout.cxx index 1d96f90..f0cdc8a 100644 --- a/vcl/quartz/ctlayout.cxx +++ b/vcl/quartz/ctlayout.cxx @@ -569,20 +569,39 @@ long CTLayout::FillDXArray( sal_Int32* pDXArray ) const return nPixWidth; } -sal_Int32 CTLayout::GetTextBreak( long nMaxWidth, long /*nCharExtra*/, int nFactor ) const +sal_Int32 CTLayout::GetTextBreak( long nMaxWidth, long nCharExtra, int nFactor ) const { if( !mpCTLine ) return -1; CTTypesetterRef aCTTypeSetter = CTTypesetterCreateWithAttributedString( mpAttrString ); - const double fCTMaxWidth = (double)nMaxWidth / nFactor; - CFIndex nIndex = CTTypesetterSuggestClusterBreak( aCTTypeSetter, 0, fCTMaxWidth ); - CFRelease( aCTTypeSetter ); - - if( nIndex >= mnCharCount ) - return -1; + CFIndex nBestGuess = (nCharExtra >= 0) ? 0 : mnCharCount; + for( int i = 1; i <= mnCharCount; i *= 2 ) + { + // guess the target width considering char-extra expansion/condensation + const double nTargetWidth = nMaxWidth - nBestGuess * nCharExtra; + const double fCTMaxWidth = nTargetWidth / nFactor; + // calculate the breaking index for the guessed target width + const CFIndex nNewIndex = CTTypesetterSuggestClusterBreak( aCTTypeSetter, 0, fCTMaxWidth ); + if( nNewIndex >= mnCharCount ) { + CFRelease( aCTTypeSetter ); + return -1; + } + // check if the original extra-width guess was good + if( !nCharExtra ) + nBestGuess = nNewIndex; + if( nBestGuess == nNewIndex ) + break; + // prepare another round for a different number of characters + CFIndex nNewGuess = (nNewIndex + nBestGuess + 1) / 2; + if( nNewGuess == nBestGuess ) + nNewGuess += (nNewIndex > nBestGuess) ? +1 : -1; + nBestGuess = nNewGuess; + } - nIndex += mnMinCharPos; + // suggest the best fitting cluster break as breaking position + CFRelease( aCTTypeSetter ); + const int nIndex = nBestGuess + mnMinCharPos; return nIndex; }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits