[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdebase/workspace/kwin
From:       Martin Gräßlin <kde () martin-graesslin ! com>
Date:       2010-08-07 14:08:35
Message-ID: 20100807140835.41089AC7CA () svn ! kde ! org
[Download RAW message or body]

SVN commit 1160252 by graesslin:

Add cross fade support for text and icon to EffectFrame.
This allows an effect to fade between old and new text/icon. As an example it's added \
to CoverSwitch. Currently only supported in OpenGL. XRender might be added, but I'm \
missing an idea for an effect to add it. Most effects using EffectFrame require \
OpenGL anyway.

 M  +8 -0      effects.cpp  
 M  +3 -0      effects/coverswitch/coverswitch.cpp  
 M  +45 -0     lib/kwineffects.cpp  
 M  +42 -0     lib/kwineffects.h  
 M  +2 -0      scene.h  
 M  +67 -5     scene_opengl.cpp  
 M  +5 -0      scene_opengl.h  
 M  +10 -0     scene_xrender.cpp  
 M  +2 -0      scene_xrender.h  


--- trunk/KDE/kdebase/workspace/kwin/effects.cpp #1160251:1160252
@@ -1761,6 +1761,10 @@
 void EffectFrameImpl::setIcon( const QPixmap& icon )
     {
     m_icon = icon;
+    if( isCrossFade() )
+        {
+        m_sceneFrame->crossFadeIcon();
+        }
     if( m_iconSize.isEmpty() ) // Set a size if we don't already have one
         {
         setIconSize( m_icon.size() );
@@ -1838,6 +1842,10 @@
         {
         return;
         }
+    if( isCrossFade() )
+        {
+        m_sceneFrame->crossFadeText();
+        }
     m_text = text;
     QRect oldGeom = m_geometry;
     autoResize();
--- trunk/KDE/kdebase/workspace/kwin/effects/coverswitch/coverswitch.cpp \
#1160251:1160252 @@ -63,6 +63,7 @@
     captionFont.setBold( true );
     captionFont.setPointSize( captionFont.pointSize() * 2 );
     captionFrame->setFont( captionFont );
+    captionFrame->enableCrossFade( true );
     }
 
 CoverSwitchEffect::~CoverSwitchEffect()
@@ -328,6 +329,8 @@
                 opacity = timeLine.value();
             else if( stop )
                 opacity = 1.0 - timeLine.value();
+            if( animation )
+                captionFrame->setCrossFadeProgress( timeLine.value() );
             captionFrame->render( region, opacity );
         }
 
--- trunk/KDE/kdebase/workspace/kwin/lib/kwineffects.cpp #1160251:1160252
@@ -1292,16 +1292,61 @@
     }
 
 /***************************************************************
+ EffectFramePrivate
+***************************************************************/
+class EffectFramePrivate
+    {
+    public:
+        EffectFramePrivate();
+        ~EffectFramePrivate();
+
+        bool crossFading;
+        qreal crossFadeProgress;
+    };
+
+EffectFramePrivate::EffectFramePrivate()
+    : crossFading( false )
+    , crossFadeProgress( 1.0 )
+    {
+    }
+
+EffectFramePrivate::~EffectFramePrivate()
+    {
+    }
+
+/***************************************************************
  EffectFrame
 ***************************************************************/
 EffectFrame::EffectFrame()
+    : d( new EffectFramePrivate )
     {
     }
 
 EffectFrame::~EffectFrame()
     {
+    delete d;
     }
 
