Pingouin animé (occupation CPU)

crabs_tuxcpu-1.1.1 ©2004-2011 - Christophe CAZAJUS (crabs-mettre_le_signe_at-crabs-world.com)

libtuxcpuanim.a~~ / ANIM / start.cpp
Makefile anim.qh anim.cpp start.cpp event.cpp slot.cpp cpu.cpp menu.cpp voir.QH voir.cpp proc.cpp
    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 
Makefile anim.qh anim.cpp start.cpp event.cpp slot.cpp cpu.cpp menu.cpp voir.QH voir.cpp proc.cpp
libtuxcpuanim.a~~ / ANIM / start.cpp

Haut de page

Contacter crabs

Date de génération : 22/09/2011 21:48