[gegl-qt/temp] TEMP: some unknown fixes/changes to processing
- From: Jon Nordby <jonnor src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl-qt/temp] TEMP: some unknown fixes/changes to processing
- Date: Thu, 27 Jun 2013 23:35:59 +0000 (UTC)
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]