From a04c442e690a206151cd16efc7b2d2a65f656b19 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Sat, 2 Nov 2013 01:37:52 +0100 Subject: [PATCH] modules: implement convert_buffer() in the high contrast display filter --- modules/display-filter-high-contrast.c | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/modules/display-filter-high-contrast.c b/modules/display-filter-high-contrast.c index 422b192911..1a0a86974f 100644 --- a/modules/display-filter-high-contrast.c +++ b/modules/display-filter-high-contrast.c @@ -74,6 +74,9 @@ static void cdisplay_contrast_get_property (GObject *object, GValue *value, GParamSpec *pspec); +static void cdisplay_contrast_convert_buffer (GimpColorDisplay *display, + GeglBuffer *buffer, + GeglRectangle *area); static void cdisplay_contrast_convert_surface (GimpColorDisplay *display, cairo_surface_t *surface); static GtkWidget * cdisplay_contrast_configure (GimpColorDisplay *display); @@ -128,6 +131,7 @@ cdisplay_contrast_class_init (CdisplayContrastClass *klass) display_class->help_id = "gimp-colordisplay-contrast"; display_class->stock_id = GIMP_STOCK_DISPLAY_FILTER_CONTRAST; + display_class->convert_buffer = cdisplay_contrast_convert_buffer; display_class->convert_surface = cdisplay_contrast_convert_surface; display_class->configure = cdisplay_contrast_configure; } @@ -180,6 +184,37 @@ cdisplay_contrast_set_property (GObject *object, } } +static void +cdisplay_contrast_convert_buffer (GimpColorDisplay *display, + GeglBuffer *buffer, + GeglRectangle *area) +{ + CdisplayContrast *contrast = CDISPLAY_CONTRAST (display); + GeglBufferIterator *iter; + gfloat c; + + c = contrast->contrast * 2 * G_PI; + + iter = gegl_buffer_iterator_new (buffer, area, 0, + babl_format ("R'G'B'A float"), + GEGL_BUFFER_READWRITE, GEGL_ABYSS_NONE); + + while (gegl_buffer_iterator_next (iter)) + { + gfloat *data = iter->data[0]; + gint count = iter->length; + + while (count--) + { + *data = 0.5 * (1.0 + sin (c * *data)); data++; + *data = 0.5 * (1.0 + sin (c * *data)); data++; + *data = 0.5 * (1.0 + sin (c * *data)); data++; + + data++; + } + } +} + static void cdisplay_contrast_convert_surface (GimpColorDisplay *display, cairo_surface_t *surface)