app: more WIP on GimpOperationHistogramSink, not used yet

This commit is contained in:
Michael Natterer
2012-04-16 07:57:43 +02:00
parent 927ef9b9fb
commit a04d391ca6
3 changed files with 185 additions and 42 deletions

View File

@ -25,6 +25,9 @@
#include "base/pixel-region.h"
#include "gegl/gimp-gegl-nodes.h"
#include "gimp.h" /* gimp_use_gegl */
#include "gimpchannel.h"
#include "gimpdrawable-histogram.h"
#include "gimphistogram.h"
@ -36,8 +39,7 @@ gimp_drawable_calculate_histogram (GimpDrawable *drawable,
GimpHistogram *histogram)
{
GimpImage *image;
PixelRegion region;
PixelRegion mask;
GimpChannel *mask;
gint x, y, width, height;
g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
@ -47,28 +49,77 @@ gimp_drawable_calculate_histogram (GimpDrawable *drawable,
if (! gimp_item_mask_intersect (GIMP_ITEM (drawable), &x, &y, &width, &height))
return;
pixel_region_init (&region, gimp_drawable_get_tiles (drawable),
x, y, width, height, FALSE);
image = gimp_item_get_image (GIMP_ITEM (drawable));
mask = gimp_image_get_mask (image);
if (! gimp_channel_is_empty (gimp_image_get_mask (image)))
if (FALSE) // gimp_use_gegl (image->gimp))
{
GimpChannel *sel_mask;
GimpImage *image;
gint off_x, off_y;
GeglNode *node = gegl_node_new ();
GeglNode *buffer_source;
GeglNode *histogram_sink;
GeglProcessor *processor;
image = gimp_item_get_image (GIMP_ITEM (drawable));
sel_mask = gimp_image_get_mask (image);
buffer_source =
gimp_gegl_add_buffer_source (node,
gimp_drawable_get_buffer (drawable),
0, 0);
gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
pixel_region_init (&mask,
gimp_drawable_get_tiles (GIMP_DRAWABLE (sel_mask)),
x + off_x, y + off_y, width, height, FALSE);
gimp_histogram_calculate (histogram, &region, &mask);
histogram_sink =
gegl_node_new_child (node,
"operation", "gimp:histogram-sink",
"histogram", histogram,
NULL);
gegl_node_connect_to (buffer_source, "output",
histogram_sink, "input");
if (! gimp_channel_is_empty (mask))
{
GeglNode *mask_source;
gint off_x, off_y;
g_printerr ("adding mask aux\n");
gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
mask_source =
gimp_gegl_add_buffer_source (node,
gimp_drawable_get_buffer (GIMP_DRAWABLE (mask)),
-off_x, -off_y);
gegl_node_connect_to (mask_source, "output",
histogram_sink, "aux");
}
processor = gegl_node_new_processor (histogram_sink,
GEGL_RECTANGLE (x, y, width, height));
while (gegl_processor_work (processor, NULL));
g_object_unref (processor);
g_object_unref (node);
}
else
{
gimp_histogram_calculate (histogram, &region, NULL);
PixelRegion region;
PixelRegion mask_region;
pixel_region_init (&region, gimp_drawable_get_tiles (drawable),
x, y, width, height, FALSE);
if (! gimp_channel_is_empty (mask))
{
gint off_x, off_y;
gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
pixel_region_init (&mask_region,
gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)),
x + off_x, y + off_y, width, height, FALSE);
gimp_histogram_calculate (histogram, &region, &mask_region);
}
else
{
gimp_histogram_calculate (histogram, &region, NULL);
}
}
}

View File

