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

List:       kde-commits
Subject:    kdenonbeta/kcanvas/device/agg
From:       Nikolas Zimmermann <wildfox () kde ! org>
Date:       2006-02-17 15:37:56
Message-ID: 1140190676.778829.29532.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 510619 by wildfox:

Cache the "internal image path" to avoid massive leakage.
Other shapes don't suffer from this problem, as KCanvasCreator
takes care of caching it for all other cases. This should
speed-up agg & images a lot - hopefully :-)

Reviewed by Rob.


 M  +31 -8     KCanvasImageItemAgg.cpp  
 M  +4 -0      KCanvasImageItemAgg.h  


--- trunk/kdenonbeta/kcanvas/device/agg/KCanvasImageItemAgg.cpp #510618:510619
@@ -32,12 +32,24 @@
 #include "KCanvasImageItemAgg.h"
 
 KCanvasImageItemAgg::KCanvasImageItemAgg(KCanvas *canvas, KRenderingStyle *style, \
                const QRectF &bounds)
-: KCanvasImageItem(canvas, style, bounds)
+: KCanvasImageItem(canvas, style, bounds), m_cachedBounds(), m_cachedPath(0)
 {
 }
 
 KCanvasImageItemAgg::~KCanvasImageItemAgg()
 {
+    if(m_cachedPath)
+    {
+        KRenderingDeviceContext *context = \
canvas()->renderingDevice()->currentContext(); +
+        KRenderingDeviceContextAgg *aggContext = \
static_cast<KRenderingDeviceContextAgg *>(context); +        Q_ASSERT(aggContext != \
0); +
+        KRenderingDeviceAgg *aggDev = static_cast<KRenderingDeviceAgg \
*>(aggContext->canvas()->renderingDevice()); +        Q_ASSERT(aggDev != 0);
+
+        aggDev->deletePath(m_cachedPath);
+    }
 }
 
 // 'Image' interface
@@ -60,15 +72,26 @@
     double x2 = bounds().right();
     double y1 = bounds().top();
     double y2 = bounds().bottom();
-    aggDev->startPath();
-    aggDev->moveTo(x1, y1);
-    aggDev->lineTo(x2, y1);
-    aggDev->lineTo(x2, y2);
-    aggDev->lineTo(x1, y2);
-    aggDev->endPath();
 
-    KCanvasAggData *aggData = static_cast<KCanvasAggData *>(aggDev->currentPath());
+    if(!m_cachedBounds.isValid() || m_cachedBounds != bounds() || !m_cachedPath)
+    {
+        if(m_cachedPath)
+             aggDev->deletePath(m_cachedPath);
+
+        aggDev->startPath();
+        aggDev->moveTo(x1, y1);
+        aggDev->lineTo(x2, y1);
+        aggDev->lineTo(x2, y2);
+        aggDev->lineTo(x1, y2);
+        aggDev->endPath();
+
+        m_cachedPath = aggDev->currentPath();
+        m_cachedBounds = bounds();
+    }
+
+    KCanvasAggData *aggData = static_cast<KCanvasAggData *>(m_cachedPath);
     Q_ASSERT(aggData != 0);
+
 //    aggData->transform = aggContext->worldTransform();
     // Update internal agg matrix respecting the object's ctm (current \
transformation matrix)  //KCanvasMatrix objectMatrix = aggContext->worldTransform();
--- trunk/kdenonbeta/kcanvas/device/agg/KCanvasImageItemAgg.h #510618:510619
@@ -32,6 +32,10 @@
     virtual ~KCanvasImageItemAgg();
 
     virtual void draw(const QRectF &rect) const;
+
+private:
+    mutable QRectF m_cachedBounds;
+    mutable KCanvasUserData m_cachedPath;
 };
 
 #endif


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

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