don't merge pixmaps when it's not required
[enigma2.git] / lib / gui / ewidgetdesktop.cpp
index 04bc85d9059b7b7edb9d57bf9ec764f8f95e1e7f..eaaa81c88ea0f058ee7993f971380378c8de0796 100644 (file)
@@ -5,18 +5,27 @@
 
 extern void dumpRegion(const gRegion &region);
 
-void eWidgetDesktop::addRootWidget(eWidget *root, int top)
+void eWidgetDesktop::addRootWidget(eWidget *root)
 {
        assert(!root->m_desktop);
        
+       int invert_sense = 0;
                /* buffered mode paints back-to-front, while immediate mode is front-to-back. */
        if (m_comp_mode == cmBuffered)
-               top = !top;
+               invert_sense = 1;
+       
+       ePtrList<eWidget>::iterator insert_position = m_root.begin();
+       
+       for (;;)
+       {
+               if ((insert_position == m_root.end()) || (invert_sense ^ (insert_position->m_z_position < root->m_z_position)))
+               {
+                       m_root.insert(insert_position, root);
+                       break;
+               }
+               ++insert_position;
+       }
        
-       if (top)
-               m_root.push_back(root);
-       else
-               m_root.push_front(root);
        root->m_desktop = this;
 
                /* the creation will be postponed. */
@@ -290,14 +299,17 @@ void eWidgetDesktop::makeCompatiblePixmap(gPixmap &pm)
                return;
        }
 
-       ePtr<gDC> pixmap_dc = new gDC(&pm);
-       gPainter pixmap_painter(pixmap_dc);
-       
        ePtr<gPixmap> target_pixmap;
        m_screen.m_dc->getPixmap(target_pixmap);
        
        assert(target_pixmap);
        
+       if (target_pixmap->surface && target_pixmap->surface->bpp > 8)
+               return;
+
+       ePtr<gDC> pixmap_dc = new gDC(&pm);
+       gPainter pixmap_painter(pixmap_dc);
+       
        pixmap_painter.mergePalette(target_pixmap);
 }