You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-style-baghira/deco/config/aquariusbutton.cc

163 lines
4.2 KiB

#include "aquariusbutton.h"
#include <tqcolor.h>
#include <tqpixmap.h>
#include <tqpainter.h>
#include <kimageeffect.h>
#include "config.h"
#define COLOR_SPACE(R,G,B) \
if ( R < 0 ) R = 0; else if ( R > 255 ) R = 255; \
if ( G < 0 ) G = 0; else if ( G > 255 ) G = 255; \
if ( B < 0 ) B = 0; else if ( B > 255 ) B = 255;
#define SATURATION_COLOR(R,G,B) \
grey = (299 * R + 587 * G + 114 * B) / 1000; \
delta = 255 - grey; \
grey = (grey *(10 - 5)) / 10; \
iGrey = 255 - grey;\
destR = (iGrey * (srcR - delta) + grey * R) / 255; \
destG = (iGrey * (srcG - delta) + grey * G) / 255; \
destB = (iGrey * (srcB - delta) + grey * B) / 255;
#define CLAMP(x,l,u) x < l ? l :\
x > u ? u :\
x
#define SATURATION_COLOR2(S,R,G,B) \
int max = 255+0.65*(100-S); \
destR = CLAMP((srcR + R - 128), 0, max); \
destG = CLAMP((srcG + G - 128), 0, max); \
destB = CLAMP((srcB + B - 128), 0, max); \
destR = (S*destR + (100-S)*R)/100; \
destG = (S*destG + (100-S)*G)/100; \
destB = (S*destB + (100-S)*B)/100;
static bool blend( const TQImage & upper, const TQImage & lower, TQImage & output)
// adopted from kimageeffect::blend - what is not endian safe...
{
if
(
upper.width() > lower.width() ||
upper.height() > lower.height() ||
upper.depth() != 32 ||
lower.depth() != 32
)
return false;
output = lower.copy();
register uchar *i, *o;
register int a;
register int col;
register int w = upper.width();
int row(upper.height() - 1);
do
{
i = upper.scanLine(row);
o = output.scanLine(row);
col = w << 2;
--col;
do
{
#ifdef WORDS_BIGENDIAN
while (!(a = i[col-3]) && (col != 3))
#else
while (!(a = i[col]) && (col != 3))
#endif
{
--col; --col; --col; --col;
}
#ifndef WORDS_BIGENDIAN
--col;
#endif
o[col] += ((i[col] - o[col]) * a) >> 8;
--col;
o[col] += ((i[col] - o[col]) * a) >> 8;
--col;
o[col] += ((i[col] - o[col]) * a) >> 8;
#ifdef WORDS_BIGENDIAN
--col;
#endif
} while (col--);
} while (row--);
return true;
}
AquariusButton::AquariusButton( TQPixmap &pixmap, TQWidget* parent, const char* name) : TQWidget( parent, name){
pixmap = pixmap;
image = pixmap.convertToImage();
setFixedSize( pixmap.size() );
}
AquariusButton::~AquariusButton(){
}
TQColor AquariusButton::Color(){
return color;
}
void AquariusButton::setColor(TQColor c){
color = c;
tint(color);
repaint(false);
}
void AquariusButton::tint(TQColor &c){
TQImage dest( image.width(), image.height(), 32, 0 );
dest.setAlphaBuffer( true );
unsigned int *data = ( unsigned int * ) image.bits();
unsigned int *destData = ( unsigned int* ) dest.bits();
int total = image.width() * image.height();
int red, green, blue;
int destR, destG, destB, alpha;
int srcR = c.red();
int srcG = c.green();
int srcB = c.blue();
int hue, s, v;
c.getHsv( &hue, &s, &v );
int sq = CLAMP((int)((45.0/128.0)*s+55),0,100);
// float srcPercent, destPercent;
for ( int current = 0 ; current < total ; ++current ) {
alpha = tqAlpha( data[ current ] );
if (alpha < 230){
destData[ current ] = data[ current ];
continue; //do not handle translucent parts to not affect blending
}
red = tqRed( data[ current ] );
green = tqGreen( data[ current ] );
blue = tqBlue( data[ current ] );
SATURATION_COLOR2(sq, red, green, blue);
// force back to valid colorspace !
COLOR_SPACE(destR, destG, destB);
destData[ current ] = tqRgba( destR, destG, destB, alpha );
}
TQPixmap backPix = TQPixmap(dest.size());
TQPainter tmpPainter(&backPix);
tmpPainter.fillRect(0, 0, dest.width(),dest.height(), backgroundBrush());
tmpPainter.end();
TQImage back = backPix.convertToImage();
blend(dest,back,back);
pixmap = TQPixmap(back);
}
void AquariusButton::mousePressEvent( TQMouseEvent *e ){
emit clicked();
}
void AquariusButton::paintEvent( TQPaintEvent *e){
TQPainter tmpPainter(this);
tmpPainter.drawPixmap(0,0, pixmap);
}
// void AquariusButton::clicked(){
// }