+qreal EffectFrame::crossFadeProgress() const
+    {
+    return d->crossFadeProgress;
+    }
+
+void EffectFrame::setCrossFadeProgress( qreal progress )
+    {
+    d->crossFadeProgress = progress;
+    }
+
+bool EffectFrame::isCrossFade() const
+    {
+    return d->crossFading;
+    }
+
+void EffectFrame::enableCrossFade( bool enable )
+    {
+    d->crossFading = enable;
+    }
+
 QColor EffectFrame::styledTextColor()
     {
     return Plasma::Theme::defaultTheme()->color( Plasma::Theme::TextColor );
--- trunk/KDE/kdebase/workspace/kwin/lib/kwineffects.h #1160251:1160252
@@ -57,6 +57,7 @@
 class EffectWindow;
 class EffectWindowGroup;
 class EffectFrame;
+class EffectFramePrivate;
 class Effect;
 class WindowQuad;
 class GLRenderTarget;
@@ -1767,6 +1768,47 @@
          * The foreground text color as specified by the default Plasma theme.
          */
         static QColor styledTextColor();
+
+        /**
+         * If @p enable is @c true cross fading between icons and text is enabled
+         * By default disabled. Use setCrossFadeProgress to cross fade.
+         * Cross Fading is currently only available if OpenGL is used.
+         * @param enable @c true enables cross fading, @c false disables it again
+         * @see isCrossFade
+         * @see setCrossFadeProgress
+         * @since 4.6
+         **/
+        void enableCrossFade( bool enable );
+        /**
+         * @returns @c true if cross fading is enabled, @c false otherwise
+         * @see enableCrossFade
+         * @since 4.6
+         **/
+        bool isCrossFade() const;
+        /**
+         * Sets the current progress for cross fading the last used icon/text
+         * with current icon/text to @p progress.
+         * A value of 0.0 means completely old icon/text, a value of 1.0 means
+         * completely current icon/text.
+         * Default value is 1.0. You have to enable cross fade before using it.
+         * Cross Fading is currently only available if OpenGL is used.
+         * @see enableCrossFade
+         * @see isCrossFade
+         * @see crossFadeProgress
+         * @since 4.6
+         **/
+        void setCrossFadeProgress( qreal progress );
+        /**
+         * @returns The current progress for cross fading
+         * @see setCrossFadeProgress
+         * @see enableCrossFade
+         * @see isCrossFade
+         * @since 4.6
+         **/
+        qreal crossFadeProgress() const;
+
+    private:
+        EffectFramePrivate* const d;
     };
 
 /**
--- trunk/KDE/kdebase/workspace/kwin/scene.h #1160251:1160252
@@ -226,6 +226,8 @@
         virtual void freeIconFrame() = 0;
         virtual void freeTextFrame() = 0;
         virtual void freeSelection() = 0;
+        virtual void crossFadeIcon() = 0;
+        virtual void crossFadeText() = 0;
 
     protected:
         EffectFrameImpl* m_effectFrame;
--- trunk/KDE/kdebase/workspace/kwin/scene_opengl.cpp #1160251:1160252
@@ -1920,7 +1920,9 @@
     : Scene::EffectFrame( frame )
     , m_texture( NULL )
     , m_textTexture( NULL )
+    , m_oldTextTexture( NULL )
     , m_iconTexture( NULL )
+    , m_oldIconTexture( NULL )
     , m_selectionTexture( NULL )
     , m_unstyledVBO( NULL )
     {
@@ -1934,7 +1936,9 @@
     {
     delete m_texture;
     delete m_textTexture;
+    delete m_oldTextTexture;
     delete m_iconTexture;
+    delete m_oldIconTexture;
     delete m_selectionTexture;
     delete m_unstyledVBO;
     }
@@ -1951,6 +1955,10 @@
     m_selectionTexture = NULL;
     delete m_unstyledVBO;
     m_unstyledVBO = NULL;
+    delete m_oldIconTexture;
+    m_oldIconTexture = NULL;
+    delete m_oldTextTexture;
+    m_oldTextTexture = NULL;
     }
 
 void SceneOpenGL::EffectFrame::freeIconFrame()
@@ -1971,6 +1979,20 @@
     m_selectionTexture = NULL;
     }
 
+void SceneOpenGL::EffectFrame::crossFadeIcon()
+    {
+    delete m_oldIconTexture;
+    m_oldIconTexture = m_iconTexture;
+    m_iconTexture = NULL;
+    }
+
+void SceneOpenGL::EffectFrame::crossFadeText()
+    {
+    delete m_oldTextTexture;
+    m_oldTextTexture = m_textTexture;
+    m_textTexture = NULL;
+    }
+
 void SceneOpenGL::EffectFrame::render( QRegion region, double opacity, double \
frameOpacity )  {
     if( m_effectFrame->geometry().isEmpty() )
@@ -2144,17 +2166,35 @@
             }
         }
 
-    if( shader )
-        shader->setUniform( "opacity", (float)opacity );
-    else
-        glColor4f( 1.0, 1.0, 1.0, opacity );
-
     // Render icon
     if( !m_effectFrame->icon().isNull() && !m_effectFrame->iconSize().isEmpty() )
         {
         QPoint topLeft( m_effectFrame->geometry().x(),
                         m_effectFrame->geometry().center().y() - \
m_effectFrame->iconSize().height() / 2 );  
+        if( m_effectFrame->isCrossFade() && m_oldIconTexture )
+            {
+            if( shader )
+                shader->setUniform( "opacity", (float)opacity * (1.0f - \
(float)m_effectFrame->crossFadeProgress()) ); +            else
+                glColor4f( 1.0, 1.0, 1.0, opacity * (1.0 - \
m_effectFrame->crossFadeProgress()) ); +
+            m_oldIconTexture->bind();
+            m_oldIconTexture->render( region, QRect( topLeft, \
m_effectFrame->iconSize() )); +            m_oldIconTexture->unbind();
+            if( shader )
+                shader->setUniform( "opacity", (float)opacity * \
(float)m_effectFrame->crossFadeProgress() ); +            else
+                glColor4f( 1.0, 1.0, 1.0, opacity * \
m_effectFrame->crossFadeProgress() ); +            }
+        else
+            {
+            if( shader )
+                shader->setUniform( "opacity", (float)opacity );
+            else
+                glColor4f( 1.0, 1.0, 1.0, opacity );
+            }
+
         if( !m_iconTexture ) // lazy creation
             {
             m_iconTexture = new Texture( m_effectFrame->icon().handle(),
@@ -2169,6 +2209,28 @@
     // Render text
     if( !m_effectFrame->text().isEmpty() )
         {
+        if( m_effectFrame->isCrossFade() && m_oldTextTexture )
+            {
+            if( shader )
+                shader->setUniform( "opacity", (float)opacity * (1.0f - \
(float)m_effectFrame->crossFadeProgress()) ); +            else
+                glColor4f( 1.0, 1.0, 1.0, opacity * (1.0 - \
m_effectFrame->crossFadeProgress()) ); +
+            m_oldTextTexture->bind();
+            m_oldTextTexture->render( region, m_effectFrame->geometry() );
+            m_oldTextTexture->unbind();
+            if( shader )
+                shader->setUniform( "opacity", (float)opacity * \
(float)m_effectFrame->crossFadeProgress() ); +            else
+                glColor4f( 1.0, 1.0, 1.0, opacity * \
m_effectFrame->crossFadeProgress() ); +            }
+        else
+            {
+            if( shader )
+                shader->setUniform( "opacity", (float)opacity );
+            else
+                glColor4f( 1.0, 1.0, 1.0, opacity );
+            }
         if( !m_textTexture ) // Lazy creation
             updateTextTexture();
         m_textTexture->bind();
--- trunk/KDE/kdebase/workspace/kwin/scene_opengl.h #1160251:1160252
@@ -180,6 +180,9 @@
 
         virtual void render(QRegion region, double opacity, double frameOpacity);
 
+        virtual void crossFadeIcon();
+        virtual void crossFadeText();
+
         static void cleanup();
 
     private:
@@ -188,7 +191,9 @@
 
         GLTexture* m_texture;
         GLTexture* m_textTexture;
+        GLTexture* m_oldTextTexture;
         GLTexture* m_iconTexture;
+        GLTexture* m_oldIconTexture;
         GLTexture* m_selectionTexture;
         GLVertexBuffer* m_unstyledVBO;
 
--- trunk/KDE/kdebase/workspace/kwin/scene_xrender.cpp #1160251:1160252
@@ -896,6 +896,16 @@
     m_selectionPicture = NULL;
     }
 
+void SceneXrender::EffectFrame::crossFadeIcon()
+    {
+    // TODO: implement me
+    }
+
+void SceneXrender::EffectFrame::crossFadeText()
+    {
+    // TODO: implement me
+    }
+
 void SceneXrender::EffectFrame::render( QRegion region, double opacity, double \
frameOpacity )  {
     if( m_effectFrame->geometry().isEmpty() )
--- trunk/KDE/kdebase/workspace/kwin/scene_xrender.h #1160251:1160252
@@ -104,6 +104,8 @@
         virtual void freeIconFrame();
         virtual void freeTextFrame();
         virtual void freeSelection();
+        virtual void crossFadeIcon();
+        virtual void crossFadeText();
         virtual void render( QRegion region, double opacity, double frameOpacity );
 
     private:


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic