QBitmap QPixmap::createHeuristicMask( bool clipTight ) const { QBitmap m; m.convertFromImage( convertToImage().createHeuristicMask(clipTight) ); return m; }
/*! Returns a pixmap with size \a s and mode \a m, generating one if needed. Generated pixmaps are cached. */ QPixmap QIconSet::pixmap( Size s, Mode m ) const { if ( !d ) { QPixmap r; return r; } QImage i; QIconSetPrivate * p = ((QIconSet *)this)->d; QPixmap * pm = 0; if ( s == Large ) { switch( m ) { case Normal: if ( !p->large.pm ) { ASSERT( p->small.pm ); i = p->small.pm->convertToImage(); i = i.smoothScale( i.width() * 3 / 2, i.height() * 3 / 2 ); p->large.pm = new QPixmap; p->large.generated = TRUE; p->large.pm->convertFromImage( i ); if ( !p->large.pm->mask() ) { i = i.createHeuristicMask(); QBitmap tmp; tmp.convertFromImage( i, Qt::MonoOnly + Qt::ThresholdDither ); p->large.pm->setMask( tmp ); } } pm = p->large.pm; break; case Active: if ( !p->largeActive.pm ) { p->largeActive.pm = new QPixmap( pixmap( Large, Normal ) ); p->largeActive.generated = TRUE; } pm = p->largeActive.pm; break; case Disabled: if ( !p->largeDisabled.pm ) { #if defined(_WS_QWS_) && !defined(QT_NO_DEPTH_32) p->largeDisabled.pm = newDisablePixmap(pixmap(Large,Normal)); #else QBitmap tmp; if ( p->large.generated && !p->smallDisabled.generated && p->smallDisabled.pm && !p->smallDisabled.pm->isNull() ) { // if there's a hand-drawn disabled small image, // but the normal big one is generated, use the // hand-drawn one to generate this one. i = p->smallDisabled.pm->convertToImage(); i = i.smoothScale( i.width() * 3 / 2, i.height() * 3 / 2 ); p->largeDisabled.pm = new QPixmap; p->largeDisabled.pm->convertFromImage( i ); if ( !p->largeDisabled.pm->mask() ) { i = i.createHeuristicMask(); tmp.convertFromImage( i, Qt::MonoOnly + Qt::ThresholdDither ); } } else { if (pixmap( Large, Normal).mask()) tmp = *pixmap( Large, Normal).mask(); else { QPixmap conv = pixmap( Large, Normal ); if ( !conv.isNull() ) { i = conv.convertToImage(); i = i.createHeuristicMask(); tmp.convertFromImage( i, Qt::MonoOnly + Qt::ThresholdDither ); } } p->largeDisabled.pm = new QPixmap( p->large.pm->width()+1, p->large.pm->height()+1); QColorGroup dis( QApplication::palette().disabled() ); p->largeDisabled.pm->fill( dis.background() ); QPainter painter( p->largeDisabled.pm ); painter.setPen( dis.base() ); painter.drawPixmap( 1, 1, tmp ); painter.setPen( dis.foreground() ); painter.drawPixmap( 0, 0, tmp ); } if ( !p->largeDisabled.pm->mask() ) { if ( !tmp.mask() ) tmp.setMask( tmp ); QBitmap mask( d->largeDisabled.pm->size() ); mask.fill( Qt::color0 ); QPainter painter( &mask ); painter.drawPixmap( 0, 0, tmp ); painter.drawPixmap( 1, 1, tmp ); painter.end(); p->largeDisabled.pm->setMask( mask ); } #endif p->largeDisabled.generated = TRUE; } pm = p->largeDisabled.pm; break; } } else { switch( m ) { case Normal: if ( !p->small.pm ) { ASSERT( p->large.pm ); i = p->large.pm->convertToImage(); i = i.smoothScale( i.width() * 2 / 3, i.height() * 2 / 3 ); p->small.pm = new QPixmap; p->small.generated = TRUE; p->small.pm->convertFromImage( i ); if ( !p->small.pm->mask() ) { i = i.createHeuristicMask(); QBitmap tmp; tmp.convertFromImage( i, Qt::MonoOnly + Qt::ThresholdDither ); p->small.pm->setMask( tmp ); } } pm = p->small.pm; break; case Active: if ( !p->smallActive.pm ) { p->smallActive.pm = new QPixmap( pixmap( Small, Normal ) ); p->smallActive.generated = TRUE; } pm = p->smallActive.pm; break; case Disabled: if ( !p->smallDisabled.pm ) { #if defined(_WS_QWS_) && !defined(QT_NO_DEPTH_32) p->smallDisabled.pm = newDisablePixmap(pixmap(Small,Normal)); #else QBitmap tmp; if ( p->small.generated && !p->largeDisabled.generated && p->largeDisabled.pm && !p->largeDisabled.pm->isNull() ) { // if there's a hand-drawn disabled large image, // but the normal small one is generated, use the // hand-drawn one to generate this one. i = p->largeDisabled.pm->convertToImage(); i = i.smoothScale( i.width() * 3 / 2, i.height() * 3 / 2 ); p->smallDisabled.pm = new QPixmap; p->smallDisabled.pm->convertFromImage( i ); if ( !p->smallDisabled.pm->mask() ) { i = i.createHeuristicMask(); tmp.convertFromImage( i, Qt::MonoOnly + Qt::ThresholdDither ); } } else { if ( pixmap( Small, Normal).mask()) tmp = *pixmap( Small, Normal).mask(); else { QPixmap conv = pixmap( Small, Normal ); if ( !conv.isNull() ) { i = conv.convertToImage(); i = i.createHeuristicMask(); tmp.convertFromImage( i, Qt::MonoOnly + Qt::ThresholdDither ); } } p->smallDisabled.pm = new QPixmap( p->small.pm->width()+1, p->small.pm->height()+1); QColorGroup dis( QApplication::palette().disabled() ); p->smallDisabled.pm->fill( dis.background() ); QPainter painter( p->smallDisabled.pm ); painter.setPen( dis.base() ); painter.drawPixmap( 1, 1, tmp ); painter.setPen( dis.foreground() ); painter.drawPixmap( 0, 0, tmp ); } if ( !p->smallDisabled.pm->mask() ) { if ( !tmp.mask() ) tmp.setMask( tmp ); QBitmap mask( d->smallDisabled.pm->size() ); mask.fill( Qt::color0 ); QPainter painter( &mask ); painter.drawPixmap( 0, 0, tmp ); painter.drawPixmap( 1, 1, tmp ); painter.end(); p->smallDisabled.pm->setMask( mask ); } #endif p->smallDisabled.generated = TRUE; } pm = p->smallDisabled.pm; break; } } ASSERT( pm ); return *pm; }