[gegl-qt/temp] TEMP: some unknown fixes/changes to processing



commit f60327125f3addd30610ed617ec2c621124fd2c1
Author: Jon Nordby <jononor gmail com>
Date:   Fri Jun 28 02:31:15 2013 +0200

    TEMP: some unknown fixes/changes to processing

 gegl-qt/internal/nodeviewimplementation.cpp |   53 ++++++++++++++++++++-------
 gegl-qt/internal/nodeviewimplementation.h   |    4 ++-
 2 files changed, 43 insertions(+), 14 deletions(-)
---
diff --git a/gegl-qt/internal/nodeviewimplementation.cpp b/gegl-qt/internal/nodeviewimplementation.cpp
index 784632c..2d69e4e 100644
--- a/gegl-qt/internal/nodeviewimplementation.cpp
+++ b/gegl-qt/internal/nodeviewimplementation.cpp
@@ -88,7 +88,6 @@ NodeViewImplementation::NodeViewImplementation(DrawMode drawTransform, QObject *
     : QObject(parent)
     , mInputNode(0)
     , processor(0)
-    , timer(new QTimer())
     , mOptions(0)
     , mViewportSize(-1.0, -1.0)
     , mDrawMode(drawTransform)
@@ -96,7 +95,7 @@ NodeViewImplementation::NodeViewImplementation(DrawMode drawTransform, QObject *
 {
     setOptions(0); // default
 
-    connect(timer, SIGNAL(timeout()), this, SLOT(processNode()));
+    connect(&mTimer, SIGNAL(timeout()), this, SLOT(processNode()));
 
     if (mDrawMode == DrawModeChildGraphicsItem) {
         connect(this, SIGNAL(viewAreaChanged(QRectF)),
@@ -106,10 +105,14 @@ NodeViewImplementation::NodeViewImplementation(DrawMode drawTransform, QObject *
 
 NodeViewImplementation::~NodeViewImplementation()
 {
-    delete timer;
     if (processor) {
         g_object_unref(processor);
     }
+
+    if (mInputNode) {
+        g_object_unref(mInputNode);
+    }
+
     delete mOptions;
     delete mChildItem;
 }
@@ -129,22 +132,34 @@ NodeViewImplementation::drawScale()
 void
 NodeViewImplementation::setInputNode(GeglNode *node)
 {
+    if (node && mInputNode == node) {
+        return;
+    }
+
     if (mInputNode) {
         g_object_unref(mInputNode);
     }
     if (processor) {
         g_object_unref(processor);
-        processor = 0;
+    }
+
+    if (!node) {
+        return;
     }
 
     mInputNode = node;
     g_object_ref(mInputNode);
 
+    GeglRectangle bbox = gegl_node_get_bounding_box(mInputNode);
+    processor = gegl_node_new_processor(mInputNode, &bbox);
+
     g_signal_connect(mInputNode, "computed",
                      G_CALLBACK (computed_event), this);
     g_signal_connect(mInputNode, "invalidated",
                      G_CALLBACK (invalidated_event), this);
 
+
+    updateAutoCenterScale();
     Q_EMIT viewAreaChanged(QRectF(0.0, 0.0, -1.0, -1.0)); // Redraws everything
 }
 
@@ -277,26 +292,38 @@ NodeViewImplementation::nodeInvalidated(GeglRectangle *rect)
         return;
     }
 
-    if (processor) {
-        gegl_processor_set_rectangle(processor, rect);
-    } else {
-        processor = gegl_node_new_processor(mInputNode, rect);
+    /* The actual processing is deferred to the mainloop. */
+    if (!mTimer.isActive()) {
+        mTimer.start();
     }
 
-    /* The actual processing is deferred to the mainloop. */
-    timer->start();
+    QRect invalidatedRect(rect->x, rect->y, rect->width, rect->height);
+    mProcessingQueue.enqueue(invalidatedRect);
 }
 
 void
 NodeViewImplementation::processNode()
 {
-    if (!processor) {
+    if (!processor && !mInputNode) {
         return;
     }
 
+    if (mCurrentlyProcessedRect.isNull()) {
+
+        if (mProcessingQueue.isEmpty()) {
+            // Stop the async worker
+            mTimer.stop();
+        } else {
+            // Process next rect
+            QRect &r = mCurrentlyProcessedRect = mProcessingQueue.dequeue();
+            GeglRectangle rect = {r.x(), r.y(), r.width(), r.height()};
+            gegl_processor_set_rectangle(processor, &rect);
+        }
+    }
+
     if (!gegl_processor_work(processor, NULL)) {
-        // All work is done
-        timer->stop();
+        mCurrentlyProcessedRect = QRect();
+        Q_ASSERT(mCurrentlyProcessedRect.isNull());
     }
 }
 
diff --git a/gegl-qt/internal/nodeviewimplementation.h b/gegl-qt/internal/nodeviewimplementation.h
index e25d390..eaea852 100644
--- a/gegl-qt/internal/nodeviewimplementation.h
+++ b/gegl-qt/internal/nodeviewimplementation.h
@@ -80,11 +80,13 @@ private:
 private:
     GeglNode *mInputNode; // The node the widget displays.
     GeglProcessor *processor; // Used to process the GeglNode when invalidated.
-    QTimer *timer; // Used to defer operations to the mainloop.
+    QTimer mTimer; // Used to defer operations to the mainloop.
     GeglQt::NodeViewOptions *mOptions;
     QSizeF mViewportSize;
     DrawMode mDrawMode;
     NodeViewChildItem *mChildItem;
+    QQueue<QRect> mProcessingQueue;
+    QRect mCurrentlyProcessedRect;
 };
 
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]