diff options
author | Caolán McNamara <caolanm@redhat.com> | 2017-10-16 11:08:47 +0100 |
---|---|---|
committer | Ashod Nakashian <ashod.nakashian@collabora.co.uk> | 2017-12-05 08:19:28 -0500 |
commit | 4912f1c16b73cb40e8c473da60317598fcc55d5a (patch) | |
tree | fceafa06accf35f7fdd6acad44e8bb3d2dfbd134 /vcl | |
parent | f5b16fc3aa7540759e6e959dbf664dd83d2f87e4 (diff) |
ofz: optimize 1bit mask to avoid timeout
Change-Id: Ieaf3eb0800d2e80f16cfa29718d752e43ad534d0
Reviewed-on: https://gerrit.libreoffice.org/43418
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
(cherry picked from commit 035751dd33550def4a269a01eaae74fcaf8f5ecc)
Reviewed-on: https://gerrit.libreoffice.org/45457
Reviewed-by: Ashod Nakashian <ashnakash@gmail.com>
Tested-by: Ashod Nakashian <ashnakash@gmail.com>
(cherry picked from commit ac5ecfeb5dd8578ca37876b6e0b23911d7cdae1c)
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/gdi/bitmap.cxx | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/vcl/source/gdi/bitmap.cxx b/vcl/source/gdi/bitmap.cxx index e7490fb846f8..b29d94f6d4d9 100644 --- a/vcl/source/gdi/bitmap.cxx +++ b/vcl/source/gdi/bitmap.cxx @@ -1144,7 +1144,6 @@ Bitmap Bitmap::CreateMask( const Color& rTransColor, sal_uLong nTol ) const if( !nTol ) { const BitmapColor aTest( pReadAcc->GetBestMatchingColor( rTransColor ) ); - long nX, nY; if( pReadAcc->GetScanlineFormat() == ScanlineFormat::N4BitMsnPal || pReadAcc->GetScanlineFormat() == ScanlineFormat::N4BitLsnPal ) @@ -1157,12 +1156,11 @@ Bitmap Bitmap::CreateMask( const Color& rTransColor, sal_uLong nTol ) const aWhite.GetIndex() == 1 ) { // optimized for 1Bit-MSB destination palette - for( nY = 0; nY < nHeight; nY++ ) + for (long nY = 0; nY < nHeight; ++nY) { Scanline pSrc = pReadAcc->GetScanline( nY ); Scanline pDst = pWriteAcc->GetScanline( nY ); - long nShift = 0; - for( nX = 0, nShift = nShiftInit; nX < nWidth; nX++, nShift ^= 4 ) + for (long nX = 0, nShift = nShiftInit; nX < nWidth; nX++, nShift ^= 4) { if( cTest == ( ( pSrc[ nX >> 1 ] >> nShift ) & 0x0f ) ) pDst[ nX >> 3 ] |= 1 << ( 7 - ( nX & 7 ) ); @@ -1173,11 +1171,10 @@ Bitmap Bitmap::CreateMask( const Color& rTransColor, sal_uLong nTol ) const } else { - for( nY = 0; nY < nHeight; nY++ ) + for (long nY = 0; nY < nHeight; ++nY) { Scanline pSrc = pReadAcc->GetScanline( nY ); - long nShift = 0; - for( nX = 0, nShift = nShiftInit; nX < nWidth; nX++, nShift ^= 4 ) + for (long nX = 0, nShift = nShiftInit; nX < nWidth; nX++, nShift ^= 4) { if( cTest == ( ( pSrc[ nX >> 1 ] >> nShift ) & 0x0f ) ) pWriteAcc->SetPixel( nY, nX, aWhite ); @@ -1196,11 +1193,11 @@ Bitmap Bitmap::CreateMask( const Color& rTransColor, sal_uLong nTol ) const aWhite.GetIndex() == 1 ) { // optimized for 1Bit-MSB destination palette - for( nY = 0; nY < nHeight; nY++ ) + for (long nY = 0; nY < nHeight; ++nY) { Scanline pSrc = pReadAcc->GetScanline( nY ); Scanline pDst = pWriteAcc->GetScanline( nY ); - for( nX = 0; nX < nWidth; nX++ ) + for (long nX = 0; nX < nWidth; ++nX) { if( cTest == pSrc[ nX ] ) pDst[ nX >> 3 ] |= 1 << ( 7 - ( nX & 7 ) ); @@ -1211,10 +1208,10 @@ Bitmap Bitmap::CreateMask( const Color& rTransColor, sal_uLong nTol ) const } else { - for( nY = 0; nY < nHeight; nY++ ) + for (long nY = 0; nY < nHeight; ++nY) { Scanline pSrc = pReadAcc->GetScanline( nY ); - for( nX = 0; nX < nWidth; nX++ ) + for (long nX = 0; nX < nWidth; ++nX) { if( cTest == pSrc[ nX ] ) pWriteAcc->SetPixel( nY, nX, aWhite ); @@ -1224,12 +1221,25 @@ Bitmap Bitmap::CreateMask( const Color& rTransColor, sal_uLong nTol ) const } } } + else if (pWriteAcc->GetScanlineFormat() == pReadAcc->GetScanlineFormat() && aWhite.GetIndex() == 1 && + (pReadAcc->GetScanlineFormat() == ScanlineFormat::N1BitLsbPal || pReadAcc->GetScanlineFormat() == ScanlineFormat::N1BitMsbPal)) + { + for (long nY = 0; nY < nHeight; ++nY) + { + Scanline pSrc = pReadAcc->GetScanline(nY); + Scanline pDst = pWriteAcc->GetScanline(nY); + assert(pWriteAcc->GetScanlineSize() == pReadAcc->GetScanlineSize()); + const long nScanlineSize = pWriteAcc->GetScanlineSize(); + for (long nX = 0; nX < nScanlineSize; ++nX) + pDst[nX] = ~pSrc[nX]; + } + } else { // not optimized - for( nY = 0; nY < nHeight; nY++ ) + for (long nY = 0; nY < nHeight; ++nY) { - for( nX = 0; nX < nWidth; nX++ ) + for (long nX = 0; nX < nWidth; ++nX) { if( aTest == pReadAcc->GetPixel( nY, nX ) ) pWriteAcc->SetPixel( nY, nX, aWhite ); |