--- svx/inc/svx/sdr/overlay/overlaymanagerbuffered.hxx (revision 1293216) +++ svx/inc/svx/sdr/overlay/overlaymanagerbuffered.hxx (working copy) @@ -61,6 +61,10 @@ // Default is false. unsigned mbRefreshWithPreRendering : 1; + basegfx::B2IPoint mnTopLeftOffset; + basegfx::B2IPoint mnBottomRightOffset; + unsigned mbUseOffset : 1; + // link for timer DECL_LINK(ImpBufferTimerHandler, AutoTimer*); @@ -98,6 +102,8 @@ // access to RefreshWithPreRendering Flag bool DoRefreshWithPreRendering() const { return mbRefreshWithPreRendering; } void SetRefreshWithPreRendering(bool bNew); + + void SetUseOffset ( sal_Bool bUseOffset ) { mbUseOffset = bUseOffset; } }; } // end of namespace overlay } // end of namespace sdr --- svx/source/sdr/overlay/overlaymanagerbuffered.cxx (revision 1293625) +++ svx/source/sdr/overlay/overlaymanagerbuffered.cxx (working copy) @@ -40,6 +40,14 @@ { namespace overlay { + void implExpandRectangle(basegfx::B2IPoint nTopLeftOffset, basegfx::B2IPoint nBottomOffset, Rectangle& rRect) + { + rRect.Left() -= nTopLeftOffset.getX(); + rRect.Top() -= nTopLeftOffset.getY(); + rRect.Right() += nBottomOffset.getX(); + rRect.Bottom() += nBottomOffset.getY(); + } + void OverlayManagerBuffered::ImpPrepareBufferDevice() { // compare size of maBufferDevice with size of visible area @@ -91,6 +99,9 @@ const basegfx::B2IPoint aNewMaximum(maBufferRememberedRangePixel.getMaximum() + aIPointDestinationOffsetPixel); maBufferRememberedRangePixel = basegfx::B2IRange(aNewMinimum, aNewMaximum); } + + mnTopLeftOffset = basegfx::B2IPoint(0,0); + mnBottomRightOffset = basegfx::B2IPoint(0,0); } } @@ -197,6 +208,12 @@ while(aRegion.GetEnumRects(aRegionHandle, aRegionRectanglePixel)) { + if( mbUseOffset ) + { + implExpandRectangle( mnTopLeftOffset, mnBottomRightOffset, aRegionRectanglePixel); + aRegionRectanglePixel.Intersection(aBufferDeviceRectanglePixel); + } + // for each rectangle, save the area Point aTopLeft(aRegionRectanglePixel.TopLeft()); Size aSize(aRegionRectanglePixel.GetSize()); @@ -424,7 +441,10 @@ OverlayManager* pOldOverlayManager, bool bRefreshWithPreRendering) : OverlayManager(rOutputDevice, pOldOverlayManager), - mbRefreshWithPreRendering(bRefreshWithPreRendering) + mbRefreshWithPreRendering(bRefreshWithPreRendering), + mnTopLeftOffset(0, 0), + mnBottomRightOffset(0, 0), + mbUseOffset( false ) { // Init timer maBufferTimer.SetTimeout(1); @@ -480,7 +500,7 @@ void OverlayManagerBuffered::invalidateRange(const basegfx::B2DRange& rRange) { - if(!rRange.isEmpty()) + if(!rRange.isEmpty() && rRange.getWidth() !=0 && rRange.getHeight() != 0) { // buffered output, do not invalidate but use the timer // to trigger a timer event for refresh @@ -506,6 +526,9 @@ (sal_Int32)ceil(aDiscreteRange.getMaxX() + fDiscreteOne), (sal_Int32)ceil(aDiscreteRange.getMaxY() + fDiscreteOne)); + mnTopLeftOffset = basegfx::B2IPoint (floor(fDiscreteOne), floor(fDiscreteOne) ); + mnBottomRightOffset = basegfx::B2IPoint( ceil(fDiscreteOne), ceil(fDiscreteOne)); + maBufferRememberedRangePixel.expand(aTopLeft); maBufferRememberedRangePixel.expand(aBottomRight); } @@ -514,6 +537,9 @@ const basegfx::B2IPoint aTopLeft((sal_Int32)floor(aDiscreteRange.getMinX()), (sal_Int32)floor(aDiscreteRange.getMinY())); const basegfx::B2IPoint aBottomRight((sal_Int32)ceil(aDiscreteRange.getMaxX()), (sal_Int32)ceil(aDiscreteRange.getMaxY())); + mnTopLeftOffset = basegfx::B2IPoint(0,0); + mnBottomRightOffset = basegfx::B2IPoint(ceil(aDiscreteRange.getMaxX()) - floor(aDiscreteRange.getMaxX()), + ceil(aDiscreteRange.getMaxY()) - floor(aDiscreteRange.getMaxY())); maBufferRememberedRangePixel.expand(aTopLeft); maBufferRememberedRangePixel.expand(aBottomRight); } --- svx/source/svdraw/sdrpaintwindow.cxx (revision 1293216) +++ svx/source/svdraw/sdrpaintwindow.cxx (working copy) @@ -133,6 +133,11 @@ // Also hand over the evtl. existing old OverlayManager; this means to take over // the registered OverlayObjects from it mpOverlayManager = new ::sdr::overlay::OverlayManagerBuffered(GetOutputDevice(), pOldOverlayManager, true); + + // Switch from not use buffer to use buffer + // Need to save background with the offset + if(pOldOverlayManager != NULL) + ((::sdr::overlay::OverlayManagerBuffered *)mpOverlayManager)->SetUseOffset(true); } else { @@ -166,6 +171,12 @@ mpOverlayManager->setStripeLengthPixel(GetPaintView().getOptionsDrawinglayer().GetStripeLength()); } } + else + { + ::sdr::overlay::OverlayManagerBuffered *pOverlayBufferedManager = dynamic_cast< ::sdr::overlay::OverlayManagerBuffered * > (mpOverlayManager); + if(pOverlayBufferedManager) + pOverlayBufferedManager->SetUseOffset(false); + } // OverlayObjects are transfered for the evtl. newly created OverlayManager by handing over // at construction time