kdefx Library API Documentation

kpixmapeffect.cpp

00001 /* This file is part of the KDE libraries 00002 Copyright (C) 1998, 1999 Christian Tibirna <ctibirna@total.net> 00003 (C) 1998, 1999 Daniel M. Duley <mosfet@kde.org> 00004 (C) 1998, 1999 Dirk A. Mueller <mueller@kde.org> 00005 00006 */ 00007 00008 // $Id: kpixmapeffect.cpp,v 1.37 2003/05/06 17:37:56 fredrik Exp $ 00009 00010 #include <qimage.h> 00011 #include <qpainter.h> 00012 00013 #include "kpixmapeffect.h" 00014 #include "kpixmap.h" 00015 #include "kimageeffect.h" 00016 00017 //====================================================================== 00018 // 00019 // Gradient effects 00020 // 00021 //====================================================================== 00022 00023 00024 KPixmap& KPixmapEffect::gradient(KPixmap &pixmap, const QColor &ca, 00025 const QColor &cb, GradientType eff, int ncols) 00026 { 00027 if(pixmap.depth() > 8 && 00028 (eff == VerticalGradient || eff == HorizontalGradient)) { 00029 00030 int rDiff, gDiff, bDiff; 00031 int rca, gca, bca /*, rcb, gcb, bcb*/; 00032 00033 register int x, y; 00034 00035 rDiff = (/*rcb = */ cb.red()) - (rca = ca.red()); 00036 gDiff = (/*gcb = */ cb.green()) - (gca = ca.green()); 00037 bDiff = (/*bcb = */ cb.blue()) - (bca = ca.blue()); 00038 00039 register int rl = rca << 16; 00040 register int gl = gca << 16; 00041 register int bl = bca << 16; 00042 00043 int rcdelta = ((1<<16) / (eff == VerticalGradient ? pixmap.height() : pixmap.width())) * rDiff; 00044 int gcdelta = ((1<<16) / (eff == VerticalGradient ? pixmap.height() : pixmap.width())) * gDiff; 00045 int bcdelta = ((1<<16) / (eff == VerticalGradient ? pixmap.height() : pixmap.width())) * bDiff; 00046 00047 QPainter p(&pixmap); 00048 00049 // these for-loops could be merged, but the if's in the inner loop 00050 // would make it slow 00051 switch(eff) { 00052 case VerticalGradient: 00053 for ( y = 0; y < pixmap.height(); y++ ) { 00054 rl += rcdelta; 00055 gl += gcdelta; 00056 bl += bcdelta; 00057 00058 p.setPen(QColor(rl>>16, gl>>16, bl>>16)); 00059 p.drawLine(0, y, pixmap.width()-1, y); 00060 } 00061 break; 00062 case HorizontalGradient: 00063 for( x = 0; x < pixmap.width(); x++) { 00064 rl += rcdelta; 00065 gl += gcdelta; 00066 bl += bcdelta; 00067 00068 p.setPen(QColor(rl>>16, gl>>16, bl>>16)); 00069 p.drawLine(x, 0, x, pixmap.height()-1); 00070 } 00071 break; 00072 default: 00073 ; 00074 } 00075 } 00076 else { 00077 QImage image = KImageEffect::gradient(pixmap.size(), ca, cb, 00078 (KImageEffect::GradientType) eff, ncols); 00079 pixmap.convertFromImage(image); 00080 } 00081 00082 return pixmap; 00083 } 00084 00085 00086 // ----------------------------------------------------------------------------- 00087 00088 KPixmap& KPixmapEffect::unbalancedGradient(KPixmap &pixmap, const QColor &ca, 00089 const QColor &cb, GradientType eff, int xfactor, int yfactor, 00090 int ncols) 00091 { 00092 QImage image = KImageEffect::unbalancedGradient(pixmap.size(), ca, cb, 00093 (KImageEffect::GradientType) eff, 00094 xfactor, yfactor, ncols); 00095 pixmap.convertFromImage(image); 00096 00097 return pixmap; 00098 } 00099 00100 00101 //====================================================================== 00102 // 00103 // Intensity effects 00104 // 00105 //====================================================================== 00106 00107 00108 00109 KPixmap& KPixmapEffect::intensity(KPixmap &pixmap, float percent) 00110 { 00111 QImage image = pixmap.convertToImage(); 00112 KImageEffect::intensity(image, percent); 00113 pixmap.convertFromImage(image); 00114 00115 return pixmap; 00116 } 00117 00118 00119 // ----------------------------------------------------------------------------- 00120 00121 KPixmap& KPixmapEffect::channelIntensity(KPixmap &pixmap, float percent, 00122 RGBComponent channel) 00123 { 00124 QImage image = pixmap.convertToImage(); 00125 KImageEffect::channelIntensity(image, percent, 00126 (KImageEffect::RGBComponent) channel); 00127 pixmap.convertFromImage(image); 00128 00129 return pixmap; 00130 } 00131 00132 00133 //====================================================================== 00134 // 00135 // Blend effects 00136 // 00137 //====================================================================== 00138 00139 00140 KPixmap& KPixmapEffect::blend(KPixmap &pixmap, float initial_intensity, 00141 const QColor &bgnd, GradientType eff, 00142 bool anti_dir, int ncols) 00143 { 00144 00145 QImage image = pixmap.convertToImage(); 00146 if (image.depth() <=8) 00147 image = image.convertDepth(32); //Sloww.. 00148 00149 KImageEffect::blend(image, initial_intensity, bgnd, 00150 (KImageEffect::GradientType) eff, anti_dir); 00151 00152 unsigned int tmp; 00153 00154 if(pixmap.depth() <= 8 ) { 00155 if ( ncols < 2 || ncols > 256 ) 00156 ncols = 3; 00157 QColor *dPal = new QColor[ncols]; 00158 for (int i=0; i<ncols; i++) { 00159 tmp = 0 + 255 * i / ( ncols - 1 ); 00160 dPal[i].setRgb ( tmp, tmp, tmp ); 00161 } 00162 KImageEffect::dither(image, dPal, ncols); 00163 pixmap.convertFromImage(image); 00164 delete [] dPal; 00165 } 00166 else 00167 pixmap.convertFromImage(image); 00168 00169 return pixmap; 00170 } 00171 00172 00173 //====================================================================== 00174 // 00175 // Hash effects 00176 // 00177 //====================================================================== 00178 00179 KPixmap& KPixmapEffect::hash(KPixmap &pixmap, Lighting lite, 00180 unsigned int spacing, int ncols) 00181 { 00182 QImage image = pixmap.convertToImage(); 00183 KImageEffect::hash(image, (KImageEffect::Lighting) lite, spacing); 00184 00185 unsigned int tmp; 00186 00187 if(pixmap.depth() <= 8 ) { 00188 if ( ncols < 2 || ncols > 256 ) 00189 ncols = 3; 00190 QColor *dPal = new QColor[ncols]; 00191 for (int i=0; i<ncols; i++) { 00192 tmp = 0 + 255 * i / ( ncols - 1 ); 00193 dPal[i].setRgb ( tmp, tmp, tmp ); 00194 } 00195 KImageEffect::dither(image, dPal, ncols); 00196 pixmap.convertFromImage(image); 00197 delete [] dPal; 00198 } 00199 else 00200 pixmap.convertFromImage(image); 00201 00202 return pixmap; 00203 } 00204 00205 00206 //====================================================================== 00207 // 00208 // Pattern effects 00209 // 00210 //====================================================================== 00211 00212 #if 0 00213 void KPixmapEffect::pattern(KPixmap &pixmap, const QColor &ca, 00214 const QColor &cb, unsigned pat[8]) 00215 { 00216 QImage img = pattern(pixmap.size(), ca, cb, pat); 00217 pixmap.convertFromImage(img); 00218 } 00219 #endif 00220 00221 // ----------------------------------------------------------------------------- 00222 00223 KPixmap KPixmapEffect::pattern(const KPixmap& pmtile, QSize size, 00224 const QColor &ca, const QColor &cb, int ncols) 00225 { 00226 if (pmtile.depth() > 8) 00227 ncols = 0; 00228 00229 QImage img = pmtile.convertToImage(); 00230 KImageEffect::flatten(img, ca, cb, ncols); 00231 KPixmap pixmap; 00232 pixmap.convertFromImage(img); 00233 00234 return KPixmapEffect::createTiled(pixmap, size); 00235 } 00236 00237 00238 // ----------------------------------------------------------------------------- 00239 00240 KPixmap KPixmapEffect::createTiled(const KPixmap& pixmap, QSize size) 00241 { 00242 KPixmap pix(size); 00243 00244 QPainter p(&pix); 00245 p.drawTiledPixmap(0, 0, size.width(), size.height(), pixmap); 00246 00247 return pix; 00248 } 00249 00250 00251 //====================================================================== 00252 // 00253 // Fade effects 00254 // 00255 //====================================================================== 00256 00257 KPixmap& KPixmapEffect::fade(KPixmap &pixmap, double val, const QColor &color) 00258 { 00259 QImage img = pixmap.convertToImage(); 00260 KImageEffect::fade(img, val, color); 00261 pixmap.convertFromImage(img); 00262 00263 return pixmap; 00264 } 00265 00266 00267 // ----------------------------------------------------------------------------- 00268 KPixmap& KPixmapEffect::toGray(KPixmap &pixmap, bool fast) 00269 { 00270 QImage img = pixmap.convertToImage(); 00271 KImageEffect::toGray(img, fast); 00272 pixmap.convertFromImage(img); 00273 00274 return pixmap; 00275 } 00276 00277 // ----------------------------------------------------------------------------- 00278 KPixmap& KPixmapEffect::desaturate(KPixmap &pixmap, float desat) 00279 { 00280 QImage img = pixmap.convertToImage(); 00281 KImageEffect::desaturate(img, desat); 00282 pixmap.convertFromImage(img); 00283 00284 return pixmap; 00285 } 00286 // ----------------------------------------------------------------------------- 00287 KPixmap& KPixmapEffect::contrast(KPixmap &pixmap, int c) 00288 { 00289 QImage img = pixmap.convertToImage(); 00290 KImageEffect::contrast(img, c); 00291 pixmap.convertFromImage(img); 00292 00293 return pixmap; 00294 } 00295 00296 //====================================================================== 00297 // 00298 // Dither effects 00299 // 00300 //====================================================================== 00301 00302 // ----------------------------------------------------------------------------- 00303 KPixmap& KPixmapEffect::dither(KPixmap &pixmap, const QColor *palette, int size) 00304 { 00305 QImage img = pixmap.convertToImage(); 00306 KImageEffect::dither(img, palette, size); 00307 pixmap.convertFromImage(img); 00308 00309 return pixmap; 00310 } 00311 00312 //====================================================================== 00313 // 00314 // Other effects 00315 // 00316 //====================================================================== 00317 00318 KPixmap KPixmapEffect::selectedPixmap( const KPixmap &pix, const QColor &col ) 00319 { 00320 QImage img = pix.convertToImage(); 00321 KImageEffect::selectedImage(img, col); 00322 KPixmap outPix; 00323 outPix.convertFromImage(img); 00324 return outPix; 00325 }
KDE Logo
This file is part of the documentation for kdefx Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Sep 29 09:39:51 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003