tdf#115297: alternative fix for displaying 1bit images

Previous fixes for 1bit monochrome / paletted images produced some
regressions, so here is attempt to fix problem at the root.

Partially reverted 66dbd4da3afcadb1393daf9be9cecff71b86509a and
fixed in a different way without tdf#115297, tdf#114726 and related.

Change-Id: I6849ed5ac41770ba905c930065c80e58509dba2e
Reviewed-on: https://gerrit.libreoffice.org/50454
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx
index a532ce7..bc89f4b 100644
--- a/vcl/headless/svpgdi.cxx
+++ b/vcl/headless/svpgdi.cxx
@@ -1200,10 +1200,33 @@ void SvpSalGraphics::copyBits( const SalTwoRect& rTR,
        cairo_surface_destroy(pCopy);
}

namespace
{
    bool isBlackWhite(const SalBitmap& rBitmap)
    {
        const SvpSalBitmap& rSrcBmp = static_cast<const SvpSalBitmap&>(rBitmap);
        const BitmapBuffer * pSourceBuffer = rSrcBmp.GetBuffer();
        const BitmapPalette & rPalette = pSourceBuffer->maPalette;

        return (
            rPalette.GetEntryCount() < 2 ||

            (rPalette.GetEntryCount() == 2 &&
            rPalette[0] == Color(COL_BLACK) &&
            rPalette[1] == Color(COL_WHITE) ) ||

            (rPalette.GetEntryCount() == 2 &&
            rPalette[1] == Color(COL_BLACK) &&
            rPalette[0] == Color(COL_WHITE) )
            );
    }
}

void SvpSalGraphics::drawBitmap(const SalTwoRect& rTR, const SalBitmap& rSourceBitmap)
{
    if (rSourceBitmap.GetBitCount() == 1)
    if (rSourceBitmap.GetBitCount() == 1 && isBlackWhite(rSourceBitmap))
    {
        // This way we draw only monochrome b/w bitmaps
        MaskHelper aMask(rSourceBitmap);
        cairo_surface_t* source = aMask.getMask();
        copySource(rTR, source);
diff --git a/vcl/source/gdi/pngread.cxx b/vcl/source/gdi/pngread.cxx
index 7e66748..49844f0 100644
--- a/vcl/source/gdi/pngread.cxx
+++ b/vcl/source/gdi/pngread.cxx
@@ -535,19 +535,11 @@ bool PNGReaderImpl::ImplReadHeader( const Size& rPreviewSizeHint )
        {
            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 :
                    mnTargetDepth = 4;  // we have to expand the bitmap
                    mbPalette = false;
                    break;
                case 1 :
                case 4 :
                case 8 :
                    mbPalette = false;