From c1df0c41b602ac144fdde4efcf546549443afa86 Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Thu, 26 Jun 2014 21:06:35 +0100 Subject: Resolves: fdo#80160 PNG with 1-bit colormap only show black and white Change-Id: If0c9950c18e6091fafea47954a4654db436a3a44 (cherry picked from commit 986c0451d05e7bb6ff7edd9f27d0e45532bcd22c) --- vcl/unx/generic/gdi/salgdi2.cxx | 50 ++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/vcl/unx/generic/gdi/salgdi2.cxx b/vcl/unx/generic/gdi/salgdi2.cxx index ef76996c8c27..be722c5429de 100644 --- a/vcl/unx/generic/gdi/salgdi2.cxx +++ b/vcl/unx/generic/gdi/salgdi2.cxx @@ -440,6 +440,32 @@ void X11SalGraphics::copyArea ( long nDestX, long nDestY, copyBits ( aPosAry, 0 ); } +namespace +{ + void setForeBack(XGCValues& rValues, const SalColormap& rColMap, const SalBitmap& rSalBitmap) + { + rValues.foreground = rColMap.GetWhitePixel(); + rValues.background = rColMap.GetBlackPixel(); + + //fdo#33455 and fdo#80160 handle 1 bit depth pngs with palette entries + //to set fore/back colors + SalBitmap& rBitmap = const_cast(rSalBitmap); + if (const BitmapBuffer* pBitmapBuffer = rBitmap.AcquireBuffer(true)) + { + const BitmapPalette& rPalette = pBitmapBuffer->maPalette; + if (rPalette.GetEntryCount() == 2) + { + const BitmapColor aWhite(rPalette[rPalette.GetBestIndex(Color(COL_WHITE))]); + rValues.foreground = rColMap.GetPixel(ImplColorToSal(aWhite)); + + const BitmapColor aBlack(rPalette[rPalette.GetBestIndex(Color(COL_BLACK))]); + rValues.background = rColMap.GetPixel(ImplColorToSal(aBlack)); + } + rBitmap.ReleaseBuffer(pBitmapBuffer, true); + } + } +} + void X11SalGraphics::drawBitmap( const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap ) { const SalDisplay* pSalDisp = GetDisplay(); @@ -455,24 +481,7 @@ void X11SalGraphics::drawBitmap( const SalTwoRect& rPosAry, const SalBitmap& rSa { // set foreground/background values for 1Bit bitmaps XGetGCValues( pXDisp, aGC, nValues, &aOldVal ); - - aNewVal.foreground = rColMap.GetWhitePixel(); - aNewVal.background = rColMap.GetBlackPixel(); - - //fdo#33455 handle 1 bit depth pngs with palette entries - //to set fore/back colors - if (const BitmapBuffer* pBitmapBuffer = const_cast(rSalBitmap).AcquireBuffer(true)) - { - const BitmapPalette& rPalette = pBitmapBuffer->maPalette; - if (rPalette.GetEntryCount() == 2) - { - const BitmapColor aBlack( rPalette[rPalette.GetBestIndex( Color( COL_BLACK ) )] ); - const BitmapColor aWhite( rPalette[rPalette.GetBestIndex( Color( COL_WHITE ) )] ); - aNewVal.foreground = rColMap.GetPixel(ImplColorToSal(aWhite)); - aNewVal.background = rColMap.GetPixel(ImplColorToSal(aBlack)); - } - } - + setForeBack(aNewVal, rColMap, rSalBitmap); XChangeGC( pXDisp, aGC, nValues, &aNewVal ); } @@ -525,13 +534,12 @@ void X11SalGraphics::drawMaskedBitmap( const SalTwoRect& rPosAry, { GC aTmpGC; XGCValues aValues; - const SalColormap& rColMap = pSalDisp->GetColormap( m_nXScreen ); - const int nBlack = rColMap.GetBlackPixel(), nWhite = rColMap.GetWhitePixel(); + setForeBack(aValues, pSalDisp->GetColormap(m_nXScreen), rSalBitmap); const int nValues = GCFunction | GCForeground | GCBackground; SalTwoRect aTmpRect( rPosAry ); aTmpRect.mnDestX = aTmpRect.mnDestY = 0; // draw paint bitmap in pixmap #1 - aValues.function = GXcopy, aValues.foreground = nWhite, aValues.background = nBlack; + aValues.function = GXcopy; aTmpGC = XCreateGC( pXDisp, aFG, nValues, &aValues ); static_cast(rSalBitmap).ImplDraw( aFG, m_nXScreen, nDepth, aTmpRect, aTmpGC ); DBG_TESTTRANS( aFG ); -- cgit v1.2.3