[gegl] gegl: implement generic 2x2 downscaling
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] gegl: implement generic 2x2 downscaling
- Date: Thu, 11 May 2017 16:39:00 +0000 (UTC)
commit d990d6ad458d2b226e1cf3d87178817d4d010e83
Author: Øyvind Kolås <pippin gimp org>
Date: Thu May 11 18:26:44 2017 +0200
gegl: implement generic 2x2 downscaling
This fixes bug 696830 by adding a code path that converts to and from RaGaBaA
float for the downscaling on formats that are not directly supported.
gegl/gegl-algorithms.c | 59 ++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 52 insertions(+), 7 deletions(-)
---
diff --git a/gegl/gegl-algorithms.c b/gegl/gegl-algorithms.c
index a887cd7..fe712bb 100644
--- a/gegl/gegl-algorithms.c
+++ b/gegl/gegl-algorithms.c
@@ -27,17 +27,27 @@
#include "gegl-types.h"
#include "gegl-types-internal.h"
+#include "gegl-utils.h"
#include "gegl-algorithms.h"
#include <math.h>
+static void
+gegl_downscale_2x2_generic (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 (const Babl *format,
- gint src_width,
- gint src_height,
- guchar *src_data,
- gint src_rowstride,
- guchar *dst_data,
- gint dst_rowstride)
+ gint src_width,
+ gint src_height,
+ guchar *src_data,
+ gint src_rowstride,
+ guchar *dst_data,
+ gint dst_rowstride)
{
const gint bpp = babl_format_get_bytes_per_pixel (format);
const Babl *comp_type = babl_format_get_type (format, 0);
@@ -53,7 +63,42 @@ void gegl_downscale_2x2 (const Babl *format,
else if (comp_type == gegl_babl_double())
gegl_downscale_2x2_double (bpp, src_width, src_height, src_data, src_rowstride, dst_data, dst_rowstride);
else
- gegl_downscale_2x2_nearest (bpp, src_width, src_height, src_data, src_rowstride, dst_data,
dst_rowstride);
+ {
+ gegl_downscale_2x2_generic (format, src_width, src_height, src_data, src_rowstride, dst_data,
dst_rowstride);
+ }
+}
+
+static void
+gegl_downscale_2x2_generic (const Babl *format,
+ gint src_width,
+ gint src_height,
+ guchar *src_data,
+ gint src_rowstride,
+ guchar *dst_data,
+ gint dst_rowstride)
+{
+ gint y;
+ const Babl *tmp_format = gegl_babl_rgbA_linear_float ();
+ void *in_tmp = gegl_malloc (src_height * src_rowstride * 4 * 4);
+ void *out_tmp = gegl_malloc (src_height * src_rowstride * 4 * 4);
+ guchar *src = out_tmp;
+ guchar *dst = dst_data;
+
+ babl_process (babl_fish (format, tmp_format),
+ src_data, in_tmp, src_width * src_height);
+ gegl_downscale_2x2_float (4 * 4, src_width, src_height,
+ in_tmp, src_width * 4 * 4,
+ out_tmp, src_width * 4 * 4);
+ for (y = 0; y < src_height / 2; y++)
+ {
+ babl_process (babl_fish (tmp_format, format),
+ src, dst, src_width / 2);
+
+ dst += dst_rowstride;
+ src += (src_width * 4 * 4);
+ }
+ gegl_free (in_tmp);
+ gegl_free (out_tmp);
}
void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]