summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2011-08-15 08:41:49 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2011-08-15 08:41:49 +0000
commit9a0fbb0a9655eff64fa2c2004dbf8f9d7a96b5b3 (patch)
tree10db24688050b256b5edf97020df6b92a593f8ad
parente436bd2166d6af00e96dc9a254bc4abac7f1eccf (diff)
downloadtdelibs-9a0fbb0a.tar.gz
tdelibs-9a0fbb0a.zip
Added convertToPremultipliedAlpha() to KImageEffect
Fixed "glowing icons" when 32 bit ARGB visuals are in use git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1247329 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
-rw-r--r--kdecore/kiconloader.cpp5
-rw-r--r--kdefx/kimageeffect.cpp37
-rw-r--r--kdefx/kimageeffect.h10
3 files changed, 51 insertions, 1 deletions
diff --git a/kdecore/kiconloader.cpp b/kdecore/kiconloader.cpp
index bd1ad3a91..62950e5d8 100644
--- a/kdecore/kiconloader.cpp
+++ b/kdecore/kiconloader.cpp
@@ -51,6 +51,8 @@
#include "svgicons/ksvgiconpainter.h"
#endif
+#include <kimageeffect.h>
+
#include "kiconloader_p.h"
/*** KIconThemeNode: A node in the icon theme dependancy tree. ***/
@@ -855,7 +857,8 @@ TQPixmap KIconLoader::loadIcon(const TQString& _name, KIcon::Group group, int si
}
}
- pix.convertFromImage(*img);
+ if (TQPaintDevice::x11AppDepth() == 32) pix.convertFromImage(KImageEffect::convertToPremultipliedAlpha( *img ));
+ else pix.convertFromImage(*img);
delete img;
diff --git a/kdefx/kimageeffect.cpp b/kdefx/kimageeffect.cpp
index 4864bdfa6..8fac1f5cb 100644
--- a/kdefx/kimageeffect.cpp
+++ b/kdefx/kimageeffect.cpp
@@ -4937,3 +4937,40 @@ TQImage KImageEffect::bumpmap(TQImage &img, TQImage &map, double azimuth, double
}
return dst;
}
+
+/**
+ * Convert an image with standard alpha to premultiplied alpha
+ *
+ * @param img the image you want convert
+ *
+ * @return The destination image (dst) containing the result.
+ * @author Timothy Pearson <kb9vqf@pearsoncomputing.net>
+ */
+TQImage KImageEffect::convertToPremultipliedAlpha(TQImage input) {
+ TQImage alphaImage = input;
+ if (!alphaImage.isNull()) alphaImage = alphaImage.convertDepth( 32 );
+
+ int w = alphaImage.width();
+ int h = alphaImage.height();
+
+ register int r;
+ register int g;
+ register int b;
+ register int a;
+ register float alpha_adjust;
+ register TQRgb l;
+ TQRgb *ls;
+ for (int y = 0; y < h; ++y) {
+ ls = (TQRgb *)alphaImage.scanLine( y );
+ for (int x = 0; x < w; ++x) {
+ l = ls[x];
+ alpha_adjust = (tqAlpha( l )/255.0);
+ r = int( tqRed( l ) * alpha_adjust );
+ g = int( tqGreen( l ) * alpha_adjust );
+ b = int( tqBlue( l ) * alpha_adjust );
+ a = int( tqAlpha( l ) * 1.0 );
+ ls[x] = tqRgba( r, g, b, a );
+ }
+ }
+ return alphaImage;
+} \ No newline at end of file
diff --git a/kdefx/kimageeffect.h b/kdefx/kimageeffect.h
index 155df71b1..8d73e5bfb 100644
--- a/kdefx/kimageeffect.h
+++ b/kdefx/kimageeffect.h
@@ -773,6 +773,16 @@ public:
int ambient, bool compensate, bool invert,
BumpmapType type, bool tiled);
+ /**
+ * Convert an image with standard alpha to premultiplied alpha
+ *
+ * @param img the image you want convert
+ *
+ * @return The destination image (dst) containing the result.
+ * @author Timothy Pearson <kb9vqf@pearsoncomputing.net>
+ */
+ static TQImage convertToPremultipliedAlpha(TQImage input);
+
private:
/**