Kaydet (Commit) 66dbd4da authored tarafından Tor Lillqvist's avatar Tor Lillqvist

tdf#113918: Workaround: Load 1bpp indexed PNG as 8bpp indexed Bitmap

The alternative, to fix the X11 disaster area used by the gen, gtk,
and kde4 VCL plugins, seemed more difficult. Somebody else with more
time, feel free to revert and do that instead.

Change-Id: I068ea27224ba98be25e01671546137ddd70691a7
Reviewed-on: https://gerrit.libreoffice.org/44957Reviewed-by: 's avatarTor Lillqvist <tml@collabora.com>
Tested-by: 's avatarTor Lillqvist <tml@collabora.com>
üst 94c76b6d
...@@ -531,10 +531,19 @@ bool PNGReaderImpl::ImplReadHeader( const Size& rPreviewSizeHint ) ...@@ -531,10 +531,19 @@ bool PNGReaderImpl::ImplReadHeader( const Size& rPreviewSizeHint )
{ {
switch ( mnPngDepth ) switch ( mnPngDepth )
{ {
case 1 :
#if defined(UNX) && !defined(MACOSX)
// 1bpp indexed images are so badly mishandled by rest of LO on X11 that we
// don't even bother, and turn them into 8bpp indexed ones with just two palette
// entries instead.
mnTargetDepth = 8; // we have to expand the bitmap
#endif
mbPalette = false;
break;
case 2 : case 2 :
mnTargetDepth = 4; // we have to expand the bitmap mnTargetDepth = 4; // we have to expand the bitmap
SAL_FALLTHROUGH; mbPalette = false;
case 1 : break;
case 4 : case 4 :
case 8 : case 8 :
mbPalette = false; mbPalette = false;
...@@ -1327,7 +1336,7 @@ void PNGReaderImpl::ImplDrawScanline( sal_uInt32 nXStart, sal_uInt32 nXAdd ) ...@@ -1327,7 +1336,7 @@ void PNGReaderImpl::ImplDrawScanline( sal_uInt32 nXStart, sal_uInt32 nXAdd )
} }
else // neither alpha nor transparency else // neither alpha nor transparency
{ {
if ( mnPngDepth == 8 ) // maybe the source is a 16 bit grayscale if ( mnPngDepth == 8 ) // maybe the source is a 16 bit grayscale or 1 bit indexed
{ {
if( nXAdd == 1 && mnPreviewShift == 0 ) // copy raw line data if possible if( nXAdd == 1 && mnPreviewShift == 0 ) // copy raw line data if possible
{ {
...@@ -1342,6 +1351,22 @@ void PNGReaderImpl::ImplDrawScanline( sal_uInt32 nXStart, sal_uInt32 nXAdd ) ...@@ -1342,6 +1351,22 @@ void PNGReaderImpl::ImplDrawScanline( sal_uInt32 nXStart, sal_uInt32 nXAdd )
ImplSetPixel( nY, nX, *pTmp++ ); ImplSetPixel( nY, nX, *pTmp++ );
} }
} }
else if (mnPngDepth == 1 )
{
for ( long nX = nXStart, nShift = 0; nX < maOrigSize.Width(); nX += nXAdd )
{
nShift = (nShift - 1) & 7;
sal_uInt8 nCol;
if ( nShift == 0 )
nCol = *(pTmp++);
else
nCol = static_cast<sal_uInt8>( *pTmp >> nShift );
nCol &= 1;
ImplSetPixel( nY, nX, nCol );
}
}
else else
{ {
for ( long nX = nXStart; nX < maOrigSize.Width(); nX += nXAdd, pTmp += 2 ) for ( long nX = nXStart; nX < maOrigSize.Width(); nX += nXAdd, pTmp += 2 )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment