summaryrefslogtreecommitdiffstats
path: root/kdecore/kiconeffect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdecore/kiconeffect.cpp')
-rw-r--r--kdecore/kiconeffect.cpp920
1 files changed, 0 insertions, 920 deletions
diff --git a/kdecore/kiconeffect.cpp b/kdecore/kiconeffect.cpp
deleted file mode 100644
index 9c76c7e4d..000000000
--- a/kdecore/kiconeffect.cpp
+++ /dev/null
@@ -1,920 +0,0 @@
-/* vi: ts=8 sts=4 sw=4
- * $Id$
- *
- * This file is part of the KDE project, module tdecore.
- * Copyright (C) 2000 Geert Jansen <jansen@kde.org>
- * with minor additions and based on ideas from
- * Torsten Rahn <torsten@kde.org>
- *
- * This is free software; it comes under the GNU Library General
- * Public License, version 2. See the file "COPYING.LIB" for the
- * exact licensing terms.
- */
-
-#include <config.h>
-#include <unistd.h>
-#include <math.h>
-
-#include <tqstring.h>
-#include <tqstringlist.h>
-#include <tqbitmap.h>
-#include <tqpixmap.h>
-#include <tqimage.h>
-#include <tqcolor.h>
-#include <tqwidget.h>
-#include <tqpainter.h>
-#include <tqpen.h>
-#include <tqapplication.h>
-#include <tqpoint.h>
-#include <tqrect.h>
-
-#include <kdebug.h>
-#include <kglobal.h>
-#include <kconfig.h>
-#include <kglobalsettings.h>
-#include <kicontheme.h>
-#include "kiconeffect.h"
-
-#if defined(Q_WS_WIN) || defined(Q_WS_MACX)
-static bool qt_use_xrender=true;
-static bool qt_has_xft=true;
-#else
-extern bool qt_use_xrender;
-extern bool qt_has_xft;
-#endif
-class KIconEffectPrivate
-{
-public:
- TQString mKey[6][3];
- TQColor mColor2[6][3];
-};
-
-KIconEffect::KIconEffect()
-{
- d = new KIconEffectPrivate;
- init();
-}
-
-KIconEffect::~KIconEffect()
-{
- delete d;
- d = 0L;
-}
-
-void KIconEffect::init()
-{
- KConfig *config = KGlobal::config();
-
- int i, j, effect=-1;
- TQStringList groups;
- groups += "Desktop";
- groups += "Toolbar";
- groups += "MainToolbar";
- groups += "Small";
- groups += "Panel";
-
- TQStringList states;
- states += "Default";
- states += "Active";
- states += "Disabled";
-
- TQStringList::ConstIterator it, it2;
- TQString _togray("togray");
- TQString _colorize("colorize");
- TQString _desaturate("desaturate");
- TQString _togamma("togamma");
- TQString _none("none");
- TQString _tomonochrome("tomonochrome");
-
- KConfigGroupSaver cs(config, "default");
-
- for (it=groups.begin(), i=0; it!=groups.end(); it++, i++)
- {
- // Default effects
- mEffect[i][0] = NoEffect;
- mEffect[i][1] = ((i==0)||(i==4)) ? ToGamma : NoEffect;
- mEffect[i][2] = ToGray;
-
- mTrans[i][0] = false;
- mTrans[i][1] = false;
- mTrans[i][2] = true;
- mValue[i][0] = 1.0;
- mValue[i][1] = ((i==0)||(i==4)) ? 0.7 : 1.0;
- mValue[i][2] = 1.0;
- mColor[i][0] = TQColor(144,128,248);
- mColor[i][1] = TQColor(169,156,255);
- mColor[i][2] = TQColor(34,202,0);
- d->mColor2[i][0] = TQColor(0,0,0);
- d->mColor2[i][1] = TQColor(0,0,0);
- d->mColor2[i][2] = TQColor(0,0,0);
-
- config->setGroup(*it + "Icons");
- for (it2=states.begin(), j=0; it2!=states.end(); it2++, j++)
- {
- TQString tmp = config->readEntry(*it2 + "Effect");
- if (tmp == _togray)
- effect = ToGray;
- else if (tmp == _colorize)
- effect = Colorize;
- else if (tmp == _desaturate)
- effect = DeSaturate;
- else if (tmp == _togamma)
- effect = ToGamma;
- else if (tmp == _tomonochrome)
- effect = ToMonochrome;
- else if (tmp == _none)
- effect = NoEffect;
- else
- continue;
- if(effect != -1)
- mEffect[i][j] = effect;
- mValue[i][j] = config->readDoubleNumEntry(*it2 + "Value");
- mColor[i][j] = config->readColorEntry(*it2 + "Color");
- d->mColor2[i][j] = config->readColorEntry(*it2 + "Color2");
- mTrans[i][j] = config->readBoolEntry(*it2 + "SemiTransparent");
-
- }
- }
-}
-
-bool KIconEffect::hasEffect(int group, int state) const
-{
- return mEffect[group][state] != NoEffect;
-}
-
-TQString KIconEffect::fingerprint(int group, int state) const
-{
- if ( group >= KIcon::LastGroup ) return "";
- TQString cached = d->mKey[group][state];
- if (cached.isEmpty())
- {
- TQString tmp;
- cached = tmp.setNum(mEffect[group][state]);
- cached += ':';
- cached += tmp.setNum(mValue[group][state]);
- cached += ':';
- cached += mTrans[group][state] ? TQString::tqfromLatin1("trans")
- : TQString::tqfromLatin1("notrans");
- if (mEffect[group][state] == Colorize || mEffect[group][state] == ToMonochrome)
- {
- cached += ':';
- cached += mColor[group][state].name();
- }
- if (mEffect[group][state] == ToMonochrome)
- {
- cached += ':';
- cached += d->mColor2[group][state].name();
- }
-
- d->mKey[group][state] = cached;
- }
-
- return cached;
-}
-
-TQImage KIconEffect::apply(TQImage image, int group, int state) const
-{
- if (state >= KIcon::LastState)
- {
- kdDebug(265) << "Illegal icon state: " << state << "\n";
- return image;
- }
- if (group >= KIcon::LastGroup)
- {
- kdDebug(265) << "Illegal icon group: " << group << "\n";
- return image;
- }
- return apply(image, mEffect[group][state], mValue[group][state],
- mColor[group][state], d->mColor2[group][state], mTrans[group][state]);
-}
-
-TQImage KIconEffect::apply(TQImage image, int effect, float value, const TQColor col, bool trans) const
-{
- return apply (image, effect, value, col, KGlobalSettings::baseColor(), trans);
-}
-
-TQImage KIconEffect::apply(TQImage image, int effect, float value, const TQColor col, const TQColor col2, bool trans) const
-{
- if (effect >= LastEffect )
- {
- kdDebug(265) << "Illegal icon effect: " << effect << "\n";
- return image;
- }
- if (value > 1.0)
- value = 1.0;
- else if (value < 0.0)
- value = 0.0;
- switch (effect)
- {
- case ToGray:
- toGray(image, value);
- break;
- case DeSaturate:
- deSaturate(image, value);
- break;
- case Colorize:
- colorize(image, col, value);
- break;
- case ToGamma:
- toGamma(image, value);
- break;
- case ToMonochrome:
- toMonochrome(image, col, col2, value);
- break;
- }
- if (trans == true)
- {
- semiTransparent(image);
- }
- return image;
-}
-
-TQPixmap KIconEffect::apply(TQPixmap pixmap, int group, int state) const
-{
- if (state >= KIcon::LastState)
- {
- kdDebug(265) << "Illegal icon state: " << state << "\n";
- return pixmap;
- }
- if (group >= KIcon::LastGroup)
- {
- kdDebug(265) << "Illegal icon group: " << group << "\n";
- return pixmap;
- }
- return apply(pixmap, mEffect[group][state], mValue[group][state],
- mColor[group][state], d->mColor2[group][state], mTrans[group][state]);
-}
-
-TQPixmap KIconEffect::apply(TQPixmap pixmap, int effect, float value,
- const TQColor col, bool trans) const
-{
- return apply (pixmap, effect, value, col, KGlobalSettings::baseColor(), trans);
-}
-
-TQPixmap KIconEffect::apply(TQPixmap pixmap, int effect, float value,
- const TQColor col, const TQColor col2, bool trans) const
-{
- TQPixmap result;
-
- if (effect >= LastEffect )
- {
- kdDebug(265) << "Illegal icon effect: " << effect << "\n";
- return result;
- }
-
- if ((trans == true) && (effect == NoEffect))
- {
- result = pixmap;
- semiTransparent(result);
- }
- else if ( effect != NoEffect )
- {
- TQImage tmpImg = pixmap.convertToImage();
- tmpImg = apply(tmpImg, effect, value, col, col2, trans);
- result.convertFromImage(tmpImg);
- }
- else
- result = pixmap;
-
- return result;
-}
-
-// Taken from KImageEffect. We don't want to link tdecore to tdeui! As long
-// as this code is not too big, it doesn't seem much of a problem to me.
-
-void KIconEffect::toGray(TQImage &img, float value)
-{
- int pixels = (img.depth() > 8) ? img.width()*img.height()
- : img.numColors();
- unsigned int *data = img.depth() > 8 ? (unsigned int *) img.bits()
- : (unsigned int *) img.tqcolorTable();
- int rval, gval, bval, val, alpha, i;
- for (i=0; i<pixels; i++)
- {
- val = tqGray(data[i]);
- alpha = tqAlpha(data[i]);
- if (value < 1.0)
- {
- rval = static_cast<int>(value*val+(1.0-value)*tqRed(data[i]));
- gval = static_cast<int>(value*val+(1.0-value)*tqGreen(data[i]));
- bval = static_cast<int>(value*val+(1.0-value)*tqBlue(data[i]));
- data[i] = tqRgba(rval, gval, bval, alpha);
- } else
- data[i] = tqRgba(val, val, val, alpha);
- }
-}
-
-void KIconEffect::colorize(TQImage &img, const TQColor &col, float value)
-{
- int pixels = (img.depth() > 8) ? img.width()*img.height()
- : img.numColors();
- unsigned int *data = img.depth() > 8 ? (unsigned int *) img.bits()
- : (unsigned int *) img.tqcolorTable();
- int rval, gval, bval, val, alpha, i;
- float rcol = col.red(), gcol = col.green(), bcol = col.blue();
- for (i=0; i<pixels; i++)
- {
- val = tqGray(data[i]);
- if (val < 128)
- {
- rval = static_cast<int>(rcol/128*val);
- gval = static_cast<int>(gcol/128*val);
- bval = static_cast<int>(bcol/128*val);
- }
- else if (val > 128)
- {
- rval = static_cast<int>((val-128)*(2-rcol/128)+rcol-1);
- gval = static_cast<int>((val-128)*(2-gcol/128)+gcol-1);
- bval = static_cast<int>((val-128)*(2-bcol/128)+bcol-1);
- }
- else // val == 128
- {
- rval = static_cast<int>(rcol);
- gval = static_cast<int>(gcol);
- bval = static_cast<int>(bcol);
- }
- if (value < 1.0)
- {
- rval = static_cast<int>(value*rval+(1.0 - value)*tqRed(data[i]));
- gval = static_cast<int>(value*gval+(1.0 - value)*tqGreen(data[i]));
- bval = static_cast<int>(value*bval+(1.0 - value)*tqBlue(data[i]));
- }
-
- alpha = tqAlpha(data[i]);
- data[i] = tqRgba(rval, gval, bval, alpha);
- }
-}
-
-void KIconEffect::toMonochrome(TQImage &img, const TQColor &black, const TQColor &white, float value) {
- int pixels = (img.depth() > 8) ? img.width()*img.height() : img.numColors();
- unsigned int *data = img.depth() > 8 ? (unsigned int *) img.bits()
- : (unsigned int *) img.tqcolorTable();
- int rval, gval, bval, alpha, i;
- int rw = white.red(), gw = white.green(), bw = white.blue();
- int rb = black.red(), gb = black.green(), bb = black.blue();
-
- double values = 0, sum = 0;
- bool grayscale = true;
- // Step 1: determine the average brightness
- for (i=0; i<pixels; i++) {
- sum += tqGray(data[i])*tqAlpha(data[i]) + 255*(255-tqAlpha(data[i]));
- values += 255;
- if ((tqRed(data[i]) != tqGreen(data[i]) ) || (tqGreen(data[i]) != tqBlue(data[i]) ))
- grayscale = false;
- }
- double medium = sum/values;
-
- // Step 2: Modify the image
- if (grayscale) {
- for (i=0; i<pixels; i++) {
- int v = tqRed(data[i]);
- rval = static_cast<int>( ((255-v)*rb + v*rw)*value/255 + (1.0-value)*tqRed(data[i]));
- gval = static_cast<int>( ((255-v)*gb + v*gw)*value/255 + (1.0-value)*tqGreen(data[i]));
- bval = static_cast<int>( ((255-v)*bb + v*bw)*value/255 + (1.0-value)*tqBlue(data[i]));
-
- alpha = tqAlpha(data[i]);
- data[i] = tqRgba(rval, gval, bval, alpha);
- }
- }
- else {
- for (i=0; i<pixels; i++) {
- if (tqGray(data[i]) <= medium) {
- rval = static_cast<int>(value*rb+(1.0-value)*tqRed(data[i]));
- gval = static_cast<int>(value*gb+(1.0-value)*tqGreen(data[i]));
- bval = static_cast<int>(value*bb+(1.0-value)*tqBlue(data[i]));
- }
- else {
- rval = static_cast<int>(value*rw+(1.0-value)*tqRed(data[i]));
- gval = static_cast<int>(value*gw+(1.0-value)*tqGreen(data[i]));
- bval = static_cast<int>(value*bw+(1.0-value)*tqBlue(data[i]));
- }
-
- alpha = tqAlpha(data[i]);
- data[i] = tqRgba(rval, gval, bval, alpha);
- }
- }
-}
-
-void KIconEffect::deSaturate(TQImage &img, float value)
-{
- int pixels = (img.depth() > 8) ? img.width()*img.height()
- : img.numColors();
- unsigned int *data = (img.depth() > 8) ? (unsigned int *) img.bits()
- : (unsigned int *) img.tqcolorTable();
- TQColor color;
- int h, s, v, i;
- for (i=0; i<pixels; i++)
- {
- color.setRgb(data[i]);
- color.hsv(&h, &s, &v);
- color.setHsv(h, (int) (s * (1.0 - value) + 0.5), v);
- data[i] = tqRgba(color.red(), color.green(), color.blue(),
- tqAlpha(data[i]));
- }
-}
-
-void KIconEffect::toGamma(TQImage &img, float value)
-{
- int pixels = (img.depth() > 8) ? img.width()*img.height()
- : img.numColors();
- unsigned int *data = (img.depth() > 8) ? (unsigned int *) img.bits()
- : (unsigned int *) img.tqcolorTable();
- TQColor color;
- int i, rval, gval, bval;
- float gamma;
- gamma = 1/(2*value+0.5);
-
- for (i=0; i<pixels; i++)
- {
- color.setRgb(data[i]);
- color.rgb(&rval, &gval, &bval);
- rval = static_cast<int>(pow(static_cast<float>(rval)/255 , gamma)*255);
- gval = static_cast<int>(pow(static_cast<float>(gval)/255 , gamma)*255);
- bval = static_cast<int>(pow(static_cast<float>(bval)/255 , gamma)*255);
- data[i] = tqRgba(rval, gval, bval, tqAlpha(data[i]));
- }
-}
-
-void KIconEffect::semiTransparent(TQImage &img)
-{
- img.setAlphaBuffer(true);
-
- int x, y;
- if (img.depth() == 32)
- {
- int width = img.width();
- int height = img.height();
-
- if (qt_use_xrender && qt_has_xft )
- for (y=0; y<height; y++)
- {
-#ifdef WORDS_BIGENDIAN
- uchar *line = (uchar*) img.scanLine(y);
-#else
- uchar *line = (uchar*) img.scanLine(y) + 3;
-#endif
- for (x=0; x<width; x++)
- {
- *line >>= 1;
- line += 4;
- }
- }
- else
- for (y=0; y<height; y++)
- {
- QRgb *line = (QRgb *) img.scanLine(y);
- for (x=(y%2); x<width; x+=2)
- line[x] &= 0x00ffffff;
- }
-
- } else
- {
- // Insert transparent pixel into the clut.
- int transColor = -1;
-
- // search for a color that is already transparent
- for (x=0; x<img.numColors(); x++)
- {
- // try to find already transparent pixel
- if (tqAlpha(img.color(x)) < 127)
- {
- transColor = x;
- break;
- }
- }
-
-
- // FIXME: image must have transparency
- if(transColor < 0 || transColor >= img.numColors())
- return;
-
- img.setColor(transColor, 0);
- if(img.depth() == 8)
- {
- for (y=0; y<img.height(); y++)
- {
- unsigned char *line = img.scanLine(y);
- for (x=(y%2); x<img.width(); x+=2)
- line[x] = transColor;
- }
- }
- else
- {
- // SLOOW, but simple, as we would have to
- // deal with endianess etc on our own here
- for (y=0; y<img.height(); y++)
- for (x=(y%2); x<img.width(); x+=2)
- img.setPixel(x, y, transColor);
- }
- }
-}
-
-void KIconEffect::semiTransparent(TQPixmap &pix)
-{
- if ( qt_use_xrender && qt_has_xft )
- {
- TQImage img=pix.convertToImage();
- semiTransparent(img);
- pix.convertFromImage(img);
- return;
- }
-
- TQImage img;
- if (pix.mask() != 0L)
- img = pix.mask()->convertToImage();
- else
- {
- img.create(pix.size(), 1, 2, TQImage::BigEndian);
- img.fill(1);
- }
-
- for (int y=0; y<img.height(); y++)
- {
- QRgb *line = (QRgb *) img.scanLine(y);
- QRgb pattern = (y % 2) ? 0x55555555 : 0xaaaaaaaa;
- for (int x=0; x<(img.width()+31)/32; x++)
- line[x] &= pattern;
- }
- TQBitmap mask;
- mask.convertFromImage(img);
- pix.setMask(mask);
-}
-
-TQImage KIconEffect::doublePixels(TQImage src) const
-{
- TQImage dst;
- if (src.depth() == 1)
- {
- kdDebug(265) << "image depth 1 not supported\n";
- return dst;
- }
-
- int w = src.width();
- int h = src.height();
- dst.create(w*2, h*2, src.depth());
- dst.setAlphaBuffer(src.hasAlphaBuffer());
-
- int x, y;
- if (src.depth() == 32)
- {
- QRgb *l1, *l2;
- for (y=0; y<h; y++)
- {
- l1 = (QRgb *) src.scanLine(y);
- l2 = (QRgb *) dst.scanLine(y*2);
- for (x=0; x<w; x++)
- {
- l2[x*2] = l2[x*2+1] = l1[x];
- }
- memcpy(dst.scanLine(y*2+1), l2, dst.bytesPerLine());
- }
- } else
- {
- for (x=0; x<src.numColors(); x++)
- dst.setColor(x, src.color(x));
-
- unsigned char *l1, *l2;
- for (y=0; y<h; y++)
- {
- l1 = src.scanLine(y);
- l2 = dst.scanLine(y*2);
- for (x=0; x<w; x++)
- {
- l2[x*2] = l1[x];
- l2[x*2+1] = l1[x];
- }
- memcpy(dst.scanLine(y*2+1), l2, dst.bytesPerLine());
- }
- }
- return dst;
-}
-
-void KIconEffect::overlay(TQImage &src, TQImage &overlay)
-{
- if (src.depth() != overlay.depth())
- {
- kdDebug(265) << "Image depth src != overlay!\n";
- return;
- }
- if (src.size() != overlay.size())
- {
- kdDebug(265) << "Image size src != overlay\n";
- return;
- }
- if (!overlay.hasAlphaBuffer())
- {
- kdDebug(265) << "Overlay doesn't have alpha buffer!\n";
- return;
- }
-
- int i, j;
-
- // We don't do 1 bpp
-
- if (src.depth() == 1)
- {
- kdDebug(265) << "1bpp not supported!\n";
- return;
- }
-
- // Overlay at 8 bpp doesn't use alpha blending
-
- if (src.depth() == 8)
- {
- if (src.numColors() + overlay.numColors() > 255)
- {
- kdDebug(265) << "Too many colors in src + overlay!\n";
- return;
- }
-
- // Find transparent pixel in overlay
- int trans;
- for (trans=0; trans<overlay.numColors(); trans++)
- {
- if (tqAlpha(overlay.color(trans)) == 0)
- {
- kdDebug(265) << "transparent pixel found at " << trans << "\n";
- break;
- }
- }
- if (trans == overlay.numColors())
- {
- kdDebug(265) << "transparent pixel not found!\n";
- return;
- }
-
- // Merge color tables
- int nc = src.numColors();
- src.setNumColors(nc + overlay.numColors());
- for (i=0; i<overlay.numColors(); i++)
- {
- src.setColor(nc+i, overlay.color(i));
- }
-
- // Overwrite nontransparent pixels.
- unsigned char *oline, *sline;
- for (i=0; i<src.height(); i++)
- {
- oline = overlay.scanLine(i);
- sline = src.scanLine(i);
- for (j=0; j<src.width(); j++)
- {
- if (oline[j] != trans)
- sline[j] = oline[j]+nc;
- }
- }
- }
-
- // Overlay at 32 bpp does use alpha blending
-
- if (src.depth() == 32)
- {
- QRgb *oline, *sline;
- int r1, g1, b1, a1;
- int r2, g2, b2, a2;
-
- for (i=0; i<src.height(); i++)
- {
- oline = (QRgb *) overlay.scanLine(i);
- sline = (QRgb *) src.scanLine(i);
-
- for (j=0; j<src.width(); j++)
- {
- r1 = tqRed(oline[j]);
- g1 = tqGreen(oline[j]);
- b1 = tqBlue(oline[j]);
- a1 = tqAlpha(oline[j]);
-
- r2 = tqRed(sline[j]);
- g2 = tqGreen(sline[j]);
- b2 = tqBlue(sline[j]);
- a2 = tqAlpha(sline[j]);
-
- r2 = (a1 * r1 + (0xff - a1) * r2) >> 8;
- g2 = (a1 * g1 + (0xff - a1) * g2) >> 8;
- b2 = (a1 * b1 + (0xff - a1) * b2) >> 8;
- a2 = QMAX(a1, a2);
-
- sline[j] = tqRgba(r2, g2, b2, a2);
- }
- }
- }
-
- return;
-}
-
- void
-KIconEffect::visualActivate(TQWidget * widget, TQRect rect)
-{
- if (!KGlobalSettings::visualActivate())
- return;
-
- uint actSpeed = KGlobalSettings::visualActivateSpeed();
-
- uint actCount = QMIN(rect.width(), rect.height()) / 2;
-
- // Clip actCount to range 1..10.
-
- if (actCount < 1)
- actCount = 1;
-
- else if (actCount > 10)
- actCount = 10;
-
- // Clip actSpeed to range 1..100.
-
- if (actSpeed < 1)
- actSpeed = 1;
-
- else if (actSpeed > 100)
- actSpeed = 100;
-
- // actSpeed needs to be converted to actDelay.
- // actDelay is inversely proportional to actSpeed and needs to be
- // divided up into actCount portions.
- // We also convert the us value to ms.
-
- unsigned int actDelay = (1000 * (100 - actSpeed)) / actCount;
-
- //kdDebug() << "actCount=" << actCount << " actDelay=" << actDelay << endl;
-
- TQPoint c = rect.center();
-
- TQPainter p(widget);
-
- // Use NotROP to avoid having to tqrepaint the pixmap each time.
- p.setPen(TQPen(Qt::black, 2, Qt::DotLine));
- p.setRasterOp(TQt::NotROP);
-
- // The spacing between the rects we draw.
- // Use the minimum of width and height to avoid painting outside the
- // pixmap area.
- //unsigned int delta(QMIN(rect.width() / actCount, rect.height() / actCount));
-
- // Support for rectangles by David
- unsigned int deltaX = rect.width() / actCount;
- unsigned int deltaY = rect.height() / actCount;
-
- for (unsigned int i = 1; i < actCount; i++) {
-
- int w = i * deltaX;
- int h = i * deltaY;
-
- rect.setRect(c.x() - w / 2, c.y() - h / 2, w, h);
-
- p.drawRect(rect);
- p.flush();
-
- usleep(actDelay);
-
- p.drawRect(rect);
- }
-}
-
-void
-KIconEffect::visualActivate(TQWidget * widget, TQRect rect, TQPixmap *pixmap)
-{
- if (!KGlobalSettings::visualActivate())
- return;
-
- // Image too big to display smoothly
- if ((rect.width() > 160) || (rect.height() > 160)) {
- visualActivate(widget, rect); // call old effect
- return;
- }
-
- uint actSpeed = KGlobalSettings::visualActivateSpeed();
- uint actCount = TQMIN(rect.width(), rect.height()) / 4;
-
-
- // Clip actCount to range 1..10.
- if (actCount < 1)
- actCount = 1;
-
- else if (actCount > 10)
- actCount = 10;
-
- // Clip actSpeed to range 1..100.
- if (actSpeed < 1)
- actSpeed = 1;
-
- else if (actSpeed > 100)
- actSpeed = 100;
-
- // actSpeed needs to be converted to actDelay.
- // actDelay is inversely proportional to actSpeed and needs to be
- // divided up into actCount portions.
- // We also convert the us value to ms.
-
- unsigned int actDelay = (1000 * (100 - actSpeed)) / actCount;
-
- unsigned int deltaX = rect.width() / actCount * 1.5;
- unsigned int deltaY = rect.height() / actCount * 1.5;
-
- TQPoint c = rect.center();
- TQRect maxRect(c.x() - (actCount * 2) * deltaX /2,
- c.y() - (actCount * 2) * deltaY /2,
- actCount * 2 * deltaX,
- actCount * 2 * deltaY);
-
- // convert rect to global coordinates if needed
- if ((widget->rect().width() <= maxRect.width())
- || (widget->rect().height() <= maxRect.height()))
- {
- TQPoint topLeft(rect.x(), rect.y());
- rect.moveLeft(widget->mapToGlobal(topLeft).x());
- rect.moveTop(widget->mapToGlobal(topLeft).y());
- c = rect.center();
- maxRect.setRect(c.x() - (actCount * 2) * deltaX /2,
- c.y() - (actCount * 2) * deltaY /2,
- actCount * 2 * deltaX,
- actCount * 2 * deltaY);
- }
-
- TQPainter *p;
- TQImage img = pixmap->convertToImage();
- TQPixmap pix;
- TQPixmap composite(maxRect.width(), maxRect.height(), -1, TQPixmap::BestOptim);
- TQPainter cPainter(&composite);
- TQPoint cComposite = composite.rect().center();
-
- // enable alpha blending
- img.setAlphaBuffer(true);
-
- // Ugly hack... Get "Screenshot" to blt into and even do that on the
- // root window if the display area of <widget> is too small
- if ((widget->rect().width() <= maxRect.width())
- || (widget->rect().height() <= maxRect.height()))
- {
-// p = new TQPainter(TQApplication::desktop()->screen( -1 ), TRUE); // WARNING: This was done in Qt3. It only worked in this placement due to a glitch in Qt3; it has therefore been moved below grabWidget, where it should have been in the first place.
- pix = TQPixmap::grabWindow((TQApplication::desktop()->screen( -1 ))->winId(),
- maxRect.x(),
- maxRect.y(),
- maxRect.width(),
- maxRect.height());
- p = new TQPainter(TQApplication::desktop()->screen( -1 ), TRUE);
- } else
- {
- // not as ugly as drawing directly to the screen
-// p = new TQPainter(widget); // WARNING: This was done in Qt3. See above.
- pix = TQPixmap::grabWidget(widget,
- maxRect.x(),
- maxRect.y(),
- maxRect.width(),
- maxRect.height());
- p = new TQPainter(widget);
- }
- uchar deltaAlpha = 255 / (actCount * 1.2);
-
- // Activate effect like MacOS X
- for (unsigned int i = actCount; i < actCount * 2; i++) {
-
- int w = i * deltaX;
- int h = i * deltaY;
-
- rect.setRect(cComposite.x() - w / 2, cComposite.y() - h / 2, w, h);
-
- // draw offscreen
- cPainter.drawPixmap(0, 0, pix, 0, 0, pix.width(), pix.height());
- cPainter.drawImage(rect, img);
- cPainter.flush();
-
- // put onscreen
- p->drawPixmap(maxRect, composite);
- p->flush();
-
- // Fade out Icon a bit more
- int x, y;
- if ((img.depth() == 32) && qt_use_xrender && qt_has_xft)
- {
- int width = img.width();
- int height = img.height();
-
- for (y=0; y<height; y++)
- {
-#ifdef WORDS_BIGENDIAN
- uchar *line = (uchar*) img.scanLine(y);
-#else
- uchar *line = (uchar*) img.scanLine(y) + 3;
-#endif
- for (x=0; x<width; x++)
- {
- *line = (*line < deltaAlpha) ? 0 : *line - deltaAlpha;
- line += 4;
- }
- }
- }
- usleep(actDelay*3);
- }
-
- // remove traces of the effect
- if ((widget->rect().width() <= maxRect.width())
- || (widget->rect().height() <= maxRect.height()))
- p->drawPixmap(maxRect, pix);
- else {
- p->drawPixmap(maxRect, pix);
- widget->update(rect);
- }
-
- delete p;
-}