[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