From 3e0efdb50cd9bcf1749993607330ea1567eb33a2 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Tue, 30 Jan 2018 20:40:19 +0200 Subject: 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 Reviewed-by: Noel Grandin --- canvas/source/vcl/canvasbitmaphelper.cxx | 11 ++++++++--- canvas/source/vcl/canvashelper.cxx | 4 +++- canvas/source/vcl/impltools.cxx | 16 ++++++++++------ 3 files changed, 21 insertions(+), 10 deletions(-) (limited to 'canvas') 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; xSetPixel( 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(255 - static_cast(data[ nCurrPos++ ])) ) ); @@ -387,11 +390,13 @@ namespace vclcanvas default: { + Scanline pScan = pWriteAccess->GetScanline( y ); + for( long x=rect.X1; xSetPixel( 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; xSetPixel( 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= 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= 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 ) ); } } -- cgit