crabs_tuxcpu-1.1.1 ©2004-2011 - Christophe CAZAJUS (crabs-mettre_le_signe_at-crabs-world.com)
1 /* 2 **============================================================================= 3 ** crabs_tuxcpu-1.1.1 : Pingouin animé (occupation CPU) 4 ** Copyright (C) 2004-2011 : Christophe CAZAJUS (crabs-mettre_le_signe_at-crabs-world.com) 5 ** 6 ** Ce source fait partie d'un projet logiciel libre. Vous pouvez le distribuer 7 ** et/ou le modifier en respectant les termes de la GNU General Public License 8 ** version 2 ou (suite a votre propre choix) une version ulterieure. 9 ** 10 ** Ce programme est distribue dans l'espoir qu'il puisse etre utile, mais 11 ** sans aucune garantie, meme si il est associe a un produit qui vous en 12 ** propose une. Conformez-vous a la GNU General Public License pour avoir 13 ** plus de precisions. 14 ** 15 ** L'auteur ne peut etre tenu responsable de l'utilisation faite des 16 ** composantes associees a ce projet (en partie ou dans leur totalite). 17 ** 18 ** Une copie du fichier de la GNU GPL est fournie dans le repertoire DOC 19 ** de ce projet sous le nom gnu_gpl.txt 20 ** 21 **============================================================================= 22 */ 23 #include "anim.qh" 24 25 static const double color_tx[PerCentAnim::nb] = { 26 1.00, // 0 27 0.98, // 1 28 0.96, // 2 29 0.94, // 3 30 0.92, // 4 31 0.90, // 5 32 0.86, // 6 33 0.82, // 7 34 0.78, // 8 35 0.74, // 9 36 0.70, // 10 37 0.65, // 11 38 0.60, // 12 39 0.55, // 13 40 0.50, // 14 41 0.45, // 15 42 0.40, // 16 43 0.35, // 17 44 0.30, // 18 45 0.25 // 19 46 } ; 47 48 49 void PerCentAnim::start() 50 { 51 if ( imode == ImageSeule ) 52 startSeule() ; 53 else 54 startAnimee() ; 55 idRouge->setChecked( rmode==ModeRouge ) ; 56 idHaut->setChecked( rmode==ModeHaut ) ; 57 idStore->setChecked( rmode==ModeStore ) ; 58 idSeule->setChecked( imode==ImageSeule ) ; 59 idAnimee->setChecked( imode==ImageAnimee ) ; 60 61 setFixedSize( px[0]->size() ) ; 62 current = nb-1 ; showImg() ; 63 nextTimer->start( 1000 ) ; 64 } 65 66 void PerCentAnim::startSeule() 67 { 68 QImage img, mask ; QPixmap p ; 69 chargeImage( imgFile, img, mask, p ) ; 70 for( int i=0; i<nb; i++ ) if ( px[i] ) { delete px[i] ; px[i]=0 ; } 71 switch( rmode ) 72 { 73 case ModeHaut: imgHaut( img, mask, p ) ; break ; 74 case ModeStore: imgStore( img, mask, p ) ; break ; 75 case ModeRouge : 76 default : imgRouge( img, mask, p ) ; 77 } 78 } 79 80 void PerCentAnim::chargeImage( const QString& file, QImage& img, QImage& mask, 81 QPixmap& p ) 82 { 83 img.load( file ) ; 84 if ( img.isNull() ) 85 {qDebug("error opening:%s",file.toLocal8Bit().constData());exit(0);} 86 if ( img.hasAlphaChannel() ) 87 mask = img.createAlphaMask() ; 88 else 89 mask = img.createHeuristicMask() ; 90 p = QPixmap::fromImage( img ) ; 91 } 92 93 void PerCentAnim::imgRouge( QImage& img, QImage& mask, QPixmap& p ) 94 { 95 for( int i=0; i<nb; i++ ) 96 { 97 double tx = color_tx[i] ; 98 px[i] = new QPixmap( p ) ; 99 QPainter pnt ; pnt.begin( px[i] ) ; 100 for( int y=0; y<mask.height() ; y++ ) 101 for( int x=0; x<mask.width() ; x++ ) 102 { 103 if ( !mask.pixelIndex(x,y) ) continue ; 104 QRgb c = img.pixel( x, y ) ; 105 double b = qBlue( c ) ; 106 double g = qGreen( c ) ; 107 b*= tx ; g*= tx ; 108 QColor nc( qRed( c ), (int)g, int(b) ) ; 109 pnt.setPen( nc ) ; 110 pnt.drawPoint( x, y ) ; 111 } 112 pnt.end() ; 113 } 114 } 115 116 void PerCentAnim::imgHaut( QImage& img, QImage& mask, QPixmap& p ) 117 { 118 double tx= 0.20 ; 119 for( int i=0; i<nb; i++ ) 120 { 121 px[i] = new QPixmap( p ) ; 122 QPainter pnt ; pnt.begin( px[i] ) ; 123 int y = ( (nb-i-1)* mask.height() ) / ( nb-1) ; 124 for( ; y<mask.height() ; y++ ) 125 for( int x=0; x<mask.width() ; x++ ) 126 { 127 if ( !mask.pixelIndex(x,y) ) continue ; 128 QRgb c = img.pixel( x, y ) ; 129 double b = qBlue( c ) ; 130 double g = qGreen( c ) ; 131 b*= tx ; g*= tx ; 132 QColor nc( qRed( c ), (int)g, int(b) ) ; 133 //QColor nc( 255, 0, 0 ) ; 134 pnt.setPen( nc ) ; 135 pnt.drawPoint( x, y ) ; 136 } 137 pnt.end() ; 138 } 139 } 140 141 void PerCentAnim::imgStore( QImage&, QImage&, QPixmap& p ) 142 { 143 int for_mod = nb - 1 ; int min=0 ; int max = for_mod-1 ; 144 for( int i=0; i<nb; i++ ) 145 { 146 QPixmap* _p = px[i] = new QPixmap( p ) ; 147 QImage msk = _p->mask().toImage() ; 148 QPainter pnt ; pnt.begin( _p ) ; 149 for( int y=0; y<_p->height(); y++ ) 150 for( int x=0; x<_p->width(); x++ ) 151 { 152 int pos = y % for_mod ; 153 if ( ( pos >= min ) && ( pos <= max ) ) 154 { 155 QColor nc( 240,240,240 ) ; 156 pnt.setPen( nc ) ; 157 msk.setPixel(x,y,1) ; 158 pnt.drawPoint( x, y ) ; 159 } 160 } 161 pnt.end() ; 162 QBitmap bmsk ; bmsk.fromImage( msk ) ; 163 _p->setMask( bmsk ) ; 164 if ( i%2 ) max-- ; else min++ ; 165 } 166 } 167 168 void PerCentAnim::startAnimee() 169 { 170 QString tmp( imgDir ) ; tmp += "/" ; 171 QDir dir(imgDir) ; QStringList img_file ; 172 QFileInfoList list = dir.entryInfoList( QDir::Files | QDir::NoSymLinks, 173 QDir::Name | QDir::IgnoreCase ); 174 QList<QFileInfo>::iterator it ; 175 for ( it = list.begin(); it != list.end(); ++it ) 176 img_file << tmp+(*it).fileName() ; 177 int count = img_file.count() ; 178 if ( count < 2 ) return ; 179 QImage img, mask, prec_img, prec_mask ; QPixmap p, prec_p ; 180 int DX=nb -1 ; int DY=count-1 ; int last_pix=-1 ; 181 int PX=0; int PY=0 ; int iimg=0 ; bool first=true ; 182 for( int ipix=0; ipix<nb; ipix++ ) 183 { 184 if ( PX>=PY ) 185 { 186 chargeImage( img_file[iimg], img, mask, p ) ; 187 affectePixmap( p, ipix ) ; 188 if ( !first ) 189 moyenne( p, last_pix, prec_img, prec_mask, ipix, img, mask ) ; 190 last_pix = ipix ; first = false ; 191 prec_img = img ; prec_mask = mask ; prec_p = p ; 192 iimg++ ; 193 PY+=DX ; 194 } 195 PX+=DY ; 196 } 197 } 198 199 void PerCentAnim::moyenne( QPixmap& model, 200 int ix0, QImage& im0, QImage& mk0, int ix1, QImage& im1, QImage& mk1 ) 201 { 202 if ( ix1 - ix0 < 2 ) return ; 203 int ixm = ( ix0 + ix1 ) / 2 ; 204 QPixmap p( model ) ; QImage msk = p.mask().toImage() ; 205 QPainter pnt ; pnt.begin( &p ) ; 206 for( int y=0; y<model.height() ; y++ ) 207 for( int x=0; x<model.width() ; x++ ) 208 { 209 if ( !mk0.pixelIndex(x,y) && !mk1.pixelIndex(x,y) ) 210 { 211 msk.setPixel(x,y,0) ; 212 continue ; 213 } 214 QRgb c0, c1 ; msk.setPixel(x,y,1) ; QColor noir(0,0,0) ; 215 if ( !mk0.pixelIndex(x,y) ) 216 { c0 = noir.rgb() ; c1 = im1.pixel( x, y ) ; } 217 else if ( !mk1.pixelIndex(x,y) ) 218 { c0 = im0.pixel( x, y ) ; c1 = noir.rgb() ; } 219 else 220 { c0 = im0.pixel( x, y ) ; c1 = im1.pixel( x, y ) ; } 221 222 QColor nc( (qRed(c0)+qRed(c1))/2, 223 (qGreen(c0)+qGreen(c1))/2, 224 (qBlue(c0)+qBlue(c1))/2 ) ; 225 pnt.setPen( nc ) ; 226 pnt.drawPoint( x, y ) ; 227 } 228 pnt.end() ; 229 QBitmap bmsk ; bmsk.fromImage( msk ) ; 230 p.setMask( bmsk ) ; 231 affectePixmap( p, ixm ) ; 232 QImage imm = p.toImage() ; 233 QImage mkm = p.mask().toImage() ; 234 moyenne( model, ix0, im0, mk0, ixm, imm, mkm ) ; 235 moyenne( model, ixm, imm, mkm, ix1, im1, mk1 ) ; 236 } 237 238 void PerCentAnim::affectePixmap( QPixmap& p, int i ) 239 { 240 if ( px[i] ) delete px[i] ; 241 px[i] = new QPixmap( p ) ; 242 } 243
Date de génération : 22/09/2011 21:48