diff options
author | Caolán McNamara <caolanm@redhat.com> | 2017-03-12 17:37:05 +0000 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2017-03-21 15:51:03 +0000 |
commit | 820b921230f5a56b327e178f6d8f65edc66e24a8 (patch) | |
tree | c4e6efa77c09236adc007005a234e8a96fbc96bf /filter | |
parent | 2f0e14de089b9da350444bddb5baf6ba9baac338 (diff) |
ofz#829 ensure palette can fulfil largest index used
Change-Id: I95aa4796875ee71e8b06a2bb8985845f270b8817
Reviewed-on: https://gerrit.libreoffice.org/35105
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Michael Stahl <mstahl@redhat.com>
Diffstat (limited to 'filter')
-rw-r--r-- | filter/source/graphicfilter/itiff/itiff.cxx | 65 |
1 files changed, 40 insertions, 25 deletions
diff --git a/filter/source/graphicfilter/itiff/itiff.cxx b/filter/source/graphicfilter/itiff/itiff.cxx index f744baf91fc6..41807c739df3 100644 --- a/filter/source/graphicfilter/itiff/itiff.cxx +++ b/filter/source/graphicfilter/itiff/itiff.cxx @@ -53,6 +53,7 @@ private: Bitmap aBitmap; BitmapWriteAccess* pAcc; sal_uInt16 nDstBitsPerPixel; + int nLargestPixelIndex; AlphaMask* pAlphaMask; BitmapWriteAccess* pMaskAcc; @@ -121,6 +122,9 @@ private: // converts a Scanline to the Windows-BMP format bool HasAlphaChannel() const; + + void SetPixelIndex(BitmapWriteAccess *pAcc, long nY, long nX, sal_uInt8 cIndex); + public: TIFFReader() @@ -129,6 +133,7 @@ public: , pTIFF(nullptr) , pAcc(nullptr) , nDstBitsPerPixel(0) + , nLargestPixelIndex(-1) , pAlphaMask(nullptr) , pMaskAcc(nullptr) , nOrigPos(0) @@ -785,6 +790,11 @@ sal_uLong TIFFReader::GetBits( const sal_uInt8 * pSrc, sal_uLong nBitsPos, sal_u return nRes; } +void TIFFReader::SetPixelIndex(BitmapWriteAccess *pWriteAcc, long nY, long nX, sal_uInt8 cIndex) +{ + pWriteAcc->SetPixelIndex(nY, nX, cIndex); + nLargestPixelIndex = std::max<int>(nLargestPixelIndex, cIndex); +} bool TIFFReader::ConvertScanline(sal_Int32 nY) { @@ -947,7 +957,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY) for (sal_Int32 nx = 0; nx < nImageWidth; ++nx) { nLast += nx == 0 ? BYTESWAP( (sal_uInt8)*pt++ ) : *pt++; - pAcc->SetPixelIndex( nY, nx, nLast ); + SetPixelIndex(pAcc, nY, nx, nLast); } } else @@ -955,7 +965,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY) for (sal_Int32 nx = 0; nx < nImageWidth; ++nx) { sal_uInt8 nLast = *pt++; - pAcc->SetPixelIndex( nY, nx, static_cast<sal_uInt8>( (BYTESWAP((sal_uLong)nLast) - nMinSampleValue) * nMinMax ) ); + SetPixelIndex(pAcc, nY, nx, static_cast<sal_uInt8>( (BYTESWAP((sal_uLong)nLast) - nMinSampleValue) * nMinMax )); } } } @@ -967,15 +977,14 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY) for (sal_Int32 nx = 0; nx < nImageWidth; ++nx) { nLast += *pt++; - pAcc->SetPixelIndex( nY, nx, nLast ); + SetPixelIndex(pAcc, nY, nx, nLast); } } else { for (sal_Int32 nx = 0; nx < nImageWidth; ++nx) { - pAcc->SetPixelIndex( nY, nx, static_cast<sal_uInt8>( ((sal_uLong)*pt++ - nMinSampleValue) * nMinMax ) ); - + SetPixelIndex(pAcc, nY, nx, static_cast<sal_uInt8>( ((sal_uLong)*pt++ - nMinSampleValue) * nMinMax )); } } } @@ -992,7 +1001,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY) for (sal_Int32 nx = 0; nx < nImageWidth; ++nx) { nVal = ( GetBits( pt, nx * nBitsPerSample, nBitsPerSample ) - nMinSampleValue ) * nMinMax; - pAcc->SetPixelIndex( nY, nx, static_cast<sal_uInt8>(nVal)); + SetPixelIndex(pAcc, nY, nx, static_cast<sal_uInt8>(nVal)); } } break; @@ -1013,28 +1022,28 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY) while (nByteCount--) { nByteVal = *pt++; - pAcc->SetPixelIndex( nY, nx++, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, nx++, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, nx++, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, nx++, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, nx++, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, nx++, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, nx++, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, nx++, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, nx++, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, nx++, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, nx++, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, nx++, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, nx++, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, nx++, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, nx++, nByteVal ); + SetPixelIndex(pAcc, nY, nx++, nByteVal); } if ( nImageWidth & 7 ) { nByteVal = *pt++; while ( nx < nImageWidth ) { - pAcc->SetPixelIndex( nY, nx++, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, nx++, nByteVal & 1); nByteVal >>= 1; } } @@ -1045,21 +1054,21 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY) while (nByteCount--) { nByteVal = *pt++; - pAcc->SetPixelIndex( nY, nx, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, nx, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, --nx, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, --nx, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, --nx, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, --nx, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, --nx, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, --nx, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, --nx, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, --nx, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, --nx, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, --nx, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, --nx, nByteVal & 1 ); + SetPixelIndex(pAcc, nY, --nx, nByteVal & 1); nByteVal >>= 1; - pAcc->SetPixelIndex( nY, --nx, nByteVal ); + SetPixelIndex(pAcc, nY, --nx, nByteVal); nx += 15; } if ( nImageWidth & 7 ) @@ -1069,7 +1078,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY) nShift = 7; while ( nx < nImageWidth ) { - pAcc->SetPixelIndex( nY, nx++, ( nByteVal >> nShift ) & 1); + SetPixelIndex(pAcc, nY, nx++, ( nByteVal >> nShift ) & 1); } } } @@ -1090,7 +1099,7 @@ bool TIFFReader::ConvertScanline(sal_Int32 nY) sal_uInt8* pt = pMap[ 0 ]; for (sal_Int32 nx = 0; nx < nImageWidth; nx++, pt += 2 ) { - pAcc->SetPixelIndex( nY, nx, static_cast<sal_uInt8>( ((sal_uLong)*pt - nMinSampleValue) * nMinMax) ); + SetPixelIndex(pAcc, nY, nx, static_cast<sal_uInt8>( ((sal_uLong)*pt - nMinSampleValue) * nMinMax)); } } } @@ -1112,6 +1121,11 @@ void TIFFReader::MakePalCol() nNumColors = (sal_uLong)1 << nBitsPerSample; if ( nNumColors > 256 ) nNumColors = 256; + if (nLargestPixelIndex >= static_cast<int>(nNumColors)) + { + SAL_WARN("filter.tiff", "palette has less entries that largest index used. Expanding palette to match"); + nNumColors = nLargestPixelIndex + 1; + } pAcc->SetPaletteEntryCount( (sal_uInt16)nNumColors ); for ( i = 0; i < nNumColors; i++ ) { @@ -1343,6 +1357,7 @@ bool TIFFReader::ReadTIFF(SvStream & rTIFF, Graphic & rGraphic ) bStatus = false; if ( bStatus ) { + nLargestPixelIndex = -1; if ( nMaxSampleValue == 0 ) { if ( nBitsPerSample == 32 ) // sj: i93300, compiler bug, 1 << 32 gives 1 one 32bit windows platforms, |