diff options
author | Noel Grandin <noelgrandin@gmail.com> | 2018-01-30 20:40:19 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-02-06 07:39:11 +0100 |
commit | 3e0efdb50cd9bcf1749993607330ea1567eb33a2 (patch) | |
tree | c740dfc9b598480d5168282154045bbc938f6862 /canvas | |
parent | f38e35338e3010f137d7b35fa3150792fabfa825 (diff) |
convert SetPixel->SetPixelOnData
by extracting out the Y scanline computation from the innermost
loop.
Inspired by commit 078d01c1b6cb9bbd80aeadc49a71cc817413164c.
Change-Id: Ic3c1827c01ed3aec629975749a551c7a68ae4a5e
Reviewed-on: https://gerrit.libreoffice.org/48926
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'canvas')
-rw-r--r-- | canvas/source/vcl/canvasbitmaphelper.cxx | 11 | ||||
-rw-r--r-- | canvas/source/vcl/canvashelper.cxx | 4 | ||||
-rw-r--r-- | canvas/source/vcl/impltools.cxx | 16 |
3 files changed, 21 insertions, 10 deletions
diff --git a/canvas/source/vcl/canvasbitmaphelper.cxx b/canvas/source/vcl/canvasbitmaphelper.cxx index f3f3995a889b..bdb4444016fd 100644 --- a/canvas/source/vcl/canvasbitmaphelper.cxx +++ b/canvas/source/vcl/canvasbitmaphelper.cxx @@ -308,17 +308,20 @@ namespace vclcanvas default: { + Scanline pScan = pWriteAccess->GetScanline( y ); + Scanline pAScan = pAlphaWriteAccess->GetScanline( y ); + for( long x=rect.X1; x<aBmpSize.Width() && x<rect.X2; ++x ) { - pWriteAccess->SetPixel( y, x, BitmapColor( data[ nCurrPos ], + pWriteAccess->SetPixelOnData( pScan, x, BitmapColor( data[ nCurrPos ], data[ nCurrPos+1 ], data[ nCurrPos+2 ] ) ); nCurrPos += 3; // cast to unsigned byte, for correct subtraction result - pAlphaWriteAccess->SetPixel( y, x, + pAlphaWriteAccess->SetPixelOnData( pAScan, x, BitmapColor( static_cast<sal_uInt8>(255 - static_cast<sal_uInt8>(data[ nCurrPos++ ])) ) ); @@ -387,11 +390,13 @@ namespace vclcanvas default: { + Scanline pScan = pWriteAccess->GetScanline( y ); + for( long x=rect.X1; x<aBmpSize.Width() && x<rect.X2; ++x ) { - pWriteAccess->SetPixel( y, x, BitmapColor( data[ nCurrPos ], + pWriteAccess->SetPixelOnData( pScan, x, BitmapColor( data[ nCurrPos ], data[ nCurrPos+1 ], data[ nCurrPos+2 ] ) ); nCurrPos += 4; // skip three colors, _plus_ alpha diff --git a/canvas/source/vcl/canvashelper.cxx b/canvas/source/vcl/canvashelper.cxx index f75f6344c575..761a2fdc22b1 100644 --- a/canvas/source/vcl/canvashelper.cxx +++ b/canvas/source/vcl/canvashelper.cxx @@ -1094,9 +1094,11 @@ namespace vclcanvas default: { + Scanline pScan = pWriteAccess->GetScanline( y ); + for( x=0; x<nWidth; ++x ) { - pWriteAccess->SetPixel( y, x, BitmapColor( data[ nCurrPos ], + pWriteAccess->SetPixelOnData( pScan, x, BitmapColor( data[ nCurrPos ], data[ nCurrPos+1 ], data[ nCurrPos+2 ] ) ); nCurrPos += 4; diff --git a/canvas/source/vcl/impltools.cxx b/canvas/source/vcl/impltools.cxx index 3abc76f8f7c7..055eb061930e 100644 --- a/canvas/source/vcl/impltools.cxx +++ b/canvas/source/vcl/impltools.cxx @@ -322,6 +322,8 @@ namespace vclcanvas // vs. multi-level transparency) if( rBitmap.IsTransparent() ) { + Scanline pScan = pWriteAccess->GetScanline( y ); + Scanline pScanAlpha = pAlphaWriteAccess->GetScanline( y ); // Handling alpha and mask just the same... for( long x=0; x<aDestBmpSize.Width(); ++x ) { @@ -333,18 +335,20 @@ namespace vclcanvas if( nSrcX < 0 || nSrcX >= aBmpSize.Width() || nSrcY < 0 || nSrcY >= aBmpSize.Height() ) { - pAlphaWriteAccess->SetPixelIndex( y, x, 255 ); + pAlphaWriteAccess->SetPixelOnData( pScanAlpha, x, BitmapColor(255) ); } else { const sal_uInt8 cAlphaIdx = pAlphaReadAccess->GetPixelIndex( nSrcY, nSrcX ); - pAlphaWriteAccess->SetPixelIndex( y, x, aAlphaMap[ cAlphaIdx ] ); - pWriteAccess->SetPixel( y, x, pReadAccess->GetPixel( nSrcY, nSrcX ) ); + pAlphaWriteAccess->SetPixelOnData( pScanAlpha, x, BitmapColor(aAlphaMap[ cAlphaIdx ]) ); + pWriteAccess->SetPixelOnData( pScan, x, pReadAccess->GetPixel( nSrcY, nSrcX ) ); } } } else { + Scanline pScan = pWriteAccess->GetScanline( y ); + Scanline pScanAlpha = pAlphaWriteAccess->GetScanline( y ); for( long x=0; x<aDestBmpSize.Width(); ++x ) { ::basegfx::B2DPoint aPoint(x,y); @@ -355,12 +359,12 @@ namespace vclcanvas if( nSrcX < 0 || nSrcX >= aBmpSize.Width() || nSrcY < 0 || nSrcY >= aBmpSize.Height() ) { - pAlphaWriteAccess->SetPixel( y, x, BitmapColor(255) ); + pAlphaWriteAccess->SetPixelOnData( pScanAlpha, x, BitmapColor(255) ); } else { - pAlphaWriteAccess->SetPixel( y, x, BitmapColor(0) ); - pWriteAccess->SetPixel( y, x, pReadAccess->GetPixel( nSrcY, + pAlphaWriteAccess->SetPixelOnData( pScanAlpha, x, BitmapColor(0) ); + pWriteAccess->SetPixelOnData( pScan, x, pReadAccess->GetPixel( nSrcY, nSrcX ) ); } } |