SVN commit 701053 by eros: Faster background drawing. Speeds up a lot zooming operations and general compositing. M +3 -1 libs/plasma/svg.cpp M +20 -2 plasma/plasma/desktopview.cpp M +7 -0 plasma/plasma/plasmaapp.cpp --- trunk/KDE/kdebase/workspace/libs/plasma/svg.cpp #701052:701053 @@ -135,7 +135,9 @@ renderer->render(&renderPainter, elementId); } renderPainter.end(); - QPixmapCache::insert( id, p ); + bool inserted = QPixmapCache::insert( id, p ); + if (!inserted) + kDebug() << "pixmap cache is too small for inserting" << id << "of size" << s; } void createRenderer() --- trunk/KDE/kdebase/workspace/plasma/plasma/desktopview.cpp #701052:701053 @@ -137,11 +137,29 @@ void DesktopView::drawBackground(QPainter * painter, const QRectF & rect) { + // avoid expensive operations to the painter if there is nothing to paint + if (!m_background && !m_bitmapBackground) + return; + + // draw the background untransformed (saves lots of per-pixel-math) + painter->save(); + painter->resetTransform(); + // blit the background (saves all the per-pixel-products that blending does) + painter->setCompositionMode(QPainter::CompositionMode_Source); + if (m_background) { - m_background->paint(painter, rect); + // Plasma::Svg doesn't support drawing only part of the image (it only + // supports drawing the whole image to a rect), so we blit to 0,0-w,h + m_background->paint(painter, 0, 0); } else if (m_bitmapBackground) { - painter->drawPixmap(rect, *m_bitmapBackground, rect); + // for pixmaps we draw only the exposed part (untransformed since the + // bitmapBackground already has the size of the viewport) + QRect exposedRect = mapFromScene(rect).boundingRect(); + painter->drawPixmap(exposedRect, *m_bitmapBackground, exposedRect); } + + // restore transformation and composition mode + painter->restore(); } void DesktopView::resizeEvent(QResizeEvent* event) --- trunk/KDE/kdebase/workspace/plasma/plasma/plasmaapp.cpp #701052:701053 @@ -26,6 +26,7 @@ #include "appadaptor.h" #include +#include #include #include @@ -72,6 +73,12 @@ setCrashHandler(); } + // enlarge application pixmap cache (TODO: make this dependand on system + // memory and screen resolution. 8MB is ok for caching the background up + // to 1600x1200 resolution) + if (QPixmapCache::cacheLimit() < 8192) + QPixmapCache::setCacheLimit(8192); + m_root = new RootWidget(); m_root->setAsDesktop(KCmdLineArgs::parsedArgs()->isSet("desktop"));