Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37892412
en ru br
Репозитории ALT
5.1: 3.5.10-alt20.M51.2
4.1: 3.5.10-alt16.M41.1
4.0: 3.5.9-alt1.M40.1
3.0: 3.4.1-alt12
+updates:3.4.1-alt12.1.M30
+backports:3.5.6-alt7.0.M30
www.altlinux.org/Changes

Группа :: Графические оболочки/KDE
Пакет: kdebase

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: mach_blass_legacy.diff
Скачать


--- ksmserver/shutdowndlg.cpp	2005/12/21 12:31:45	1.37
+++ ksmserver/shutdowndlg.cpp	2005/12/21 12:50:31
@@ -34,6 +34,7 @@
 #include <kuser.h>
 #include <kpixmap.h>
 #include <kimageeffect.h>
+#include <kpixmapeffect.h>
 #include <kdialog.h>
 #include <kseparator.h>
 
@@ -47,6 +48,9 @@
 
 #include "shutdowndlg.moc"
 
+static const int max_faded = 2300;
+static const int slice = 20;
+
 KSMShutdownFeedback * KSMShutdownFeedback::s_pSelf = 0L;
 
 KSMShutdownFeedback::KSMShutdownFeedback()
@@ -54,32 +58,86 @@
    m_currentY( 0 )
 {
     setBackgroundMode( QWidget::NoBackground );
-    setGeometry( QApplication::desktop()->geometry() );
-    QTimer::singleShot( 10, this, SLOT( slotPaintEffect() ) );
-    m_root.resize( width(), height() );
+    QRect geo( QApplication::desktop()->geometry() );
+    setGeometry( geo );
+    int dep = QPixmap::defaultDepth();
+    if (dep == 24 || dep == 16)
+        dep = 32;
+    grabbed.create( geo.size(), dep);
+    QTimer::singleShot( 0, this, SLOT( slotGrab() ) );
+}
+
+void KSMShutdownFeedback::slotGrab()
+{
+    // we start the passed early
+    if ( m_currentY * 4 >= height() * 3 && passed.isNull())
+        passed.start();
+
+    if ( m_currentY >= height() ) {
+        slotPaintEffect();
+        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::slotPaintEffect()
 {
-    if ( m_currentY >= height() ) {
-        if ( backgroundMode() == QWidget::NoBackground ) {
-            setBackgroundMode( QWidget::NoBackground );
-            setBackgroundPixmap( m_root );
+    const unsigned int shift_scale = 10;
+    const unsigned int scale = 1 << shift_scale;
+
+    //kdDebug() << "passed before paint " << passed.elapsed() << endl;
+    int current_fade = QMIN(scale, passed.elapsed() * scale / max_faded);
+    QImage copy;
+    if ( grabbed.depth() == 32 ) {
+        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 h, s, v;
+
+        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);
         }
-        return;
+
+    } else {
+        // old code - now used for 8bit
+        copy = grabbed;
+        copy = KImageEffect::desaturate(copy, current_fade);
+        copy = KImageEffect::fade(copy, 0.1 * current_fade, Qt::black);
     }
+    //kdDebug() << "passed before bitBlt " << passed.elapsed() << endl;
+    bitBlt( this, 0, 0, &copy);
+    //kdDebug() << "passed after bitBlt " << passed.elapsed() << endl;
+
+    if ( current_fade >= scale )
+         return;
 
-    KPixmap pixmap;
-    pixmap = QPixmap::grabWindow( qt_xrootwin(), 0, m_currentY, width(), 10 );
-    QImage image = pixmap.convertToImage();
-    KImageEffect::blend( Qt::black, image, 0.4 );
-    KImageEffect::toGray( image, true );
-    pixmap.convertFromImage( image );
-    bitBlt( this, 0, m_currentY, &pixmap );
-    bitBlt( &m_root, 0, m_currentY, &pixmap );
-    m_currentY += 10;
-    QTimer::singleShot( 1, this, SLOT( slotPaintEffect() ) );
+    QTimer::singleShot( 0, this, SLOT( slotPaintEffect() ) );
 }
 
 //////
--- ksmserver/shutdowndlg.h	2005/12/21 12:22:05	1.3
+++ ksmserver/shutdowndlg.h	2005/12/21 12:51:36
@@ -9,7 +9,9 @@
 
 #include <qpixmap.h>
 #include <qdialog.h>
+#include <qdatetime.h>
 #include <kpushbutton.h>
+#include <qimage.h>
 class QPushButton;
 class QVButtonGroup;
 class QPopupMenu;
@@ -32,12 +34,14 @@
 
 private slots:
     void slotPaintEffect();
+    void slotGrab();
 
 private:
     static KSMShutdownFeedback * s_pSelf;
     KSMShutdownFeedback();
     int m_currentY;
-    QPixmap m_root;
+    QTime passed;
+    QImage grabbed;
 };
 
 
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin