[gegl] workshop: make more use of GeglSampler in inpainting ops



commit 1a27e46d30f04ad9a8e37f63e893ce688f6230be
Author: Øyvind Kolås <pippin gimp org>
Date:   Mon May 14 10:59:39 2018 +0200

    workshop: make more use of GeglSampler in inpainting ops

 operations/workshop/enlarge.c      |   15 +++++-----
 operations/workshop/enlarge2.c     |   16 ++++++-----
 operations/workshop/pixel-duster.h |   51 +++++++++++++++++++----------------
 3 files changed, 45 insertions(+), 37 deletions(-)
---
diff --git a/operations/workshop/enlarge.c b/operations/workshop/enlarge.c
index 8ae84c2..eafe9cb 100644
--- a/operations/workshop/enlarge.c
+++ b/operations/workshop/enlarge.c
@@ -64,7 +64,8 @@ prepare (GeglOperation *operation)
   gegl_operation_set_format (operation, "output", format);
 }
 
-static void scaled_copy (GeglBuffer *in,
+static void scaled_copy (PixelDuster *duster,
+                         GeglBuffer *in,
                          GeglBuffer *out,
                          gfloat      scale)
 {
@@ -78,9 +79,8 @@ static void scaled_copy (GeglBuffer *in,
       {
         float rgba[4];
         GeglRectangle r = {x, y, 1, 1};
-        gegl_buffer_sample (in, x / scale, y / scale, NULL,
-                            &rgba[0], format,
-                            GEGL_SAMPLER_NEAREST, 0);
+        gegl_sampler_get (duster->in_sampler_f, x / scale, y / scale, NULL,
+                          &rgba[0], 0);
         gegl_buffer_set (out, &r, 0, format, &rgba[0], 0);
       }
 }
@@ -91,7 +91,7 @@ static void improve (PixelDuster *duster,
                      gfloat      scale)
 {
   GeglRectangle rect;
-  const Babl *format = babl_format ("R'G'B'A float");
+  const Babl *format = babl_format ("RGBA float");
   gint x, y;
 
   rect = *gegl_buffer_get_extent (out);
@@ -118,7 +118,8 @@ static void improve (PixelDuster *duster,
           gfloat rgba[4*MAX_K];
 
           for (int j = 0; j < MAX_K; j++)
-            gegl_buffer_sample (duster->input, probe->source_x[j], probe->source_y[j],  NULL, &rgba[j*4], 
format, GEGL_SAMPLER_NEAREST, 0);
+            gegl_sampler_get (duster->in_sampler_f, probe->source_x[j],
+                              probe->source_y[j], NULL, &rgba[j*4], 0);
 
 
           for (int j = 1; j < probe->k; j++)
@@ -176,7 +177,6 @@ process (GeglOperation       *operation,
   GeglRectangle in_rect = *gegl_buffer_get_extent (input);
   GeglRectangle out_rect = *gegl_buffer_get_extent (output);
   PixelDuster    *duster;
-  scaled_copy (input, output, o->scale);
   duster  = pixel_duster_new (input, output,
                               &in_rect, &out_rect,
                               o->seek_distance,
@@ -185,6 +185,7 @@ process (GeglOperation       *operation,
                               o->scale,
                               o->scale,
                               NULL);
+  scaled_copy (duster, input, output, o->scale);
   seed_db (duster);
   improve (duster, input, output, o->scale);
   pixel_duster_destroy (duster);
diff --git a/operations/workshop/enlarge2.c b/operations/workshop/enlarge2.c
index 3d1e2e8..e74bdc9 100644
--- a/operations/workshop/enlarge2.c
+++ b/operations/workshop/enlarge2.c
@@ -74,7 +74,8 @@ prepare (GeglOperation *operation)
   gegl_operation_set_format (operation, "output", format);
 }
 
-static void scaled_copy (GeglBuffer *in,
+static void scaled_copy (PixelDuster *duster,
+                         GeglBuffer *in,
                          GeglBuffer *out,
                          gfloat      scale)
 {
@@ -97,7 +98,7 @@ static void scaled_copy (GeglBuffer *in,
       {
         GeglRectangle r = {x * scale , y * scale, 1, 1};
         gfloat rgba[4];
-        gegl_buffer_sample (in, x, y, NULL, &rgba[0], format, GEGL_SAMPLER_NEAREST, 0);
+        gegl_sampler_get (duster->in_sampler_f, x, y, NULL, &rgba[0], 0);
         gegl_buffer_set (out, &r, 0, format, &rgba[0], 0);
       }
 }
@@ -119,7 +120,8 @@ static void remove_grid (GeglBuffer *in,
       }
 }
 
-static void remove_deviant (GeglBuffer *in,
+static void remove_deviant (PixelDuster *duster,
+                            GeglBuffer *in,
                             GeglBuffer *out,
                             gfloat      scale)
 {
@@ -134,7 +136,7 @@ static void remove_deviant (GeglBuffer *in,
         gfloat rgba_in[4] = {0,0,0,0};
         gfloat rgba_empty[4] = {0,0,0,0};
         gfloat rgba_out[4] = {0,0,0,0};
-        gegl_buffer_sample (in, x / scale, y / scale, NULL, &rgba_in[0], format, GEGL_SAMPLER_NEAREST, 0);
+        gegl_sampler_get (duster->in_sampler_f, x / scale, y / scale, NULL, &rgba_in[0], 0);
         gegl_buffer_sample (out, x, y, NULL, &rgba_out[0], format, GEGL_SAMPLER_NEAREST, 0);
 
         if (POW2(rgba_in[0]-rgba_out[0])+
@@ -158,7 +160,6 @@ process (GeglOperation       *operation,
   GeglRectangle out_rect = *gegl_buffer_get_extent (output);
   PixelDuster    *duster;
 
-  scaled_copy (input, output, o->scale);
   duster  = pixel_duster_new (input, output,
                               &in_rect, &out_rect,
                               o->seek_distance,
@@ -170,16 +171,17 @@ process (GeglOperation       *operation,
                               o->scale,
                               o->scale,
                               NULL);
+  scaled_copy (duster, input, output, o->scale);
   seed_db (duster);
   pixel_duster_add_probes_for_transparent (duster);
   pixel_duster_fill (duster);
-  remove_deviant (input, output, o->scale);
+  remove_deviant (duster, input, output, o->scale);
   remove_grid (input, output, o->scale);
   pixel_duster_remove_probes (duster);
   pixel_duster_add_probes_for_transparent (duster);
   pixel_duster_fill (duster);
 
-  remove_deviant (input, output, o->scale);
+  remove_deviant (duster, input, output, o->scale);
   pixel_duster_remove_probes (duster);
   pixel_duster_add_probes_for_transparent (duster);
   pixel_duster_fill (duster);
diff --git a/operations/workshop/pixel-duster.h b/operations/workshop/pixel-duster.h
index 66b26fa..8161e08 100644
--- a/operations/workshop/pixel-duster.h
+++ b/operations/workshop/pixel-duster.h
@@ -38,6 +38,9 @@ typedef struct
   GeglBuffer    *output;
   GeglRectangle  in_rect;
   GeglRectangle  out_rect;
+  GeglSampler   *in_sampler_yu8;
+  GeglSampler   *in_sampler_f;
+  GeglSampler   *in_sampler_u8;
   int            max_k;
   int            seek_radius;
   int            minimum_neighbors;
@@ -215,6 +218,15 @@ static PixelDuster * pixel_duster_new (GeglBuffer *input,
   ret->out_rect = *out_rect;
   ret->scale_x  = scale_x;
   ret->scale_y  = scale_y;
+
+  ret->in_sampler_yu8 = gegl_buffer_sampler_new (input, babl_format ("Y'aA u8"),
+                                                 GEGL_SAMPLER_NEAREST);
+  ret->in_sampler_u8 = gegl_buffer_sampler_new (input,
+                                                babl_format ("R'G'B'aA u8"),
+                                                GEGL_SAMPLER_NEAREST);
+  ret->in_sampler_f = gegl_buffer_sampler_new (input,
+                                               babl_format ("RGBA float"),
+                                               GEGL_SAMPLER_NEAREST);
   for (int i = 0; i < 4096; i++)
     ret->ht[i] = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
   ret->probes_ht = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
@@ -243,6 +255,11 @@ static void pixel_duster_destroy (PixelDuster *duster)
     g_hash_table_destroy (duster->ht[i]);
   }
   fprintf (stderr, "\n");
+
+  g_object_unref (duster->in_sampler_yu8);
+  g_object_unref (duster->in_sampler_u8);
+  g_object_unref (duster->in_sampler_f);
+
   g_free (duster);
 }
 
@@ -250,24 +267,23 @@ static void pixel_duster_destroy (PixelDuster *duster)
 static void extract_site (PixelDuster *duster, GeglBuffer *input, int x, int y, guchar *dst)
 {
   static const Babl *format = NULL;
-  static const Babl *yformat = NULL;
   guchar lum[8];
   int bdir, maxlum;
   uint64_t hist3dmask=0;
 
   if (!format){
     format = babl_format ("R'G'B'A u8");
-    yformat = babl_format ("Y'aA u8");
   }
+
 #define PIXDUST_DIR_INVARIANT 1
 #if PIXDUST_DIR_INVARIANT==1
   /* figure out which of the up/down/left/right pixels are brightest,
      using premultiplied alpha - do punish blank spots  */
 
-  gegl_buffer_sample (input, x + 1, y + 0, NULL, &lum[0], yformat, GEGL_SAMPLER_NEAREST, 0);
-  gegl_buffer_sample (input, x - 1, y + 0, NULL, &lum[2], yformat, GEGL_SAMPLER_NEAREST, 0);
-  gegl_buffer_sample (input, x + 0, y + 1, NULL, &lum[4], yformat, GEGL_SAMPLER_NEAREST, 0);
-  gegl_buffer_sample (input, x + 0, y - 1, NULL, &lum[6], yformat, GEGL_SAMPLER_NEAREST, 0);
+  gegl_sampler_get (duster->in_sampler_yu8, x + 1, y + 0, NULL, &lum[0], 0);
+  gegl_sampler_get (duster->in_sampler_yu8, x - 1, y + 0, NULL, &lum[2], 0);
+  gegl_sampler_get (duster->in_sampler_yu8, x + 0, y + 1, NULL, &lum[4], 0);
+  gegl_sampler_get (duster->in_sampler_yu8, x + 0, y - 1, NULL, &lum[6], 0);
 
  bdir = 0;
 
@@ -301,11 +317,7 @@ static void extract_site (PixelDuster *duster, GeglBuffer *input, int x, int y,
   {
     int dx, dy;
     duster_idx_to_x_y (duster, i, bdir, &dx, &dy);
-    gegl_buffer_sample (input,
-                        x + dx,
-                        y + dy,
-                        NULL, &dst[i*4], format,
-                        GEGL_SAMPLER_NEAREST, 0);
+    gegl_sampler_get (duster->in_sampler_u8, x + dx, y + dy, NULL, &dst[i*4], 0);
     {
       int hist_r = dst[i*4+0]/80;
       int hist_g = dst[i*4+1]/80;
@@ -318,20 +330,12 @@ static void extract_site (PixelDuster *duster, GeglBuffer *input, int x, int y,
   for (int i = 0; i <= NEIGHBORHOOD; i++)
   {
   guchar tmp[4];
-  gegl_buffer_sample (input,
-                      x,
-                      y,
-                      NULL, &tmp[0], format,
-                      GEGL_SAMPLER_NEAREST, 0);
+  gegl_sampler_get (duster->in_sampler_u8, x, y, NULL, &tmp[0], 0);
   for (int i = 0; i <= NEIGHBORHOOD; i++)
   {
     int dx, dy;
     duster_idx_to_x_y (duster, i, bdir, &dx, &dy);
-    gegl_buffer_sample (input,
-                        x + dx,
-                        y + dy,
-                        NULL, &dst[i*4], format,
-                        GEGL_SAMPLER_NEAREST, 0);
+    gegl_sampler_get (duster->in_sampler_u8, x + dx, y + dy, NULL, &dst[i*4], 0);
 
     if (i==0)
       for (int j = 0; j < 3; j++)
@@ -345,6 +349,7 @@ static void extract_site (PixelDuster *duster, GeglBuffer *input, int x, int y,
 #endif
  dst[0] = bdir;
  *((uint64_t*)(&dst[4*NEIGHBORHOOD])) = hist3dmask;
+
 }
 
 static inline int u8_rgb_diff (guchar *a, guchar *b)
@@ -805,8 +810,8 @@ static inline void pixel_duster_fill (PixelDuster *duster)
 
           for (gint i = 0; i < probe->k; i++)
           {
-            gegl_buffer_sample (duster->input, probe->source_x[i], probe->source_y[i],
-                                NULL, &rgba[0], format, GEGL_SAMPLER_NEAREST, 0);
+            gegl_sampler_get (duster->in_sampler_f, probe->source_x[i], probe->source_y[i],
+                                NULL, &rgba[0], 0);
             for (gint c = 0; c < 4; c++)
               sum_rgba[c] += rgba[c];
           }


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