[gimp] modules: implement convert_buffer() in the gamma display filter



commit fcd457e67b73fb921b5e2e6ef733a998898d1f14
Author: Michael Natterer <mitch gimp org>
Date:   Sat Nov 2 01:51:05 2013 +0100

    modules: implement convert_buffer() in the gamma display filter

 modules/display-filter-gamma.c |   35 +++++++++++++++++++++++++++++++++++
 1 files changed, 35 insertions(+), 0 deletions(-)
---
diff --git a/modules/display-filter-gamma.c b/modules/display-filter-gamma.c
index eb919cc..17a5194 100644
--- a/modules/display-filter-gamma.c
+++ b/modules/display-filter-gamma.c
@@ -74,6 +74,9 @@ static void        cdisplay_gamma_get_property    (GObject            *object,
                                                    GValue             *value,
                                                    GParamSpec         *pspec);
 
+static void        cdisplay_gamma_convert_buffer  (GimpColorDisplay   *display,
+                                                   GeglBuffer         *buffer,
+                                                   GeglRectangle      *area);
 static void        cdisplay_gamma_convert_surface (GimpColorDisplay   *display,
                                                    cairo_surface_t    *surface);
 static GtkWidget * cdisplay_gamma_configure       (GimpColorDisplay   *display);
@@ -128,6 +131,7 @@ cdisplay_gamma_class_init (CdisplayGammaClass *klass)
   display_class->help_id         = "gimp-colordisplay-gamma";
   display_class->stock_id        = GIMP_STOCK_DISPLAY_FILTER_GAMMA;
 
+  display_class->convert_buffer  = cdisplay_gamma_convert_buffer;
   display_class->convert_surface = cdisplay_gamma_convert_surface;
   display_class->configure       = cdisplay_gamma_configure;
 }
@@ -181,6 +185,37 @@ cdisplay_gamma_set_property (GObject      *object,
 }
 
 static void
+cdisplay_gamma_convert_buffer (GimpColorDisplay *display,
+                               GeglBuffer       *buffer,
+                               GeglRectangle    *area)
+{
+  CdisplayGamma      *gamma = CDISPLAY_GAMMA (display);
+  GeglBufferIterator *iter;
+  gdouble             one_over_gamma;
+
+  one_over_gamma = 1.0 / gamma->gamma;
+
+  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 = pow (*data, one_over_gamma); data++;
+          *data = pow (*data, one_over_gamma); data++;
+          *data = pow (*data, one_over_gamma); data++;
+
+          data++;
+        }
+    }
+}
+
+static void
 cdisplay_gamma_convert_surface (GimpColorDisplay *display,
                                 cairo_surface_t  *surface)
 {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]