From eab043fd0dea1332165e5f57f4d7fd8ed0422398 Mon Sep 17 00:00:00 2001 From: tpearson Date: Thu, 25 Aug 2011 20:08:02 +0000 Subject: Fix lack of system tray icon transparency when parent application utilizes ARGB visuals git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1249526 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kdeui/ksystemtray.cpp | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) (limited to 'kdeui/ksystemtray.cpp') diff --git a/kdeui/ksystemtray.cpp b/kdeui/ksystemtray.cpp index 5374c49f8..c1cea624a 100644 --- a/kdeui/ksystemtray.cpp +++ b/kdeui/ksystemtray.cpp @@ -39,6 +39,7 @@ #include #include +#include class KSystemTrayPrivate { @@ -326,12 +327,37 @@ TQPixmap KSystemTray::loadSizedIcon( const TQString &icon, int iconWidth, KInsta void KSystemTray::setPixmap( const TQPixmap& p ) { - TQPixmap iconPixmapToSet = p; - if (TQPaintDevice::x11AppDepth() == 32) iconPixmapToSet.convertFromImage(KImageEffect::convertToPremultipliedAlpha( iconPixmapToSet.convertToImage() )); - if (TQPaintDevice::x11AppDepth() == 32) setBackgroundMode( NoBackground ); - TQLabel::setPixmap( iconPixmapToSet ); + TQPixmap iconPixmapToSet = p; + if (TQPaintDevice::x11AppDepth() == 32) { + // Since full ARGB visuals are in use, we must handle the three primary data + // channel types (color, alpha, and mask) separately. + // First, make the actual color and internal alpha of the icon is correct + TQImage correctedImage = KImageEffect::convertToPremultipliedAlpha( iconPixmapToSet.convertToImage() ); + iconPixmapToSet.convertFromImage(correctedImage); + // Next, handle the mask channel to make sure that the transparent + // sections remain transparent when drawn on the screen + TQBitmap maskBitmap; + // Generate the mask utilizing ONLY the pixels that are fully opaque + TQImage newMaskImage = correctedImage; + int w = newMaskImage.width(); + int h = newMaskImage.height(); + for (int y = 0; y < h; ++y) { + TQRgb *ls = (TQRgb *)newMaskImage.scanLine( y ); + for (int x = 0; x < w; ++x) { + TQRgb l = ls[x]; + int r = int( tqRed( l ) ); + int g = int( tqGreen( l ) ); + int b = int( tqBlue( l ) ); + int a = int( (tqAlpha( l ) == 255) ? 255 : 0 ); + ls[x] = tqRgba( r, g, b, a ); + } + } + maskBitmap.convertFromImage(newMaskImage.createAlphaMask()); + setMask(maskBitmap); + } + TQLabel::setPixmap( iconPixmapToSet ); #ifdef Q_WS_X11 - KWin::setIcons( winId(), iconPixmapToSet, TQPixmap()); + KWin::setIcons( winId(), iconPixmapToSet, TQPixmap()); #endif } -- cgit v1.2.1