mirror of https://github.com/GNOME/gimp.git
gimpoperationcage: now inherit from GeglOperationComposer, to have an aux buffer for the coef
This commit is contained in:
parent
670a20de05
commit
09ce431e7d
|
@ -27,24 +27,32 @@
|
|||
#include "libgimpmath/gimpmath.h"
|
||||
|
||||
#include "gimpoperationcage.h"
|
||||
#include "gimpcageconfig.h"
|
||||
|
||||
// FIXME: for test
|
||||
#include <stdio.h>
|
||||
|
||||
static void gimp_operation_cage_finalize (GObject *object);
|
||||
static void gimp_operation_cage_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gimp_operation_cage_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gimp_operation_cage_prepare (GeglOperation *operation);
|
||||
static gboolean gimp_operation_cage_process (GeglOperation *operation,
|
||||
GeglBuffer *in_buf,
|
||||
GeglBuffer *aux_buf,
|
||||
GeglBuffer *out_buf,
|
||||
const GeglRectangle *roi);
|
||||
static void gimp_operation_cage_prepare (GeglOperation *operation);
|
||||
GeglRectangle gimp_operation_cage_get_cached_region (GeglOperation *operation,
|
||||
const GeglRectangle *roi);
|
||||
GeglRectangle
|
||||
gimp_operation_cage_get_required_for_output (GeglOperation *operation,
|
||||
const gchar *input_pad,
|
||||
const GeglRectangle *roi);
|
||||
GeglRectangle gimp_operation_cage_get_required_for_output (GeglOperation *operation,
|
||||
const gchar *input_pad,
|
||||
const GeglRectangle *roi);
|
||||
|
||||
G_DEFINE_TYPE (GimpOperationCage, gimp_operation_cage,
|
||||
GEGL_TYPE_OPERATION_FILTER)
|
||||
GEGL_TYPE_OPERATION_COMPOSER)
|
||||
|
||||
#define parent_class gimp_operation_cage_parent_class
|
||||
|
||||
|
@ -52,11 +60,13 @@ G_DEFINE_TYPE (GimpOperationCage, gimp_operation_cage,
|
|||
static void
|
||||
gimp_operation_cage_class_init (GimpOperationCageClass *klass)
|
||||
{
|
||||
GeglOperationClass *operation_class;
|
||||
GeglOperationFilterClass *filter_class;
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GeglOperationClass *operation_class = GEGL_OPERATION_CLASS (klass);
|
||||
GeglOperationComposerClass *composer_class = GEGL_OPERATION_COMPOSER_CLASS (klass);
|
||||
|
||||
operation_class = GEGL_OPERATION_CLASS (klass);
|
||||
filter_class = GEGL_OPERATION_FILTER_CLASS (klass);
|
||||
object_class->get_property = gimp_operation_cage_get_property;
|
||||
object_class->set_property = gimp_operation_cage_set_property;
|
||||
object_class->finalize = gimp_operation_cage_finalize;
|
||||
|
||||
/* FIXME: wrong categories and name, to appears in the gegl tool */
|
||||
operation_class->name = "gegl:cage";
|
||||
|
@ -69,68 +79,79 @@ gimp_operation_cage_class_init (GimpOperationCageClass *klass)
|
|||
operation_class->get_cached_region = gimp_operation_cage_get_cached_region;
|
||||
operation_class->no_cache = FALSE;
|
||||
|
||||
filter_class->process = gimp_operation_cage_process;
|
||||
composer_class->process = gimp_operation_cage_process;
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
GIMP_OPERATION_CAGE_PROP_CONFIG,
|
||||
g_param_spec_object ("config", NULL, NULL,
|
||||
GIMP_TYPE_CAGE_CONFIG,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT));
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_operation_cage_init (GimpOperationCage *self)
|
||||
{
|
||||
//FIXME: for test
|
||||
self->cage = g_object_new (GIMP_TYPE_CAGE, NULL);
|
||||
|
||||
#if 0
|
||||
|
||||
#if 0
|
||||
gimp_cage_add_cage_point(self->cage, 70, 20);
|
||||
gimp_cage_add_cage_point(self->cage, 70, 300);
|
||||
gimp_cage_add_cage_point(self->cage, 450, 300);
|
||||
gimp_cage_add_cage_point(self->cage, 450, 20);
|
||||
|
||||
gimp_cage_move_cage_point_d (self->cage, 1, 100, 250);
|
||||
|
||||
#else
|
||||
|
||||
gimp_cage_add_cage_point(self->cage, 450, 20); /* need reverse */
|
||||
gimp_cage_add_cage_point(self->cage, 450, 300);
|
||||
gimp_cage_add_cage_point(self->cage, 70, 300);
|
||||
gimp_cage_add_cage_point(self->cage, 70, 20);
|
||||
|
||||
gimp_cage_move_cage_point_d (self->cage, 2, 100, 250);
|
||||
gimp_cage_move_cage_point_d (self->cage, 1, 750, 550);
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#if 1
|
||||
gimp_cage_add_cage_point(self->cage, 160, 160); /* need reverse */
|
||||
gimp_cage_add_cage_point(self->cage, 250, 160);
|
||||
gimp_cage_add_cage_point(self->cage, 250, 280);
|
||||
gimp_cage_add_cage_point(self->cage, 340, 280);
|
||||
gimp_cage_add_cage_point(self->cage, 340, 160);
|
||||
gimp_cage_add_cage_point(self->cage, 430, 160);
|
||||
gimp_cage_add_cage_point(self->cage, 430, 460);
|
||||
gimp_cage_add_cage_point(self->cage, 160, 460);
|
||||
|
||||
//gimp_cage_move_cage_point_d (self->cage, 6, 500, 500);
|
||||
|
||||
#else
|
||||
|
||||
gimp_cage_add_cage_point(self->cage, 160, 460);
|
||||
gimp_cage_add_cage_point(self->cage, 430, 460);
|
||||
gimp_cage_add_cage_point(self->cage, 430, 160);
|
||||
gimp_cage_add_cage_point(self->cage, 340, 160);
|
||||
gimp_cage_add_cage_point(self->cage, 340, 280);
|
||||
gimp_cage_add_cage_point(self->cage, 250, 280);
|
||||
gimp_cage_add_cage_point(self->cage, 250, 160);
|
||||
gimp_cage_add_cage_point(self->cage, 160, 160);
|
||||
|
||||
gimp_cage_move_cage_point_d (self->cage, 1, 500, 500);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_operation_cage_finalize (GObject *object)
|
||||
{
|
||||
GimpOperationCage *self = GIMP_OPERATION_CAGE (object);
|
||||
|
||||
if (self->config)
|
||||
{
|
||||
g_object_unref (self->config);
|
||||
self->config = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_operation_cage_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GimpOperationCage *self = GIMP_OPERATION_CAGE (object);
|
||||
|
||||
switch (property_id)
|
||||
{
|
||||
case GIMP_OPERATION_CAGE_PROP_CONFIG:
|
||||
g_value_set_object (value, self->config);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_operation_cage_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GimpOperationCage *self = GIMP_OPERATION_CAGE (object);
|
||||
|
||||
switch (property_id)
|
||||
{
|
||||
case GIMP_OPERATION_CAGE_PROP_CONFIG:
|
||||
if (self->config)
|
||||
g_object_unref (self->config);
|
||||
self->config = g_value_dup_object (value);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gimp_operation_cage_prepare (GeglOperation *operation)
|
||||
{
|
||||
|
@ -141,35 +162,35 @@ gimp_operation_cage_prepare (GeglOperation *operation)
|
|||
static gboolean
|
||||
gimp_operation_cage_process (GeglOperation *operation,
|
||||
GeglBuffer *in_buf,
|
||||
GeglBuffer *aux_buf,
|
||||
GeglBuffer *out_buf,
|
||||
const GeglRectangle *roi)
|
||||
{
|
||||
GimpOperationCage *op_cage = GIMP_OPERATION_CAGE (operation);
|
||||
GimpCage *cage = op_cage->cage;
|
||||
GimpOperationCage *oc = GIMP_OPERATION_CAGE (operation);
|
||||
GimpCageConfig *config = GIMP_CAGE_CONFIG (oc->config);
|
||||
|
||||
Babl *format_io = babl_format ("RGBA float");
|
||||
Babl *format_coef = babl_format_n (babl_type ("float"), op_cage->cage->cage_vertice_number);
|
||||
Babl *format_coef = babl_format_n (babl_type ("float"), 2 * config->cage_vertice_number);
|
||||
|
||||
gint in, coef_vertices, coef_edges;
|
||||
gint in_index, coef_index, dest_index;
|
||||
gint i;
|
||||
|
||||
GeglRectangle rect;
|
||||
GeglRectangle rect, bb_cage;
|
||||
GeglBufferIterator *it;
|
||||
|
||||
rect.height = 1;
|
||||
rect.width = 1;
|
||||
|
||||
gimp_cage_compute_coefficient (cage);
|
||||
bb_cage = gimp_cage_config_get_bounding_box (config);
|
||||
|
||||
it = gegl_buffer_iterator_new (in_buf, roi, format_io, GEGL_BUFFER_READ);
|
||||
in = 0;
|
||||
it = gegl_buffer_iterator_new (in_buf, &bb_cage, format_io, GEGL_BUFFER_READ);
|
||||
in_index = 0;
|
||||
|
||||
coef_vertices = gegl_buffer_iterator_add (it, cage->cage_vertices_coef, &cage->bounding_box, format_coef, GEGL_BUFFER_READ);
|
||||
coef_edges = gegl_buffer_iterator_add (it, cage->cage_edges_coef, &cage->bounding_box, format_coef, GEGL_BUFFER_READ);
|
||||
|
||||
coef_index = gegl_buffer_iterator_add (it, aux_buf, &bb_cage, format_coef, GEGL_BUFFER_READ);
|
||||
dest_index = gegl_buffer_iterator_add (it, out_buf, &bb_cage, format_io, GEGL_BUFFER_WRITE);
|
||||
|
||||
/* pre-copy the input buffer to the out buffer */
|
||||
/*gegl_buffer_copy (in_buf, roi, out_buf, roi);*/
|
||||
//gegl_buffer_copy (aux_buf, roi, out_buf, roi);
|
||||
|
||||
/* iterate on GeglBuffer */
|
||||
while (gegl_buffer_iterator_next (it))
|
||||
|
@ -178,10 +199,11 @@ gimp_operation_cage_process (GeglOperation *operation,
|
|||
gint n_pixels = it->length;
|
||||
gint x = it->roi->x; /* initial x */
|
||||
gint y = it->roi->y; /* and y coordinates */
|
||||
gint cvn = config->cage_vertice_number;
|
||||
|
||||
gfloat *source = it->data[in];
|
||||
gfloat *coef_v = it->data[coef_vertices];
|
||||
gfloat *coef_e = it->data[coef_edges];
|
||||
gfloat *source = it->data[in_index];
|
||||
gfloat *coef = it->data[coef_index];
|
||||
gfloat *dest = it->data[dest_index];
|
||||
|
||||
while(n_pixels--)
|
||||
{
|
||||
|
@ -191,16 +213,16 @@ gimp_operation_cage_process (GeglOperation *operation,
|
|||
pos_x = 0;
|
||||
pos_y = 0;
|
||||
|
||||
for(i = 0; i < cage->cage_vertice_number; i++)
|
||||
for(i = 0; i < cvn; i++)
|
||||
{
|
||||
pos_x += coef_v[i] * cage->cage_vertices_d[i].x;
|
||||
pos_y += coef_v[i] * cage->cage_vertices_d[i].y;
|
||||
pos_x += coef[i] * config->cage_vertices_d[i].x;
|
||||
pos_y += coef[i] * config->cage_vertices_d[i].y;
|
||||
}
|
||||
|
||||
for(i = 0; i < cage->cage_vertice_number; i++)
|
||||
for(i = 0; i < cvn; i++)
|
||||
{
|
||||
pos_x += coef_e[i] * cage->scaling_factor[i] * gimp_cage_get_edge_normal (cage, i).x;
|
||||
pos_y += coef_e[i] * cage->scaling_factor[i] * gimp_cage_get_edge_normal (cage, i).y;
|
||||
pos_x += coef[i + cvn] * config->scaling_factor[i] * gimp_cage_config_get_edge_normal (config, i).x;
|
||||
pos_y += coef[i + cvn] * config->scaling_factor[i] * gimp_cage_config_get_edge_normal (config, i).y;
|
||||
}
|
||||
|
||||
rect.x = (gint) rint(pos_x);
|
||||
|
@ -215,15 +237,20 @@ gimp_operation_cage_process (GeglOperation *operation,
|
|||
}*/
|
||||
|
||||
/* copy the source pixel in the out buffer */
|
||||
gegl_buffer_set(out_buf,
|
||||
&rect,
|
||||
format_io,
|
||||
source,
|
||||
GEGL_AUTO_ROWSTRIDE);
|
||||
//gegl_buffer_set(out_buf,
|
||||
//&rect,
|
||||
//format_io,
|
||||
//source,
|
||||
//GEGL_AUTO_ROWSTRIDE);
|
||||
|
||||
//printf("x: %d pos_x: %f y: %d pos_y: %f \n",x,pos_x,y,pos_y);
|
||||
|
||||
dest[RED] = coef[0];
|
||||
dest[GREEN] = coef[1];
|
||||
dest[BLUE] = coef[2]; //coef[2]; //(pos_x - x) / 500000;
|
||||
|
||||
source += 4;
|
||||
coef_v += cage->cage_vertice_number;
|
||||
coef_e += cage->cage_vertice_number;
|
||||
coef += 2 * cvn;
|
||||
|
||||
/* update x and y coordinates */
|
||||
x++;
|
||||
|
@ -249,10 +276,10 @@ gimp_operation_cage_get_cached_region (GeglOperation *operation,
|
|||
|
||||
GeglRectangle
|
||||
gimp_operation_cage_get_required_for_output (GeglOperation *operation,
|
||||
const gchar *input_pad,
|
||||
const GeglRectangle *roi)
|
||||
const gchar *input_pad,
|
||||
const GeglRectangle *roi)
|
||||
{
|
||||
GeglRectangle result = *gegl_operation_source_get_bounding_box (operation, "input");
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,8 +21,13 @@
|
|||
#define __GIMP_OPERATION_CAGE_H__
|
||||
|
||||
#include <gegl-plugin.h>
|
||||
#include <operation/gegl-operation-filter.h>
|
||||
#include "core/gimpcage.h"
|
||||
#include <operation/gegl-operation-composer.h>
|
||||
|
||||
enum
|
||||
{
|
||||
GIMP_OPERATION_CAGE_PROP_0,
|
||||
GIMP_OPERATION_CAGE_PROP_CONFIG
|
||||
};
|
||||
|
||||
#define GIMP_TYPE_OPERATION_CAGE (gimp_operation_cage_get_type ())
|
||||
#define GIMP_OPERATION_CAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_CAGE, GimpOperationCage))
|
||||
|
@ -36,15 +41,14 @@ typedef struct _GimpOperationCageClass GimpOperationCageClass;
|
|||
|
||||
struct _GimpOperationCage
|
||||
{
|
||||
GeglOperationFilter parent_instance;
|
||||
GeglOperationComposer parent_instance;
|
||||
|
||||
/* FIXME: for test */
|
||||
GimpCage *cage;
|
||||
GimpCageConfig *config;
|
||||
};
|
||||
|
||||
struct _GimpOperationCageClass
|
||||
{
|
||||
GeglOperationFilterClass parent_class;
|
||||
GeglOperationComposerClass parent_class;
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue