summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2017-10-16 11:08:47 +0100
committerAshod Nakashian <ashod.nakashian@collabora.co.uk>2017-12-05 08:19:28 -0500
commit4912f1c16b73cb40e8c473da60317598fcc55d5a (patch)
treefceafa06accf35f7fdd6acad44e8bb3d2dfbd134 /vcl
parentf5b16fc3aa7540759e6e959dbf664dd83d2f87e4 (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.cxx36
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 );