From 31b35ed6bb7fe77f3f276b00fefce112a620b6ac Mon Sep 17 00:00:00 2001 From: Tsahi Glik Date: Tue, 4 Jun 2013 20:25:41 +0200 Subject: Detect copyArea trying to operate on overlapping memory. Equality test also needs to check if disjunct BitmapDevice instances might not actually share the same memory buffer. Change-Id: I09a93cb092a0039353be211ed053e991e7fe66f0 --- basebmp/source/bitmapdevice.cxx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'basebmp') diff --git a/basebmp/source/bitmapdevice.cxx b/basebmp/source/bitmapdevice.cxx index d1a19f938d07..ff017ec50e34 100644 --- a/basebmp/source/bitmapdevice.cxx +++ b/basebmp/source/bitmapdevice.cxx @@ -680,7 +680,7 @@ namespace destIterRange(begin, acc, rDstRect), - rSrcBitmap.get() == this ); + isSharedBuffer(rSrcBitmap) ); damaged( rDstRect ); } @@ -903,7 +903,7 @@ namespace Masks::clipmask_polarity, FastMask >::type(acc), rDstRect), - rSrcBitmap.get() == this); + isSharedBuffer(rSrcBitmap)); damaged( rDstRect ); } @@ -1147,6 +1147,11 @@ PaletteMemorySharedVector BitmapDevice::getPalette() const return mpImpl->mpPalette; } +bool BitmapDevice::isSharedBuffer( const BitmapDeviceSharedPtr& rOther ) const +{ + return rOther.get()->getBuffer().get() == getBuffer().get(); +} + void BitmapDevice::clear( Color fillColor ) { clear_i( fillColor, mpImpl->maBounds ); @@ -1507,7 +1512,7 @@ void BitmapDevice::drawMaskedColor( Color aSrcColor, assertImagePoint(aDestPoint,mpImpl->maBounds); assertImageRange(aSrcRange,aSrcBounds); - if( rAlphaMask.get() == this ) + if( isSharedBuffer(rAlphaMask) ) { // src == dest, copy rAlphaMask beforehand // --------------------------------------------------- @@ -1560,7 +1565,7 @@ void BitmapDevice::drawMaskedColor( Color aSrcColor, if( isCompatibleClipMask( rClip ) ) { - if( rAlphaMask.get() == this ) + if( isSharedBuffer(rAlphaMask) ) { // src == dest, copy rAlphaMask beforehand // --------------------------------------------------- -- cgit v1.2.3