summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomas Farago <sensej007@email.cz>2020-04-08 09:38:01 +0200
committerTomas Farago <sensej007@email.cz>2020-04-08 09:38:01 +0200
commitb478c4abdeba59edc1ac4680d86245602ab3dab0 (patch)
treeee9f9f536aa83baa6f4b41124f83fd5ce1bb2134
parent2f2dbf96c3075de062e73c655708af516773110c (diff)
downloadufo-filters-b478c4abdeba59edc1ac4680d86245602ab3dab0.tar.gz
ufo-filters-b478c4abdeba59edc1ac4680d86245602ab3dab0.tar.bz2
ufo-filters-b478c4abdeba59edc1ac4680d86245602ab3dab0.tar.xz
ufo-filters-b478c4abdeba59edc1ac4680d86245602ab3dab0.zip
sliding-stack: allow ordering items
-rw-r--r--src/ufo-sliding-stack-task.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/ufo-sliding-stack-task.c b/src/ufo-sliding-stack-task.c
index eb012bf..dbc2d75 100644
--- a/src/ufo-sliding-stack-task.c
+++ b/src/ufo-sliding-stack-task.c
@@ -23,6 +23,7 @@
struct _UfoSlidingStackTaskPrivate {
guint n_items;
+ gboolean ordered;
guint current;
guint8 *window;
};
@@ -38,6 +39,7 @@ G_DEFINE_TYPE_WITH_CODE (UfoSlidingStackTask, ufo_sliding_stack_task, UFO_TYPE_T
enum {
PROP_0,
PROP_NUM_ITEMS,
+ PROP_ORDERED,
N_PROPERTIES
};
@@ -110,7 +112,7 @@ ufo_sliding_stack_task_process (UfoTask *task,
guint8 *in_mem;
guint8 *out_mem;
gsize size, window_size;
- guint i;
+ guint i, j;
priv = UFO_SLIDING_STACK_TASK_GET_PRIVATE (task);
@@ -132,7 +134,14 @@ ufo_sliding_stack_task_process (UfoTask *task,
* replace even indices in one output buffer and odd in the other. So we
* need to keep a copy of the input locally and copy to the output.
* TODO: improve this on a lower level in ufo-core. */
- memcpy (out_mem, priv->window, window_size);
+ if (priv->ordered) {
+ j = priv->current;
+ for (i = 0; i < priv->n_items; i++, j++) {
+ memcpy (out_mem + i * size, priv->window + j % priv->n_items * size, size);
+ }
+ } else {
+ memcpy (out_mem, priv->window, window_size);
+ }
return TRUE;
}
@@ -150,6 +159,9 @@ ufo_sliding_stack_task_set_property (GObject *object,
case PROP_NUM_ITEMS:
priv->n_items = g_value_get_uint (value);
break;
+ case PROP_ORDERED:
+ priv->ordered = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -168,6 +180,9 @@ ufo_sliding_stack_task_get_property (GObject *object,
case PROP_NUM_ITEMS:
g_value_set_uint (value, priv->n_items);
break;
+ case PROP_ORDERED:
+ g_value_set_boolean (value, priv->ordered);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -216,6 +231,12 @@ ufo_sliding_stack_task_class_init (UfoSlidingStackTaskClass *klass)
1, G_MAXUINT, 1,
G_PARAM_READWRITE);
+ properties[PROP_ORDERED] =
+ g_param_spec_boolean ("ordered",
+ "Order items in the sliding window",
+ "Order items in the sliding window",
+ FALSE, G_PARAM_READWRITE);
+
for (guint i = PROP_0 + 1; i < N_PROPERTIES; i++)
g_object_class_install_property (oclass, i, properties[i]);
@@ -227,5 +248,6 @@ ufo_sliding_stack_task_init(UfoSlidingStackTask *self)
{
self->priv = UFO_SLIDING_STACK_TASK_GET_PRIVATE(self);
self->priv->n_items = 1;
+ self->priv->ordered = FALSE;
self->priv->window = NULL;
}