diff options
-rw-r--r-- | include/vcl/outdev.hxx | 2 | ||||
-rw-r--r-- | vcl/source/gdi/pdfwriter_impl.cxx | 2 | ||||
-rw-r--r-- | vcl/source/outdev/text.cxx | 13 |
3 files changed, 12 insertions, 5 deletions
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx index ce988ab60719..eb3f6acf7096 100644 --- a/include/vcl/outdev.hxx +++ b/include/vcl/outdev.hxx @@ -1082,7 +1082,7 @@ protected: SAL_DLLPRIVATE void ImplInitTextLineSize(); SAL_DLLPRIVATE void ImplInitAboveTextLineSize(); static - SAL_DLLPRIVATE tools::Long ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, tools::Long nWidth, const OUString& rStr, DrawTextFlags nStyle, const vcl::ITextLayout& _rLayout ); + SAL_DLLPRIVATE tools::Long ImplGetTextLines( const tools::Rectangle& rRect, tools::Long nTextHeight, ImplMultiTextLineInfo& rLineInfo, tools::Long nWidth, const OUString& rStr, DrawTextFlags nStyle, const vcl::ITextLayout& _rLayout ); static SAL_DLLPRIVATE sal_Int32 ImplBreakLinesWithIterator(const tools::Long nWidth, const OUString& rStr, const vcl::ITextLayout& _rLayout, const css::uno::Reference<css::linguistic2::XHyphenator>& xHyph, diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx index 45e2a844da18..a342cba1854d 100644 --- a/vcl/source/gdi/pdfwriter_impl.cxx +++ b/vcl/source/gdi/pdfwriter_impl.cxx @@ -6571,7 +6571,7 @@ void PDFWriterImpl::drawText( const tools::Rectangle& rRect, const OUString& rOr { vcl::DefaultTextLayout aLayout( *this ); OUString aLastLine; - OutputDevice::ImplGetTextLines( aMultiLineInfo, nWidth, aStr, nStyle, aLayout ); + OutputDevice::ImplGetTextLines( rRect, nTextHeight, aMultiLineInfo, nWidth, aStr, nStyle, aLayout ); sal_Int32 nLines = nHeight/nTextHeight; nFormatLines = aMultiLineInfo.Count(); if ( !nLines ) diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx index 58e0b0e6a8b9..ed3eefba56e2 100644 --- a/vcl/source/outdev/text.cxx +++ b/vcl/source/outdev/text.cxx @@ -478,7 +478,8 @@ void OutputDevice::ImplDrawText( SalLayout& rSalLayout ) ImplDrawTextDirect( rSalLayout, mbTextLines ); } -tools::Long OutputDevice::ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, +tools::Long OutputDevice::ImplGetTextLines( const tools::Rectangle& rRect, const tools::Long nTextHeight, + ImplMultiTextLineInfo& rLineInfo, tools::Long nWidth, const OUString& rStr, DrawTextFlags nStyle, const vcl::ITextLayout& _rLayout ) { @@ -491,6 +492,8 @@ tools::Long OutputDevice::ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, if (rStr.isEmpty()) return 0; + const bool bClipping = (nStyle & DrawTextFlags::Clip) && !(nStyle & DrawTextFlags::EndEllipsis); + tools::Long nMaxLineWidth = 0; const bool bHyphenate = (nStyle & DrawTextFlags::WordBreakHyphenation) == DrawTextFlags::WordBreakHyphenation; css::uno::Reference< css::linguistic2::XHyphenator > xHyph; @@ -505,6 +508,7 @@ tools::Long OutputDevice::ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, css::uno::Reference<css::i18n::XBreakIterator> xBI; sal_Int32 nPos = 0; sal_Int32 nLen = rStr.getLength(); + sal_Int32 nCurrentTextY = 0; while ( nPos < nLen ) { sal_Int32 nBreakPos = nPos; @@ -541,6 +545,9 @@ tools::Long OutputDevice::ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, if ( ( nPos < nLen ) && ( rStr[ nPos ] == '\n' ) && ( rStr[ nPos-1 ] == '\r' ) ) nPos++; } + nCurrentTextY += nTextHeight; + if (bClipping && nCurrentTextY > rRect.GetHeight()) + break; } #ifdef DBG_UTIL @@ -1528,7 +1535,7 @@ void OutputDevice::ImplDrawText( OutputDevice& rTargetDevice, const tools::Recta if ( nTextHeight ) { - tools::Long nMaxTextWidth = ImplGetTextLines( aMultiLineInfo, nWidth, aStr, nStyle, _rLayout ); + tools::Long nMaxTextWidth = ImplGetTextLines( rRect, nTextHeight, aMultiLineInfo, nWidth, aStr, nStyle, _rLayout ); sal_Int32 nLines = static_cast<sal_Int32>(nHeight/nTextHeight); OUString aLastLine; nFormatLines = aMultiLineInfo.Count(); @@ -1814,7 +1821,7 @@ tools::Rectangle OutputDevice::GetTextRect( const tools::Rectangle& rRect, nMaxWidth = 0; vcl::DefaultTextLayout aDefaultLayout( *const_cast< OutputDevice* >( this ) ); - ImplGetTextLines( aMultiLineInfo, nWidth, aStr, nStyle, _pTextLayout ? *_pTextLayout : aDefaultLayout ); + ImplGetTextLines( rRect, nTextHeight, aMultiLineInfo, nWidth, aStr, nStyle, _pTextLayout ? *_pTextLayout : aDefaultLayout ); nFormatLines = aMultiLineInfo.Count(); if ( !nTextHeight ) nTextHeight = 1; |