@ -24,38 +24,47 @@
#include "gimp-gegl-types.h"
#include "core/gimphistogram.h"
#include "gimpoperationhistogramsink.h"
enum
{
PROP_0,
PROP_INPUT,
PROP_AUX
PROP_AUX,
PROP_HISTOGRAM
};
static void gimp_operation_histogram_sink_get_property (GObject *gobject,
static void gimp_operation_histogram_sink_finalize (GObject *object);
static void gimp_operation_histogram_sink_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void gimp_operation_histogram_sink_set_property (GObject *gobject,
static void gimp_operation_histogram_sink_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void gimp_operation_histogram_sink_attach (GeglOperation *operation);
static void gimp_operation_histogram_sink_prepare (GeglOperation *operation);
static GeglRectangle
gimp_operation_histogram_sink_get_required_for_output (GeglOperation *self,
const gchar *input_pad,
const GeglRectangle *roi);
static gboolean gimp_operation_histogram_sink_process (GeglOperation *operation,
GeglOperationContext *context,
const gchar *output_prop,
const GeglRectangle *result,
gint level);
static void gimp_operation_histogram_sink_attach (GeglOperation *operation);
static GeglRectangle gimp_operation_histogram_sink_get_required_for_output (GeglOperation *self,
const gchar *input_pad,
const GeglRectangle *roi);
G_DEFINE_TYPE (GimpOperationHistogramSink, gimp_operation_histogram_sink,
GEGL_TYPE_OPERATION_SINK)
#define parent_class gimp_operation_histogram_sink_parent_class
static void
gimp_operation_histogram_sink_class_init (GimpOperationHistogramSinkClass *klass)
@ -63,10 +72,18 @@ gimp_operation_histogram_sink_class_init (GimpOperationHistogramSinkClass *klass
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GeglOperationClass *operation_class = GEGL_OPERATION_CLASS (klass);
object_class->finalize = gimp_operation_histogram_sink_finalize;
object_class->set_property = gimp_operation_histogram_sink_set_property;
object_class->get_property = gimp_operation_histogram_sink_get_property;
gegl_operation_class_set_keys (operation_class,
"name" , "gimp:histogram-sink",
"categories" , "color",
"description", "GIMP Histogram sink operation",
NULL);
operation_class->attach = gimp_operation_histogram_sink_attach;
operation_class->prepare = gimp_operation_histogram_sink_prepare;
operation_class->get_required_for_output = gimp_operation_histogram_sink_get_required_for_output;
operation_class->process = gimp_operation_histogram_sink_process;
@ -77,6 +94,12 @@ gimp_operation_histogram_sink_class_init (GimpOperationHistogramSinkClass *klass
GEGL_TYPE_BUFFER,
G_PARAM_READWRITE |
GEGL_PARAM_PAD_INPUT));
g_object_class_install_property (object_class, PROP_HISTOGRAM,
g_param_spec_pointer ("histogram",
"Histogram",
"The result histogram",
G_PARAM_READWRITE));
}
static void
@ -84,12 +107,41 @@ gimp_operation_histogram_sink_init (GimpOperationHistogramSink *self)
{
}
static void
gimp_operation_histogram_sink_finalize (GObject *object)
{
GimpOperationHistogramSink *sink = GIMP_OPERATION_HISTOGRAM_SINK (object);
if (sink->histogram)
{
gimp_histogram_unref (sink->histogram);
sink->histogram = NULL;
}
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void
gimp_operation_histogram_sink_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GimpOperationHistogramSink *sink = GIMP_OPERATION_HISTOGRAM_SINK (object);
switch (prop_id)
{
case PROP_AUX:
break;
case PROP_HISTOGRAM:
g_value_set_pointer (value, sink->histogram);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
@ -98,6 +150,25 @@ gimp_operation_histogram_sink_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
GimpOperationHistogramSink *sink = GIMP_OPERATION_HISTOGRAM_SINK (object);
switch (prop_id)
{
case PROP_AUX:
break;
case PROP_HISTOGRAM:
if (sink->histogram)
gimp_histogram_unref (sink->histogram);
sink->histogram = g_value_get_pointer (value);
if (sink->histogram)
gimp_histogram_ref (sink->histogram);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
@ -106,11 +177,20 @@ gimp_operation_histogram_sink_attach (GeglOperation *self)
GeglOperation *operation = GEGL_OPERATION (self);
GObjectClass *object_class = G_OBJECT_GET_CLASS (self);
GEGL_OPERATION_CLASS (parent_class)->attach (self);
gegl_operation_create_pad (operation,
g_object_class_find_property (object_class,
"aux"));
}
static void
gimp_operation_histogram_sink_prepare (GeglOperation *operation)
{
/* XXX gegl_operation_set_format (operation, "input", babl_format ("Y u8")); */
gegl_operation_set_format (operation, "aux", babl_format ("Y float"));
}
static GeglRectangle
gimp_operation_histogram_sink_get_required_for_output (GeglOperation *self,
const gchar *input_pad,
@ -139,21 +219,31 @@ gimp_operation_histogram_sink_process (GeglOperation *operation,
input = gegl_operation_context_get_source (context, "input");
aux = gegl_operation_context_get_source (context, "aux");
if (input)
if (! input)
{
if (aux)
{
/* do hist with mask */
}
else
{
/* without */
}
g_warning ("received NULL input");
return TRUE;
return FALSE;
}
g_warning ("received NULL input");
if (aux)
{
/* do hist with mask */
return FALSE;
g_printerr ("aux format: %s\n",
babl_get_name (gegl_buffer_get_format (aux)));
g_object_unref (aux);
}
else
{
/* without */
}
g_printerr ("input format: %s\n",
babl_get_name (gegl_buffer_get_format (input)));
g_object_unref (input);
return TRUE;
}

View File

@ -27,11 +27,11 @@
#define GIMP_TYPE_OPERATION_HISTOGRAM_SINK (gimp_operation_histogram_sink_get_type ())
#define GIMP_OPERATION_HISTOGRAM_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_HISTOGRAM_SINK, GimpOperationHistogramSink))
#define GIMP_OPERATION_HISTOGRAM_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_HISTOGRAM_SINK, GimpOperationHistogramSinkClass))
#define GEGL_IS_OPERATION_HISTOGRAM_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_HISTOGRAM_SINK))
#define GEGL_IS_OPERATION_HISTOGRAM_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_HISTOGRAM_SINK))
#define GIMP_OPERATION_HISTOGRAM_SINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_HISTOGRAM_SINK, GimpOperationHistogramSinkClass))
#define GIMP_OPERATION_HISTOGRAM_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_OPERATION_HISTOGRAM_SINK, GimpOperationHistogramSink))
#define GIMP_OPERATION_HISTOGRAM_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_OPERATION_HISTOGRAM_SINK, GimpOperationHistogramSinkClass))
#define GEGL_IS_OPERATION_HISTOGRAM_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_OPERATION_HISTOGRAM_SINK))
#define GEGL_IS_OPERATION_HISTOGRAM_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_OPERATION_HISTOGRAM_SINK))
#define GIMP_OPERATION_HISTOGRAM_SINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_OPERATION_HISTOGRAM_SINK, GimpOperationHistogramSinkClass))
typedef struct _GimpOperationHistogramSinkClass GimpOperationHistogramSinkClass;
@ -39,6 +39,8 @@ typedef struct _GimpOperationHistogramSinkClass GimpOperationHistogramSinkClass;
struct _GimpOperationHistogramSink
{
GeglOperation parent_instance;
GimpHistogram *histogram;
};
struct _GimpOperationHistogramSinkClass