[gegl] buffer: cache downscale 2x2 dispatch functions in zoom handler



commit 08debafb0a7a919adc45f47551c1821e344150a0
Author: Øyvind Kolås <pippin gimp org>
Date:   Thu Jan 18 19:22:21 2018 +0100

    buffer: cache downscale 2x2 dispatch functions in zoom handler

 gegl/buffer/gegl-tile-handler-zoom.c |   10 +++++++---
 gegl/buffer/gegl-tile-handler-zoom.h |   16 +++++++++-------
 gegl/gegl-algorithms.c               |   11 ++---------
 gegl/gegl-algorithms.h               |   10 ++++++++++
 4 files changed, 28 insertions(+), 19 deletions(-)
---
diff --git a/gegl/buffer/gegl-tile-handler-zoom.c b/gegl/buffer/gegl-tile-handler-zoom.c
index 40fa7ba..329a93b 100644
--- a/gegl/buffer/gegl-tile-handler-zoom.c
+++ b/gegl/buffer/gegl-tile-handler-zoom.c
@@ -60,7 +60,8 @@ static inline void set_blank (GeglTile   *dst_tile,
     }
 }
 
-static inline void set_half (GeglTile   * dst_tile,
+static inline void set_half (GeglTileHandlerZoom *zoom,
+                             GeglTile   * dst_tile,
                              GeglTile   * src_tile,
                              gint         width,
                              gint         height,
@@ -75,7 +76,10 @@ static inline void set_half (GeglTile   * dst_tile,
   if (i) dst_data += bpp * width / 2;
   if (j) dst_data += bpp * width * height / 2;
 
-  gegl_downscale_2x2 (format, width, height, src_data, width * bpp, dst_data, width * bpp);
+  if (!zoom->downscale_2x2)
+    zoom->downscale_2x2 = gegl_downscale_2x2_get_fun (format);
+
+  zoom->downscale_2x2 (format, width, height, src_data, width * bpp, dst_data, width * bpp);
 }
 
 static GeglTile *
@@ -139,7 +143,7 @@ get_tile (GeglTileSource *gegl_tile_source,
         {
           if (source_tile[i][j])
             {
-              set_half (tile, source_tile[i][j], tile_width, tile_height, format, i, j);
+              set_half (zoom, tile, source_tile[i][j], tile_width, tile_height, format, i, j);
               gegl_tile_unref (source_tile[i][j]);
             }
           else
diff --git a/gegl/buffer/gegl-tile-handler-zoom.h b/gegl/buffer/gegl-tile-handler-zoom.h
index 8624ca6..13906c4 100644
--- a/gegl/buffer/gegl-tile-handler-zoom.h
+++ b/gegl/buffer/gegl-tile-handler-zoom.h
@@ -39,18 +39,20 @@ G_BEGIN_DECLS
 typedef struct _GeglTileHandlerZoom      GeglTileHandlerZoom;
 typedef struct _GeglTileHandlerZoomClass GeglTileHandlerZoomClass;
 
+typedef void (*GeglDownscale2x2Fun) (const Babl *format,
+                                     gint    src_width,
+                                     gint    src_height,
+                                     guchar *src_data,
+                                     gint    src_rowstride,
+                                     guchar *dst_data,
+                                     gint    dst_rowstride);
+
 struct _GeglTileHandlerZoom
 {
   GeglTileHandler       parent_instance;
   GeglTileBackend      *backend;
   GeglTileStorage      *tile_storage;
-  void (*downscale_2x2) (gint    bpp,
-                         gint    src_width,
-                         gint    dst_dst_width,
-                         guchar *src_data,
-                         gint    src_rowstride,
-                         guchar *dst_data,
-                         gint    dst_rowstride);
+  GeglDownscale2x2Fun   downscale_2x2;
 };
 
 struct _GeglTileHandlerZoomClass
diff --git a/gegl/gegl-algorithms.c b/gegl/gegl-algorithms.c
index 2337616..0b0599a 100644
--- a/gegl/gegl-algorithms.c
+++ b/gegl/gegl-algorithms.c
@@ -41,15 +41,8 @@ gegl_downscale_2x2_generic (const Babl *format,
                             guchar     *dst_data,
                             gint        dst_rowstride);
 
-typedef void (*GeglDownscale2x2Fun) (const Babl *format,
-                                     gint    src_width,
-                                     gint    src_height,
-                                     guchar *src_data,
-                                     gint    src_rowstride,
-                                     guchar *dst_data,
-                                     gint    dst_rowstride);
-
-static GeglDownscale2x2Fun gegl_downscale_2x2_get_fun (const Babl *format)
+
+GeglDownscale2x2Fun gegl_downscale_2x2_get_fun (const Babl *format)
 {
   const Babl *comp_type = babl_format_get_type (format, 0);
   const Babl *model     = babl_format_get_model (format);
@@ -90,7 +83,7 @@ void gegl_downscale_2x2 (const Babl *format,
 {
   gegl_downscale_2x2_get_fun (format)(format, src_width, src_height,
                                               src_data, src_rowstride,
-                                              src_data, dst_rowstride);;
+                                              dst_data, dst_rowstride);;
 }
 
 #include <stdio.h>
diff --git a/gegl/gegl-algorithms.h b/gegl/gegl-algorithms.h
index f1887a7..0988313 100644
--- a/gegl/gegl-algorithms.h
+++ b/gegl/gegl-algorithms.h
@@ -31,6 +31,7 @@ void gegl_downscale_2x2 (const Babl *format,
                          guchar     *dst_data,
                          gint        dst_rowstride);
 
+
 void gegl_downscale_2x2_double (const Babl *format,
                                 gint        src_width,
                                 gint        src_height,
@@ -47,6 +48,14 @@ void gegl_downscale_2x2_float (const Babl *format,
                                guchar     *dst_data,
                                gint        dst_rowstride);
 
+typedef void (*GeglDownscale2x2Fun) (const Babl *format,
+                                     gint    src_width,
+                                     gint    src_height,
+                                     guchar *src_data,
+                                     gint    src_rowstride,
+                                     guchar *dst_data,
+                                     gint    dst_rowstride);
+
 void gegl_downscale_2x2_u32 (const Babl *format,
                              gint        src_width,
                              gint        src_height,
@@ -203,6 +212,7 @@ void gegl_resample_nearest (guchar              *dst,
                             gint                 bpp,
                             gint                 dst_stride);
 
+GeglDownscale2x2Fun gegl_downscale_2x2_get_fun (const Babl *format);
 
 G_END_DECLS
 


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