--- ksmserver/shutdowndlg.cpp.sav 2006-11-28 18:18:41.000000000 +0100 +++ ksmserver/shutdowndlg.cpp 2006-11-28 18:25:15.000000000 +0100 @@ -35,6 +35,7 @@ Copyright (C) 2000 Matthias Ettrich #include #include +#include #include #include @@ -48,6 +49,9 @@ Copyright (C) 2000 Matthias Ettrich geometry() ); - QTimer::singleShot( 10, this, SLOT( slotPaintEffect() ) ); - m_root.resize( width(), height() ); -} + if( QPixmap::defaultDepth() > 8 ) + { + grabbed.create( size(), 32 ); + QTimer::singleShot( 0, this, SLOT( slotGrab() ) ); + } + else + { + QTimer::singleShot( 10, this, SLOT( slotPaintEffectOld() ) ); + m_root.resize( width(), height() ); + } + +} -void KSMShutdownFeedback::slotPaintEffect() +// the upstream KDE effect +void KSMShutdownFeedback::slotPaintEffectOld() { if ( m_currentY >= height() ) { if ( backgroundMode() == QWidget::NoBackground ) { @@ -80,7 +94,76 @@ void KSMShutdownFeedback::slotPaintEffec bitBlt( this, 0, m_currentY, &pixmap ); bitBlt( &m_root, 0, m_currentY, &pixmap ); m_currentY += 10; - QTimer::singleShot( 1, this, SLOT( slotPaintEffect() ) ); + QTimer::singleShot( 1, this, SLOT( slotPaintEffectOld() ) ); +} + + +void KSMShutdownFeedback::slotGrab() +{ + // we start the passed early + if ( m_currentY * 4 >= height() * 3 && passed.isNull()) + passed.start(); + + if ( m_currentY >= height() ) { + slotPaintEffectNew(); + return; + } + + QImage img; + img = QPixmap::grabWindow( qt_xrootwin(), 0, + m_currentY, width(), + slice ); + bitBlt(&grabbed, 0, m_currentY, &img); + m_currentY += slice; + QTimer::singleShot(0, this, SLOT(slotGrab())); +} + +void KSMShutdownFeedback::slotPaintEffectNew() +{ + const unsigned int shift_scale = 10; + const unsigned int scale = 1 << shift_scale; + + //kdDebug() << "passed before paint " << passed.elapsed() << endl; + unsigned int current_fade = QMIN(scale, passed.elapsed() * scale / max_faded); + QImage copy; + copy.create( grabbed.size(), grabbed.depth() ); + unsigned int pixels = grabbed.width()*grabbed.height(); + QRgb *orig = ( QRgb* )grabbed.bits(); + QRgb *dest = ( QRgb* )copy.bits(); + QColor clr; + + int r, g, b, tg; + + for ( unsigned int i = 0; i < pixels; ++i ) + { + r = qRed( orig[i] ); + g = qGreen( orig[i] ); + b = qBlue( orig[i] ); + + // qGray formla + tg = (r*11 + g*16 + b*5)/32; + // make it a bit darker than gray + tg = tg - tg / 5; + + r = ( ( r << shift_scale ) + current_fade * ( tg - r ) ) >> shift_scale; + g = ( ( g << shift_scale ) + current_fade * ( tg - g ) ) >> shift_scale; + b = ( ( b << shift_scale ) + current_fade * ( tg - b ) ) >> shift_scale; + + dest[i] = qRgb(r, g, b); + } + //kdDebug() << "passed before bitBlt " << passed.elapsed() << endl; + bitBlt( this, 0, 0, ©); + //kdDebug() << "passed after bitBlt " << passed.elapsed() << endl; + + if ( current_fade >= scale ) { + if ( backgroundMode() == QWidget::NoBackground ) { + setBackgroundMode( QWidget::NoBackground ); + setBackgroundPixmap( copy ); + } + return; + } + + QTimer::singleShot( 0, this, SLOT( slotPaintEffectNew() ) ); } ////// --- ksmserver/shutdowndlg.h.sav 2006-11-28 18:18:41.000000000 +0100 +++ ksmserver/shutdowndlg.h 2006-11-28 18:23:14.000000000 +0100 @@ -9,7 +9,9 @@ Copyright (C) 2000 Matthias Ettrich #include +#include #include +#include class QPushButton; class QVButtonGroup; class QPopupMenu; @@ -31,13 +33,17 @@ protected: ~KSMShutdownFeedback() {} private slots: - void slotPaintEffect(); + void slotPaintEffectOld(); + void slotPaintEffectNew(); + void slotGrab(); private: static KSMShutdownFeedback * s_pSelf; KSMShutdownFeedback(); int m_currentY; QPixmap m_root; + QTime passed; + QImage grabbed; };