30 #include <QtCore/QSysInfo>
31 #include <QtGui/QApplication>
32 #include <QtGui/QPaintEngine>
33 #include <QtGui/QDesktopWidget>
34 #include <QtCore/QCharRef>
35 #include <QtCore/QMutableStringListIterator>
36 #include <QtGui/QBitmap>
37 #include <QtGui/QPixmap>
38 #include <QtGui/QImage>
39 #include <QtGui/QColor>
40 #include <QtGui/QWidget>
41 #include <QtGui/QPainter>
53 class KIconEffectPrivate
65 :d(new KIconEffectPrivate)
85 groups +=
"MainToolbar";
98 QString _desaturate(
"desaturate");
101 QString _tomonochrome(
"tomonochrome");
110 d->trans[i][0] =
false;
111 d->trans[i][1] =
false;
112 d->trans[i][2] =
true;
113 d->value[i][0] = 1.0;
114 d->value[i][1] = ((i==0)||(i==4)) ? 0.7 : 1.0;
115 d->value[i][2] = 1.0;
116 d->color[i][0] =
QColor(144,128,248);
117 d->color[i][1] =
QColor(169,156,255);
118 d->color[i][2] =
QColor(34,202,0);
119 d->color2[i][0] =
QColor(0,0,0);
120 d->color2[i][1] =
QColor(0,0,0);
121 d->color2[i][2] =
QColor(0,0,0);
129 else if (tmp == _colorize)
131 else if (tmp == _desaturate)
133 else if (tmp == _togamma)
135 else if (tmp == _tomonochrome)
137 else if (tmp == _none)
142 d->effect[i][j] = effect;
143 d->value[i][j] = cg.
readEntry(*it2 +
"Value", 0.0);
146 d->trans[i][j] = cg.
readEntry(*it2 +
"SemiTransparent",
false);
159 return d->effect[group][state] !=
NoEffect;
169 QString cached = d->key[group][state];
173 cached = tmp.
setNum(d->effect[group][state]);
175 cached += tmp.
setNum(d->value[group][state]);
182 cached += d->color[group][state].name();
187 cached += d->color2[group][state].name();
190 d->key[group][state] = cached;
200 kDebug(265) <<
"Illegal icon state: " << state <<
"\n";
205 kDebug(265) <<
"Illegal icon group: " << group <<
"\n";
208 return apply(image, d->effect[group][state], d->value[group][state],
209 d->color[group][state], d->color2[group][state], d->trans[group][state]);
213 const QColor &col,
bool trans)
const
215 return apply(image, effect, value, col,
220 const QColor &col,
const QColor &col2,
bool trans)
const
225 kDebug(265) <<
"Illegal icon effect: " << effect <<
"\n";
230 else if (value < 0.0)
261 kDebug(265) <<
"Illegal icon state: " << state <<
"\n";
266 kDebug(265) <<
"Illegal icon group: " << group <<
"\n";
269 return apply(pixmap, d->effect[group][state], d->value[group][state],
270 d->color[group][state], d->color2[group][state], d->trans[group][state]);
274 const QColor &col,
bool trans)
const
276 return apply(pixmap, effect, value, col,
281 const QColor &col,
const QColor &col2,
bool trans)
const
287 kDebug(265) <<
"Illegal icon effect: " << effect <<
"\n";
291 if ((trans ==
true) && (effect ==
NoEffect))
299 tmpImg =
apply(tmpImg, effect, value, col, col2, trans);
315 KIEImgEdit(
QImage& _img):img(_img)
321 if ((img.format() != QImage::Format_ARGB32) &&
322 (img.format() != QImage::Format_RGB32))
324 img = img.convertToFormat(QImage::Format_ARGB32);
326 data = (
unsigned int*)img.bits();
327 pixels = img.width()*img.height();
331 pixels = img.numColors();
332 colors = img.colorTable();
333 data = (
unsigned int*)colors.data();
339 if (img.depth() <= 8)
340 img.setColorTable(colors);
352 return pe && pe->
hasFeature(QPaintEngine::Antialiasing);
365 QRgb *data = ii.data;
366 QRgb *
end = data + ii.pixels;
372 *data = qRgba(gray, gray, gray, qAlpha(*data));
377 unsigned char val = (
unsigned char)(255.0*value);
380 *data = qRgba((val*gray+(0xFF-val)*qRed(*data)) >> 8,
381 (val*gray+(0xFF-val)*qGreen(*data)) >> 8,
382 (val*gray+(0xFF-val)*qBlue(*data)) >> 8,
395 QRgb *data = ii.data;
396 QRgb *
end = data + ii.pixels;
398 float rcol = col.
red(), gcol = col.
green(), bcol = col.
blue();
399 unsigned char red, green, blue, gray;
400 unsigned char val = (
unsigned char)(255.0*value);
404 red =
static_cast<unsigned char>(rcol/128*gray);
405 green =
static_cast<unsigned char>(gcol/128*gray);
406 blue =
static_cast<unsigned char>(bcol/128*gray);
409 red =
static_cast<unsigned char>((gray-128)*(2-rcol/128)+rcol-1);
410 green =
static_cast<unsigned char>((gray-128)*(2-gcol/128)+gcol-1);
411 blue =
static_cast<unsigned char>((gray-128)*(2-bcol/128)+bcol-1);
414 red =
static_cast<unsigned char>(rcol);
415 green =
static_cast<unsigned char>(gcol);
416 blue =
static_cast<unsigned char>(bcol);
419 *data = qRgba((val*red+(0xFF-val)*qRed(*data)) >> 8,
420 (val*green+(0xFF-val)*qGreen(*data)) >> 8,
421 (val*blue+(0xFF-val)*qBlue(*data)) >> 8,
428 const QColor &white,
float value)
434 QRgb *data = ii.data;
435 QRgb *
end = data + ii.pixels;
438 double values = 0.0, sum = 0.0;
439 bool grayscale =
true;
441 sum += qGray(*data)*qAlpha(*data) + 255*(255-qAlpha(*data));
443 if((qRed(*data) != qGreen(*data) ) || (qGreen(*data) != qBlue(*data)))
447 double medium = sum/values;
450 unsigned char val = (
unsigned char)(255.0*value);
451 int rw = white.
red(), gw = white.
green(), bw = white.
blue();
452 int rb = black.
red(), gb = black.
green(), bb = black.
blue();
457 if(qRed(*data) <= medium)
458 *data = qRgba((val*rb+(0xFF-val)*qRed(*data)) >> 8,
459 (val*gb+(0xFF-val)*qGreen(*data)) >> 8,
460 (val*bb+(0xFF-val)*qBlue(*data)) >> 8,
463 *data = qRgba((val*rw+(0xFF-val)*qRed(*data)) >> 8,
464 (val*gw+(0xFF-val)*qGreen(*data)) >> 8,
465 (val*bw+(0xFF-val)*qBlue(*data)) >> 8,
472 if(qGray(*data) <= medium)
473 *data = qRgba((val*rb+(0xFF-val)*qRed(*data)) >> 8,
474 (val*gb+(0xFF-val)*qGreen(*data)) >> 8,
475 (val*bb+(0xFF-val)*qBlue(*data)) >> 8,
478 *data = qRgba((val*rw+(0xFF-val)*qRed(*data)) >> 8,
479 (val*gw+(0xFF-val)*qGreen(*data)) >> 8,
480 (val*bw+(0xFF-val)*qBlue(*data)) >> 8,
493 QRgb *data = ii.data;
494 QRgb *
end = data + ii.pixels;
501 color.
setHsv(h, (
int) (s * (1.0 - value) + 0.5), v);
511 QRgb *data = ii.data;
512 QRgb *
end = data + ii.pixels;
514 float gamma = 1/(2*value+0.5);
516 *data = qRgba(static_cast<unsigned char>
517 (pow(static_cast<float>(qRed(*data))/255 , gamma)*255),
518 static_cast<unsigned char>
519 (pow(static_cast<float>(qGreen(*data))/255 , gamma)*255),
520 static_cast<unsigned char>
521 (pow(static_cast<float>(qBlue(*data))/255 , gamma)*255),
530 if(img.
depth() == 32){
531 if(img.
format() == QImage::Format_ARGB32_Premultiplied)
533 int width = img.
width();
534 int height = img.
height();
538 for(y=0; y<height; ++y){
539 if(QSysInfo::ByteOrder == QSysInfo::BigEndian)
543 for(x=0; x<width; ++x){
550 for(y=0; y<height; ++y){
551 QRgb* line = (QRgb*)img.
scanLine(y);
552 for(x=(y%2); x<width; x+=2)
553 line[x] &= 0x00ffffff;
558 if (img.
depth() == 8) {
562 for (
int i = 0; i < colorTable.
size(); ++i) {
563 colorTable[i] = (colorTable[i] & 0x00ffffff) | ((colorTable[i] & 0xfe000000) >> 1);
575 if(qAlpha(img.
color(x)) < 127){
582 if(transColor < 0 || transColor >= img.
numColors())
587 if(img.
depth() == 8){
588 for(y=0; y<img.
height(); ++y){
590 for(x=(y%2); x<img.
width(); x+=2)
591 line[x] = transColor;
595 bool setOn = (transColor != 0);
596 if(img.
format() == QImage::Format_MonoLSB){
597 for(y=0; y<img.
height(); ++y){
599 for(x=(y%2); x<img.
width(); x+=2){
601 *(line + (x >> 3)) &= ~(1 << (x & 7));
603 *(line + (x >> 3)) |= (1 << (x & 7));
608 for(y=0; y<img.
height(); ++y){
610 for(x=(y%2); x<img.
width(); x+=2){
612 *(line + (x >> 3)) &= ~(1 << (7-(x & 7)));
614 *(line + (x >> 3)) |= (1 << (7-(x & 7)));
636 img =
QImage(pix.
size(), QImage::Format_Mono);
640 for (
int y=0; y<img.
height(); y++)
642 QRgb* line = (QRgb*)img.
scanLine(y);
643 QRgb pattern = (y % 2) ? 0x55555555 : 0xaaaaaaaa;
644 for (
int x=0; x<(img.
width()+31)/32; x++)
659 if (src.
depth() == 1)
661 kDebug(265) <<
"image depth 1 not supported\n";
666 if (src.
depth() == 32)
672 l2 = (QRgb*)dst.scanLine(y*2);
675 l2[x*2] = l2[x*2+1] = l1[x];
677 memcpy(dst.scanLine(y*2+1), l2, dst.bytesPerLine());
682 dst.setColor(x, src.
color(x));
684 const unsigned char *l1;
689 l2 = dst.scanLine(y*2);
695 memcpy(dst.scanLine(y*2+1), l2, dst.bytesPerLine());
705 kDebug(265) <<
"Image depth src (" << src.
depth() <<
") != overlay " <<
"(" << overlay.
depth() <<
")!\n";
710 kDebug(265) <<
"Image size src != overlay\n";
713 if (src.
format() == QImage::Format_ARGB32_Premultiplied)
716 if (overlay.
format() == QImage::Format_RGB32)
718 kDebug(265) <<
"Overlay doesn't have alpha buffer!\n";
721 else if (overlay.
format() == QImage::Format_ARGB32_Premultiplied)
728 if (src.
depth() == 1)
730 kDebug(265) <<
"1bpp not supported!\n";
736 if (src.
depth() == 8)
740 kDebug(265) <<
"Too many colors in src + overlay!\n";
746 for (trans=0; trans<overlay.
numColors(); trans++)
748 if (qAlpha(overlay.
color(trans)) == 0)
750 kDebug(265) <<
"transparent pixel found at " << trans <<
"\n";
756 kDebug(265) <<
"transparent pixel not found!\n";
769 unsigned char *oline, *sline;
770 for (i=0; i<src.
height(); ++i)
774 for (j=0; j<src.
width(); ++j)
776 if (oline[j] != trans)
777 sline[j] = oline[j]+nc;
784 if (src.
depth() == 32)
790 for (i=0; i<src.
height(); ++i)
795 for (j=0; j<src.
width(); ++j)
798 g1 = qGreen(oline[j]);
799 b1 = qBlue(oline[j]);
800 a1 = qAlpha(oline[j]);
803 g2 = qGreen(sline[j]);
804 b2 = qBlue(sline[j]);
805 a2 = qAlpha(sline[j]);
807 r2 = (a1 * r1 + (0xff - a1) * r2) >> 8;
808 g2 = (a1 * g1 + (0xff - a1) * g2) >> 8;
809 b2 = (a1 * b1 + (0xff - a1) * b2) >> 8;
812 sline[j] = qRgba(r2, g2, b2, a2);
static void semiTransparent(QImage &image)
Renders an image semi-transparent.
QBitmap fromImage(const QImage &image, QFlags< Qt::ImageConversionFlag > flags)
QPixmap fromImage(const QImage &image, QFlags< Qt::ImageConversionFlag > flags)
void setRgb(int r, int g, int b, int a)
static QDebug kDebug(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
static void toMonochrome(QImage &image, const QColor &black, const QColor &white, float value)
Produces a monochrome icon with a given foreground and background color.
void getHsv(int *h, int *s, int *v, int *a) const
void setColor(int index, QRgb colorValue)
KSharedConfigPtr config()
static void overlay(QImage &src, QImage &overlay)
Overlays an image with an other image.
void setNumColors(int numColors)
KIconEffect()
Create a new KIconEffect.
static void colorize(QImage &image, const QColor &col, float value)
Colorizes an image with a specific color.
static void deSaturate(QImage &image, float value)
Desaturates an image.
void fill(uint pixelValue)
void init()
Rereads configuration.
static void toGamma(QImage &image, float value)
Changes the gamma value of an image.
Views; for example, frames, input fields, etc.
void setMask(const QBitmap &mask)
QDesktopWidget * desktop()
Last state (last constant)
QString & setNum(short n, int base)
A set of methods used to work with colors.
QString fingerprint(int group, int state) const
Returns a fingerprint for the effect by encoding the given group and state into a QString...
static bool painterSupportsAntialiasing()
bool hasEffect(int group, int state) const
Tests whether an effect has been configured for the given icon group.
void setColorTable(const QVector< QRgb > colors)
static void toGray(QImage &image, float value)
Tints an image gray.
void setHsv(int h, int s, int v, int a)
bool hasFeature(QFlags< QPaintEngine::PaintEngineFeature > feature) const
QImage apply(const QImage &src, int group, int state) const
Applies an effect to an image.
const_iterator constEnd() const
const_iterator constBegin() const
const KShortcut & end()
Goto end of the document.
T readEntry(const QString &key, const T &aDefault) const
QImage doublePixels(const QImage &src) const
Returns an image twice as large, consisting of 2x2 pixels.
QVector< QRgb > colorTable() const