summaryrefslogtreecommitdiffstats
path: root/src/ufo-forwardproject-task.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ufo-forwardproject-task.c')
-rw-r--r--src/ufo-forwardproject-task.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/ufo-forwardproject-task.c b/src/ufo-forwardproject-task.c
index fe200a8..c5c60cf 100644
--- a/src/ufo-forwardproject-task.c
+++ b/src/ufo-forwardproject-task.c
@@ -29,6 +29,7 @@
struct _UfoForwardprojectTaskPrivate {
cl_kernel kernel;
cl_mem slice_mem;
+ gfloat axis_pos;
gfloat angle_step;
guint num_projections;
};
@@ -43,6 +44,7 @@ G_DEFINE_TYPE_WITH_CODE (UfoForwardprojectTask, ufo_forwardproject_task, UFO_TYP
enum {
PROP_0,
+ PROP_AXIS_POSITION,
PROP_ANGLE_STEP,
PROP_NUM_PROJECTIONS,
N_PROPERTIES
@@ -90,6 +92,9 @@ ufo_forwardproject_task_get_requisition (UfoTask *task,
requisition->n_dims = 2;
requisition->dims[0] = in_req.dims[0];
requisition->dims[1] = priv->num_projections;
+ if (priv->axis_pos == -G_MAXFLOAT) {
+ priv->axis_pos = in_req.dims[0] / 2.0f;
+ }
}
static guint
@@ -134,7 +139,8 @@ ufo_forwardproject_task_process (UfoTask *task,
UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 0, sizeof (cl_mem), &in_mem));
UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 1, sizeof (cl_mem), &out_mem));
- UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 2, sizeof (gfloat), &priv->angle_step));
+ UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 2, sizeof (gfloat), &priv->axis_pos));
+ UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 3, sizeof (gfloat), &priv->angle_step));
ufo_profiler_call (profiler, cmd_queue, priv->kernel, 2, requisition->dims, NULL);
@@ -150,6 +156,9 @@ ufo_forwardproject_task_set_property (GObject *object,
UfoForwardprojectTaskPrivate *priv = UFO_FORWARDPROJECT_TASK_GET_PRIVATE (object);
switch (property_id) {
+ case PROP_AXIS_POSITION:
+ priv->axis_pos = g_value_get_float (value);
+ break;
case PROP_ANGLE_STEP:
priv->angle_step = g_value_get_float(value);
break;
@@ -171,6 +180,9 @@ ufo_forwardproject_task_get_property (GObject *object,
UfoForwardprojectTaskPrivate *priv = UFO_FORWARDPROJECT_TASK_GET_PRIVATE (object);
switch (property_id) {
+ case PROP_AXIS_POSITION:
+ g_value_set_float (value, priv->axis_pos);
+ break;
case PROP_ANGLE_STEP:
g_value_set_float(value, priv->angle_step);
break;
@@ -218,6 +230,13 @@ ufo_forwardproject_task_class_init (UfoForwardprojectTaskClass *klass)
gobject_class->get_property = ufo_forwardproject_task_get_property;
gobject_class->finalize = ufo_forwardproject_task_finalize;
+ properties[PROP_AXIS_POSITION] =
+ g_param_spec_float ("axis-pos",
+ "Position of rotation axis",
+ "Position of rotation axis",
+ -G_MAXFLOAT, G_MAXFLOAT, -G_MAXFLOAT,
+ G_PARAM_READWRITE);
+
properties[PROP_ANGLE_STEP] =
g_param_spec_float("angle-step",
"Increment of angle in radians",
@@ -245,6 +264,7 @@ ufo_forwardproject_task_init(UfoForwardprojectTask *self)
{
self->priv = UFO_FORWARDPROJECT_TASK_GET_PRIVATE(self);
+ self->priv->axis_pos = -G_MAXFLOAT;
self->priv->num_projections = 256;
self->priv->angle_step = 0;
}