diff options
author | Caolán McNamara <caolanm@redhat.com> | 2017-10-16 11:08:47 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2017-10-16 16:42:53 +0200 |
commit | 035751dd33550def4a269a01eaae74fcaf8f5ecc (patch) | |
tree | 47370859a0ced85fc772bbc19ad48049aca3be63 /vcl/source | |
parent | f2410ad4d0f1e93c7f12ee51da9e1a1a90f0f5a4 (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>
Diffstat (limited to 'vcl/source')
-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 2c1a6bff4f6b..ad70291b08be 100644 --- a/vcl/source/gdi/bitmap.cxx +++ b/vcl/source/gdi/bitmap.cxx @@ -1137,7 +1137,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 ) @@ -1150,12 +1149,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 ) ); @@ -1166,11 +1164,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 ); @@ -1189,11 +1186,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 ) ); @@ -1204,10 +1201,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 ); @@ -1217,12 +1214,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 ); |