Kaydet (Commit) 600fbb77 authored tarafından Miklos Vajna's avatar Miklos Vajna Kaydeden (comit) Luboš Luňák

tdf#122767 sc opengl: fix rendering artifacts after hiding a cell comment

Actually this is not specific to opengl, affects e.g. the Linux gen
backend as well, it just doesn't happen with the Windows gdi backend.

The rendering of the caption itself was OK. Focusing on the arrow
polygon at the end of the comment's "tail" (connector polyline):

- What gets painted is determined by SdrCaptionObj ->
  ViewContactOfSdrCaptionObj::createViewIndependentPrimitive2DSequence(),
  which produces a PolyPolygonColorPrimitive2D, which is then processed by
  VclPixelProcessor2D::tryDrawPolyPolygonColorPrimitive2DDirect().

- The polygon passed to VCL there is within the bounds of the
  invalidation rectangle set in ScNoteMarker::TimeHdl().

So it seems the only reason sometimes these 1px rendering artifacts are
left around is anti-aliasing. Fix those by simply extending the
invalidation rectangle in each direction.

(cherry picked from commit 37aa4f0d)

Change-Id: I37b8e666999d3ff5ee1328fca7ac017ee8c7e9e0
Reviewed-on: https://gerrit.libreoffice.org/70585
Tested-by: Jenkins
Reviewed-by: 's avatarLuboš Luňák <l.lunak@collabora.com>
üst c96949f1
...@@ -172,21 +172,30 @@ void ScNoteMarker::InvalidateWin() ...@@ -172,21 +172,30 @@ void ScNoteMarker::InvalidateWin()
{ {
if (m_bVisible) if (m_bVisible)
{ {
m_pWindow->Invalidate( OutputDevice::LogicToLogic(m_aRect, m_aMapMode, m_pWindow->GetMapMode()) ); // Extend the invalidated rectangle by 1 pixel in each direction in case AA would slightly
// paint outside the nominal area.
tools::Rectangle aRect(m_aRect);
const Size aPixelSize = m_pWindow->PixelToLogic(Size(1, 1));
aRect.AdjustLeft(-aPixelSize.getWidth());
aRect.AdjustTop(-aPixelSize.getHeight());
aRect.AdjustRight(aPixelSize.getWidth());
aRect.AdjustBottom(aPixelSize.getHeight());
m_pWindow->Invalidate( OutputDevice::LogicToLogic(aRect, m_aMapMode, m_pWindow->GetMapMode()) );
if ( m_pRightWin || m_pBottomWin ) if ( m_pRightWin || m_pBottomWin )
{ {
Size aWinSize = m_pWindow->PixelToLogic( m_pWindow->GetOutputSizePixel(), m_aMapMode ); Size aWinSize = m_pWindow->PixelToLogic( m_pWindow->GetOutputSizePixel(), m_aMapMode );
if ( m_pRightWin ) if ( m_pRightWin )
m_pRightWin->Invalidate( OutputDevice::LogicToLogic(m_aRect, m_pRightWin->Invalidate( OutputDevice::LogicToLogic(aRect,
lcl_MoveMapMode( m_aMapMode, Size( aWinSize.Width(), 0 ) ), lcl_MoveMapMode( m_aMapMode, Size( aWinSize.Width(), 0 ) ),
m_pRightWin->GetMapMode()) ); m_pRightWin->GetMapMode()) );
if ( m_pBottomWin ) if ( m_pBottomWin )
m_pBottomWin->Invalidate( OutputDevice::LogicToLogic(m_aRect, m_pBottomWin->Invalidate( OutputDevice::LogicToLogic(aRect,
lcl_MoveMapMode( m_aMapMode, Size( 0, aWinSize.Height() ) ), lcl_MoveMapMode( m_aMapMode, Size( 0, aWinSize.Height() ) ),
m_pBottomWin->GetMapMode()) ); m_pBottomWin->GetMapMode()) );
if ( m_pDiagWin ) if ( m_pDiagWin )
m_pDiagWin->Invalidate( OutputDevice::LogicToLogic(m_aRect, m_pDiagWin->Invalidate( OutputDevice::LogicToLogic(aRect,
lcl_MoveMapMode( m_aMapMode, aWinSize ), lcl_MoveMapMode( m_aMapMode, aWinSize ),
m_pDiagWin->GetMapMode()) ); m_pDiagWin->GetMapMode()) );
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment