[gegl] buffer: refactor boxfilter workfuns to have same prototype



commit 8efc7a719d3bf68464be5b5d38618af555edea1a
Author: Øyvind Kolås <pippin gimp org>
Date:   Fri May 17 21:15:14 2019 +0200

    buffer: refactor boxfilter workfuns to have same prototype
    
    Reformulated this way - we could distribute the work over multiple cores.

 gegl/buffer/gegl-algorithms-boxfilter.inc |  1 +
 gegl/buffer/gegl-algorithms.c             | 51 +++++++++++++++++--------------
 gegl/buffer/gegl-algorithms.h             |  5 +++
 3 files changed, 34 insertions(+), 23 deletions(-)
---
diff --git a/gegl/buffer/gegl-algorithms-boxfilter.inc b/gegl/buffer/gegl-algorithms-boxfilter.inc
index 778bee844..1c6f46c7a 100644
--- a/gegl/buffer/gegl-algorithms-boxfilter.inc
+++ b/gegl/buffer/gegl-algorithms-boxfilter.inc
@@ -5,6 +5,7 @@ BOXFILTER_FUNCNAME (guchar                    *dest_buf,
                     const GeglRectangle *src_rect,
                     const gint                 s_rowstride,
                     const gdouble              scale,
+                    const Babl                *format,
                     const gint                 bpp,
                     const gint                 d_rowstride)
 {
diff --git a/gegl/buffer/gegl-algorithms.c b/gegl/buffer/gegl-algorithms.c
index 6a9be8070..90fb41f14 100644
--- a/gegl/buffer/gegl-algorithms.c
+++ b/gegl/buffer/gegl-algorithms.c
@@ -150,6 +150,7 @@ gegl_boxfilter_u8_nl (guchar              *dest_buf,
                       const GeglRectangle *src_rect,
                       const gint           s_rowstride,
                       const gdouble        scale,
+                      const Babl          *format,
                       const gint           bpp,
                       const gint           d_rowstride)
 {
@@ -312,6 +313,7 @@ gegl_boxfilter_u8_nl_alpha (guchar              *dest_buf,
                             const GeglRectangle *src_rect,
                             const gint           s_rowstride,
                             const gdouble        scale,
+                            const Babl          *format,
                             const gint           bpp,
                             const gint           d_rowstride)
 {
@@ -1013,6 +1015,7 @@ gegl_resample_boxfilter_generic (guchar       *dest_buf,
                                  gint  s_rowstride,
                                  gdouble scale,
                                  const Babl *format,
+                                 gint bpp,
                                  gint d_rowstride)
 {
   const Babl *tmp_format = babl_format_with_space ("RGBA float", format);
@@ -1044,7 +1047,7 @@ gegl_resample_boxfilter_generic (guchar       *dest_buf,
                      src_rect->width, src_rect->height);
 
   gegl_resample_boxfilter_float (out_tmp, in_tmp, dst_rect, src_rect,
-                                 in_tmp_rowstride, scale, tmp_bpp, out_tmp_rowstride);
+                                 in_tmp_rowstride, scale, tmp_format, tmp_bpp, out_tmp_rowstride);
 
   babl_process_rows (to_fish,
                      out_tmp,  out_tmp_rowstride,
@@ -1067,51 +1070,53 @@ void gegl_resample_boxfilter (guchar              *dest_buf,
                               const Babl          *format,
                               gint                 d_rowstride)
 {
+  void (*func) (guchar *dest_buf,
+                const guchar        *source_buf,
+                const GeglRectangle *dst_rect,
+                const GeglRectangle *src_rect,
+                gint                 s_rowstride,
+                gdouble              scale,
+                const Babl          *format,
+                gint                 bpp,
+                gint                 d_rowstride) = gegl_resample_boxfilter_generic;
+
+
   const Babl *model     = babl_format_get_model (format);
   const Babl *comp_type  = babl_format_get_type (format, 0);
   const gint bpp = babl_format_get_bytes_per_pixel (format);
   BablModelFlag model_flags = babl_get_model_flags (model);
 
+  if (func);
+
   if ((model_flags & BABL_MODEL_FLAG_LINEAR)||
       (model_flags & BABL_MODEL_FLAG_CMYK))
   {
 
     if (comp_type == gegl_babl_float())
-      gegl_resample_boxfilter_float (dest_buf, source_buf, dst_rect, src_rect,
-                                     s_rowstride, scale, bpp, d_rowstride);
+      func = gegl_resample_boxfilter_float;
     else if (comp_type == gegl_babl_u8())
-      gegl_resample_boxfilter_u8 (dest_buf, source_buf, dst_rect, src_rect,
-                                  s_rowstride, scale, bpp, d_rowstride);
+      func = gegl_resample_boxfilter_u8;
     else if (comp_type == gegl_babl_u16())
-      gegl_resample_boxfilter_u16 (dest_buf, source_buf, dst_rect, src_rect,
-                                   s_rowstride, scale, bpp, d_rowstride);
+      func = gegl_resample_boxfilter_u16;
     else if (comp_type == gegl_babl_u32())
-      gegl_resample_boxfilter_u32 (dest_buf, source_buf, dst_rect, src_rect,
-                                   s_rowstride, scale, bpp, d_rowstride);
+      func = gegl_resample_boxfilter_u32;
     else if (comp_type == gegl_babl_double())
-      gegl_resample_boxfilter_double (dest_buf, source_buf, dst_rect, src_rect,
-                                      s_rowstride, scale, bpp, d_rowstride);
-    else
-      gegl_resample_boxfilter_generic (dest_buf, source_buf, dst_rect, src_rect,
-                                       s_rowstride, scale, format, d_rowstride);
+      func = gegl_resample_boxfilter_double;
     }
   else
     {
       if (comp_type == gegl_babl_u8())
         {
           if (babl_format_has_alpha (format))
-            gegl_boxfilter_u8_nl_alpha (dest_buf, source_buf, dst_rect, src_rect,
-                                        s_rowstride, scale, bpp, d_rowstride);
+            func = gegl_boxfilter_u8_nl_alpha;
           else
-            gegl_boxfilter_u8_nl (dest_buf, source_buf, dst_rect, src_rect,
-                                  s_rowstride, scale, bpp, d_rowstride);
-        }
-      else
-        {
-          gegl_resample_boxfilter_generic (dest_buf, source_buf, dst_rect, src_rect,
-                                           s_rowstride, scale, format, d_rowstride);
+            func = gegl_boxfilter_u8_nl;
         }
     }
+
+  func (dest_buf, source_buf, dst_rect, src_rect,
+        s_rowstride, scale, format, bpp, d_rowstride);
+
 }
 
 static void
diff --git a/gegl/buffer/gegl-algorithms.h b/gegl/buffer/gegl-algorithms.h
index 695130972..a057f9c36 100644
--- a/gegl/buffer/gegl-algorithms.h
+++ b/gegl/buffer/gegl-algorithms.h
@@ -108,6 +108,7 @@ void gegl_resample_boxfilter_double (guchar              *dest_buf,
                                      const GeglRectangle *src_rect,
                                      gint                 s_rowstride,
                                      gdouble              scale,
+                                     const Babl          *format,
                                      gint                 bpp,
                                      gint                 d_rowstride);
 
@@ -117,6 +118,7 @@ void gegl_resample_boxfilter_float (guchar              *dest_buf,
                                     const GeglRectangle *src_rect,
                                     gint                 s_rowstride,
                                     gdouble              scale,
+                                    const Babl          *format,
                                     gint                 bpp,
                                     gint                 d_rowstride);
 
@@ -126,6 +128,7 @@ void gegl_resample_boxfilter_u32 (guchar              *dest_buf,
                                   const GeglRectangle *src_rect,
                                   gint                 s_rowstride,
                                   gdouble              scale,
+                                  const Babl          *format,
                                   gint                 bpp,
                                   gint                 d_rowstride);
 
@@ -135,6 +138,7 @@ void gegl_resample_boxfilter_u16 (guchar              *dest_buf,
                                   const GeglRectangle *src_rect,
                                   gint                 s_rowstride,
                                   gdouble              scale,
+                                  const Babl          *format,
                                   gint                 bpp,
                                   gint                 d_rowstride);
 
@@ -144,6 +148,7 @@ void gegl_resample_boxfilter_u8 (guchar              *dest_buf,
                                  const GeglRectangle *src_rect,
                                  gint                 s_rowstride,
                                  gdouble              scale,
+                                 const Babl          *format,
                                  gint                 bpp,
                                  gint                 d_rowstride);
 


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