summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Poulain <benjamin.poulain@nokia.com>2010-02-15 13:35:50 (GMT)
committerBenjamin Poulain <benjamin.poulain@nokia.com>2010-02-15 14:03:15 (GMT)
commit1a5c3af0f3e75a518c27c6bdd3f58896a49b167e (patch)
treef23ec6c187335bcd77c5469184463cfdb6d52c63
parentc1fe9ae25aebc8d1b9c4a7f3e67fa25ecdcbadc8 (diff)
downloadQt-1a5c3af0f3e75a518c27c6bdd3f58896a49b167e.zip
Qt-1a5c3af0f3e75a518c27c6bdd3f58896a49b167e.tar.gz
Qt-1a5c3af0f3e75a518c27c6bdd3f58896a49b167e.tar.bz2
Update the composition demo at 60 FPS instead of at painting rate
The Composition demo was updating as fast as the possible (update was called in the paint event). This is very CPU intensive, making the demo look slow on slower computer. The update is now made with a 16ms interval. Reviewed-by: Gabriel de Dietrich
-rw-r--r--demos/composition/composition.cpp35
-rw-r--r--demos/composition/composition.h13
2 files changed, 38 insertions, 10 deletions
diff --git a/demos/composition/composition.cpp b/demos/composition/composition.cpp
index e03f3e6..deca5dc 100644
--- a/demos/composition/composition.cpp
+++ b/demos/composition/composition.cpp
@@ -48,6 +48,8 @@
#include <QMouseEvent>
#include <qmath.h>
+const int animationInterval = 15; // update every 16 ms = ~60FPS
+
CompositionWidget::CompositionWidget(QWidget *parent)
: QWidget(parent)
{
@@ -236,6 +238,7 @@ CompositionRenderer::CompositionRenderer(QWidget *parent)
: ArthurFrame(parent)
{
m_animation_enabled = true;
+ m_animationTimer = startTimer(animationInterval);
#ifdef Q_WS_QWS
m_image = QPixmap(":res/composition/flower.jpg");
m_image.setAlphaChannel(QPixmap(":res/composition/flower_alpha.jpg"));
@@ -264,6 +267,20 @@ QRectF rectangle_around(const QPointF &p, const QSizeF &size = QSize(250, 200))
return rect;
}
+void CompositionRenderer::setAnimationEnabled(bool enabled)
+{
+ if (m_animation_enabled == enabled)
+ return;
+ m_animation_enabled = enabled;
+ if (enabled) {
+ Q_ASSERT(!m_animationTimer);
+ m_animationTimer = startTimer(animationInterval);
+ } else {
+ killTimer(m_animationTimer);
+ m_animationTimer = 0;
+ }
+}
+
void CompositionRenderer::updateCirclePos()
{
if (m_current_object != NoObject)
@@ -471,10 +488,6 @@ void CompositionRenderer::paint(QPainter *painter)
painter->drawImage(0, 0, m_buffer);
#endif
}
-
- if (m_animation_enabled && m_current_object == NoObject) {
- updateCirclePos();
- }
}
void CompositionRenderer::mousePressEvent(QMouseEvent *e)
@@ -489,6 +502,10 @@ void CompositionRenderer::mousePressEvent(QMouseEvent *e)
} else {
m_current_object = NoObject;
}
+ if (m_animation_enabled) {
+ killTimer(m_animationTimer);
+ m_animationTimer = 0;
+ }
}
void CompositionRenderer::mouseMoveEvent(QMouseEvent *e)
@@ -500,7 +517,15 @@ void CompositionRenderer::mouseReleaseEvent(QMouseEvent *)
{
m_current_object = NoObject;
- if (m_animation_enabled)
+ if (m_animation_enabled) {
+ Q_ASSERT(!m_animationTimer);
+ m_animationTimer = startTimer(animationInterval);
+ }
+}
+
+void CompositionRenderer::timerEvent(QTimerEvent *event)
+{
+ if (event->timerId() == m_animationTimer)
updateCirclePos();
}
diff --git a/demos/composition/composition.h b/demos/composition/composition.h
index 1123531..f5a9fc3 100644
--- a/demos/composition/composition.h
+++ b/demos/composition/composition.h
@@ -109,10 +109,6 @@ public:
void paint(QPainter *);
- void mousePressEvent(QMouseEvent *);
- void mouseMoveEvent(QMouseEvent *);
- void mouseReleaseEvent(QMouseEvent *);
-
void setCirclePos(const QPointF &pos);
QSize sizeHint() const { return QSize(500, 400); }
@@ -121,6 +117,12 @@ public:
int circleColor() const { return m_circle_hue; }
int circleAlpha() const { return m_circle_alpha; }
+protected:
+ void mousePressEvent(QMouseEvent *);
+ void mouseMoveEvent(QMouseEvent *);
+ void mouseReleaseEvent(QMouseEvent *);
+ void timerEvent(QTimerEvent *);
+
public slots:
void setClearMode() { m_composition_mode = QPainter::CompositionMode_Clear; update(); }
void setSourceMode() { m_composition_mode = QPainter::CompositionMode_Source; update(); }
@@ -150,7 +152,7 @@ public slots:
void setCircleAlpha(int alpha) { m_circle_alpha = alpha; update(); }
void setCircleColor(int hue) { m_circle_hue = hue; update(); }
- void setAnimationEnabled(bool enabled) { m_animation_enabled = enabled; update(); }
+ void setAnimationEnabled(bool enabled);
private:
void updateCirclePos();
@@ -177,6 +179,7 @@ private:
ObjectType m_current_object;
bool m_animation_enabled;
+ int m_animationTimer;
#ifdef QT_OPENGL_SUPPORT
QGLPixelBuffer *m_pbuffer;