Fix up the system tray to handle embedded windows with a different X11 depth than the tray itself

This truly and finally fixes system tray icon transparency when the parent application uses ARGB visuals
Part 1/2


git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1249644 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
v3.5.13-sru
tpearson 13 years ago
parent 2944cdf050
commit 7a65dcc2ed

@ -329,31 +329,8 @@ void KSystemTray::setPixmap( const TQPixmap& p )
{
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

Loading…
Cancel
Save