[Libreoffice-commits] core.git: filter/source
Caolán McNamara
caolanm at redhat.com
Mon Jan 29 14:22:57 UTC 2018
filter/source/graphicfilter/itiff/itiff.cxx | 67 ++++++++++++++--------------
1 file changed, 35 insertions(+), 32 deletions(-)
New commits:
commit daa254b71e8df81b9de1207c7fc99f73682e9447
Author: Caolán McNamara <caolanm at redhat.com>
Date: Mon Jan 29 10:29:42 2018 +0000
ofz#2977 speed up tiff import
10 secs to 4 secs
Change-Id: I5460b174c580176c9f16ca608abf21bd4aa77656
Reviewed-on: https://gerrit.libreoffice.org/48822
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
Tested-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/filter/source/graphicfilter/itiff/itiff.cxx b/filter/source/graphicfilter/itiff/itiff.cxx
index c2086aa2023b..ed80d69dc72a 100644
--- a/filter/source/graphicfilter/itiff/itiff.cxx
+++ b/filter/source/graphicfilter/itiff/itiff.cxx
@@ -124,7 +124,7 @@ private:
bool HasAlphaChannel() const;
- void SetPixelIndex(BitmapWriteAccess *pAcc, long nY, long nX, sal_uInt8 cIndex);
+ void SetPixelOnData(BitmapWriteAccess *pWriteAcc, sal_uInt8* pData, long nX, sal_uInt8 cIndex);
public:
@@ -768,9 +768,9 @@ sal_uInt32 TIFFReader::GetBits( const sal_uInt8 * pSrc, sal_uInt32 nBitsPos, sal
return nRes;
}
-void TIFFReader::SetPixelIndex(BitmapWriteAccess *pWriteAcc, long nY, long nX, sal_uInt8 cIndex)
+void TIFFReader::SetPixelOnData(BitmapWriteAccess *pWriteAcc, sal_uInt8* pData, long nX, sal_uInt8 cIndex)
{
- pWriteAcc->SetPixelIndex(nY, nX, cIndex);
+ pWriteAcc->SetPixelOnData(pData, nX, BitmapColor(cIndex));
nLargestPixelIndex = std::max<int>(nLargestPixelIndex, cIndex);
}
@@ -779,6 +779,9 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
sal_uInt32 nRed, nGreen, nBlue, ns, nVal;
sal_uInt8 nByteVal;
+ BitmapWriteAccess* pAcc = xAcc.get();
+ Scanline pScanLine = pAcc->GetScanline(nY);
+
if ( nDstBitsPerPixel == 24 )
{
if ( nBitsPerSample == 8 && nSamplesPerPixel >= 3 &&
@@ -798,7 +801,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
nLRed = nLRed + pt[ 0 ];
nLGreen = nLGreen + pt[ 1 ];
nLBlue = nLBlue + pt[ 2 ];
- xAcc->SetPixel( nY, nx, Color( nLRed, nLGreen, nLBlue ) );
+ pAcc->SetPixel( nY, nx, Color( nLRed, nLGreen, nLBlue ) );
if (nSamplesPerPixel >= 4 && xMaskAcc)
{
nLAlpha = nLAlpha + pt[ 3 ];
@@ -810,7 +813,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
{
for (sal_Int32 nx = 0; nx < nImageWidth; nx++, pt += nSamplesPerPixel)
{
- xAcc->SetPixel( nY, nx, Color( pt[0], pt[1], pt[2] ) );
+ pAcc->SetPixel( nY, nx, Color( pt[0], pt[1], pt[2] ) );
if (nSamplesPerPixel >= 4 && xMaskAcc)
{
sal_uInt8 nAlpha = pt[3];
@@ -838,7 +841,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
nGreen = GetBits( getMapData(1), nx * nBitsPerSample, nBitsPerSample );
nBlue = GetBits( getMapData(2), nx * nBitsPerSample, nBitsPerSample );
}
- xAcc->SetPixel( nY, nx, Color( static_cast<sal_uInt8>( nRed - nMinMax ), static_cast<sal_uInt8>( nGreen - nMinMax ), static_cast<sal_uInt8>(nBlue - nMinMax) ) );
+ pAcc->SetPixel( nY, nx, Color( static_cast<sal_uInt8>( nRed - nMinMax ), static_cast<sal_uInt8>( nGreen - nMinMax ), static_cast<sal_uInt8>(nBlue - nMinMax) ) );
}
}
}
@@ -864,7 +867,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
nRed = 255 - static_cast<sal_uInt8>( nRed - nMinMax );
nGreen = 255 - static_cast<sal_uInt8>( nGreen - nMinMax );
nBlue = 255 - static_cast<sal_uInt8>( nBlue - nMinMax );
- xAcc->SetPixel( nY, nx, Color( static_cast<sal_uInt8>(nRed), static_cast<sal_uInt8>(nGreen), static_cast<sal_uInt8>(nBlue) ) );
+ pAcc->SetPixel( nY, nx, Color( static_cast<sal_uInt8>(nRed), static_cast<sal_uInt8>(nGreen), static_cast<sal_uInt8>(nBlue) ) );
}
}
}
@@ -906,7 +909,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
255L/static_cast<sal_Int32>(nMaxSampleValue-nMinSampleValue) ) ));
nBlue = static_cast<sal_uInt8>(std::max( 0L, 255L - ( ( static_cast<sal_Int32>(nSamp[ 2 ]) + nBlack - ( static_cast<sal_Int32>(nMinSampleValue) << 1 ) ) *
255L/static_cast<sal_Int32>(nMaxSampleValue-nMinSampleValue) ) ));
- xAcc->SetPixel( nY, nx, Color ( static_cast<sal_uInt8>(nRed), static_cast<sal_uInt8>(nGreen), static_cast<sal_uInt8>(nBlue) ) );
+ pAcc->SetPixel( nY, nx, Color ( static_cast<sal_uInt8>(nRed), static_cast<sal_uInt8>(nGreen), static_cast<sal_uInt8>(nBlue) ) );
}
}
}
@@ -935,7 +938,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
for (sal_Int32 nx = 0; nx < nImageWidth; ++nx)
{
nLast += nx == 0 ? BYTESWAP( *pt++ ) : *pt++;
- SetPixelIndex(xAcc.get(), nY, nx, nLast);
+ SetPixelOnData(pAcc, pScanLine, nx, nLast);
}
}
else
@@ -943,7 +946,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
for (sal_Int32 nx = 0; nx < nImageWidth; ++nx)
{
sal_uInt8 nLast = *pt++;
- SetPixelIndex(xAcc.get(), nY, nx, static_cast<sal_uInt8>( (BYTESWAP(static_cast<sal_uInt32>(nLast)) - nMinSampleValue) * nMinMax ));
+ SetPixelOnData(pAcc, pScanLine, nx, static_cast<sal_uInt8>( (BYTESWAP(static_cast<sal_uInt32>(nLast)) - nMinSampleValue) * nMinMax ));
}
}
}
@@ -955,14 +958,14 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
for (sal_Int32 nx = 0; nx < nImageWidth; ++nx)
{
nLast += *pt++;
- SetPixelIndex(xAcc.get(), nY, nx, nLast);
+ SetPixelOnData(pAcc, pScanLine, nx, nLast);
}
}
else
{
for (sal_Int32 nx = 0; nx < nImageWidth; ++nx)
{
- SetPixelIndex(xAcc.get(), nY, nx, static_cast<sal_uInt8>( (static_cast<sal_uInt32>(*pt++) - nMinSampleValue) * nMinMax ));
+ SetPixelOnData(pAcc, pScanLine, nx, static_cast<sal_uInt8>( (static_cast<sal_uInt32>(*pt++) - nMinSampleValue) * nMinMax ));
}
}
}
@@ -979,7 +982,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
for (sal_Int32 nx = 0; nx < nImageWidth; ++nx)
{
nVal = ( GetBits( pt, nx * nBitsPerSample, nBitsPerSample ) - nMinSampleValue ) * nMinMax;
- SetPixelIndex(xAcc.get(), nY, nx, static_cast<sal_uInt8>(nVal));
+ SetPixelOnData(pAcc, pScanLine, nx, static_cast<sal_uInt8>(nVal));
}
}
break;
@@ -1000,28 +1003,28 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
while (nByteCount--)
{
nByteVal = *pt++;
- SetPixelIndex(xAcc.get(), nY, nx++, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, nx++, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, nx++, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, nx++, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, nx++, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, nx++, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, nx++, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, nx++, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, nx++, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, nx++, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, nx++, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, nx++, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, nx++, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, nx++, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, nx++, nByteVal);
+ SetPixelOnData(pAcc, pScanLine, nx++, nByteVal);
}
if ( nImageWidth & 7 )
{
nByteVal = *pt++;
while ( nx < nImageWidth )
{
- SetPixelIndex(xAcc.get(), nY, nx++, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, nx++, nByteVal & 1);
nByteVal >>= 1;
}
}
@@ -1032,21 +1035,21 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
while (nByteCount--)
{
nByteVal = *pt++;
- SetPixelIndex(xAcc.get(), nY, nx, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, nx, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, --nx, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, --nx, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, --nx, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, --nx, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, --nx, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, --nx, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, --nx, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, --nx, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, --nx, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, --nx, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, --nx, nByteVal & 1);
+ SetPixelOnData(pAcc, pScanLine, --nx, nByteVal & 1);
nByteVal >>= 1;
- SetPixelIndex(xAcc.get(), nY, --nx, nByteVal);
+ SetPixelOnData(pAcc, pScanLine, --nx, nByteVal);
nx += 15;
}
if ( nImageWidth & 7 )
@@ -1056,7 +1059,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
nShift = 7;
while ( nx < nImageWidth )
{
- SetPixelIndex(xAcc.get(), nY, nx++, ( nByteVal >> nShift ) & 1);
+ SetPixelOnData(pAcc, pScanLine, nx++, ( nByteVal >> nShift ) & 1);
}
}
}
@@ -1077,7 +1080,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY)
sal_uInt8* pt = getMapData(0);
for (sal_Int32 nx = 0; nx < nImageWidth; nx++, pt += 2 )
{
- SetPixelIndex(xAcc.get(), nY, nx, static_cast<sal_uInt8>( (static_cast<sal_uInt32>(*pt) - nMinSampleValue) * nMinMax));
+ SetPixelOnData(pAcc, pScanLine, nx, static_cast<sal_uInt8>( (static_cast<sal_uInt32>(*pt) - nMinSampleValue) * nMinMax));
}
}
}
More information about the Libreoffice-commits
mailing list