diff options
-rw-r--r-- | docs/filters.rst | 4 | ||||
-rw-r--r-- | src/ufo-stack-task.c | 26 |
2 files changed, 26 insertions, 4 deletions
diff --git a/docs/filters.rst b/docs/filters.rst index 5227f3b..f2b32ec 100644 --- a/docs/filters.rst +++ b/docs/filters.rst @@ -751,7 +751,9 @@ Stacking .. gobj:class:: stack Symmetrical to the slice filter, the stack filter stacks two-dimensional - input. + input. If ``number`` is not a divisor of the number of input images, the + last produced stack at index which starts to exceed the number of input + images will contain arbitrary images from the previous iterations. .. gobj:prop:: number:uint diff --git a/src/ufo-stack-task.c b/src/ufo-stack-task.c index b8a5446..0d35dad 100644 --- a/src/ufo-stack-task.c +++ b/src/ufo-stack-task.c @@ -25,6 +25,8 @@ struct _UfoStackTaskPrivate { guint n_items; guint current; + gboolean inputs_stopped; + gboolean finished; gboolean generated; }; @@ -113,12 +115,11 @@ ufo_stack_task_process (UfoTask *task, size = ufo_buffer_get_size (inputs[0]); in_mem = (guint8 *) ufo_buffer_get_host_array (inputs[0], NULL); out_mem = (guint8 *) ufo_buffer_get_host_array (output, NULL); - memcpy (out_mem + priv->current * size, in_mem, size); + memcpy (out_mem + (priv->current % priv->n_items) * size, in_mem, size); priv->current++; - if (priv->current == priv->n_items) { + if (priv->current % priv->n_items == 0) { // g_warning ("StackTask: stack full, ready for generating. [current %d]", priv->current); - priv->current = 0; priv->generated = FALSE; return FALSE; } @@ -135,6 +136,15 @@ ufo_stack_task_generate (UfoTask *task, priv = UFO_STACK_TASK_GET_PRIVATE (task); + if (priv->inputs_stopped && !priv->finished) { + /* If the inputs stopped and n_items is not a divisor of the length of + * the input stream, force generation to make sure the last chunk of + * data is produced, even though with invalid last elements (leftovers + * from previous stack filling) */ + priv->generated = FALSE; + priv->finished = TRUE; + } + if (!priv->generated) { priv->generated = TRUE; return TRUE; @@ -144,6 +154,13 @@ ufo_stack_task_generate (UfoTask *task, } } +static void inputs_stopped_callback (UfoTask *task) +{ + UfoStackTaskPrivate *priv = UFO_STACK_TASK_GET_PRIVATE (task); + + priv->inputs_stopped = TRUE; +} + static void ufo_stack_task_set_property (GObject *object, guint property_id, @@ -225,4 +242,7 @@ ufo_stack_task_init(UfoStackTask *self) { self->priv = UFO_STACK_TASK_GET_PRIVATE(self); self->priv->n_items = 1; + self->priv->inputs_stopped = FALSE; + self->priv->finished = FALSE; + g_signal_connect (self, "inputs_stopped", (GCallback) inputs_stopped_callback, NULL); } |