[gegl] tests: add tests for svg blend's abyss
- From: Daniel Sabo <daniels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] tests: add tests for svg blend's abyss
- Date: Mon, 7 Oct 2013 11:00:44 +0000 (UTC)
commit ee7542dcb198a9db244108744d7f33339e7be6c0
Author: Daniel Sabo <DanielSabo gmail com>
Date: Mon Oct 7 03:49:02 2013 -0700
tests: add tests for svg blend's abyss
tests/simple/.gitignore | 3 +-
tests/simple/Makefile.am | 3 +-
tests/simple/test-svg-abyss.c | 285 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 289 insertions(+), 2 deletions(-)
---
diff --git a/tests/simple/.gitignore b/tests/simple/.gitignore
index 2a72a2c..675cf63 100644
--- a/tests/simple/.gitignore
+++ b/tests/simple/.gitignore
@@ -18,4 +18,5 @@
/test-buffer-extract
/test-buffer-changes
/test-format-sensing
-/test-scaled-blit
\ No newline at end of file
+/test-scaled-blit
+/test-svg-abyss
\ No newline at end of file
diff --git a/tests/simple/Makefile.am b/tests/simple/Makefile.am
index de888ea..2bf0d56 100644
--- a/tests/simple/Makefile.am
+++ b/tests/simple/Makefile.am
@@ -18,7 +18,8 @@ noinst_PROGRAMS = \
test-buffer-changes \
test-proxynop-processing \
test-format-sensing \
- test-scaled-blit
+ test-scaled-blit \
+ test-svg-abyss
EXTRA_DIST = test-exp-combine.sh
diff --git a/tests/simple/test-svg-abyss.c b/tests/simple/test-svg-abyss.c
new file mode 100644
index 0000000..9e5cb0f
--- /dev/null
+++ b/tests/simple/test-svg-abyss.c
@@ -0,0 +1,285 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright (C) 2013 Daniel Sabo
+ */
+#include "gegl.h"
+#include "gegl-utils.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static void
+dump_to_png (const char *filename, GeglBuffer *buffer)
+{
+ GeglNode *ptn, *src, *dst;
+
+ ptn = gegl_node_new();
+ src = gegl_node_new_child(ptn, "operation", "gegl:buffer-source",
+ "buffer", buffer,
+ NULL);
+
+ dst = gegl_node_new_child(ptn, "operation", "gegl:png-save",
+ "path", filename,
+ "compression", 6,
+ NULL);
+
+ gegl_node_connect_to (src, "output", dst, "input");
+
+ gegl_node_process(dst);
+
+ g_object_unref(ptn);
+}
+
+static gboolean
+test_operation (const char *operation_name)
+{
+ gboolean result = FALSE;
+
+ const Babl *format = babl_format ("RGBA u8");
+ const gint bpp = babl_format_get_bytes_per_pixel (format);
+ const gint out_width = 5 + 10;
+ const gint out_height = 5 + 10;
+
+ guchar *output_with_abyss = gegl_malloc (out_width * out_height * bpp);
+ guchar *output_no_abyss = gegl_malloc (out_width * out_height * bpp);
+
+ GeglColor *upper_color = gegl_color_new ("rgb(0.2, 0.8, 0.2)");
+ GeglColor *lower_color = gegl_color_new ("rgb(0.0, 0.0, 0.0)");
+ GeglColor *transparent = gegl_color_new ("rgba(0.0, 0.0, 0.0, 0.0)");
+
+ {
+ /* Using abyss */
+ GeglNode *ptn = gegl_node_new();
+
+ GeglNode *test_op, *upper_rect, *lower_rect;
+
+ test_op = gegl_node_new_child (ptn,
+ "operation", operation_name,
+ NULL);
+
+ upper_rect = gegl_node_new_child (ptn,
+ "operation", "gegl:rectangle",
+ "color", upper_color,
+ "x", 5.0,
+ "y", 5.0,
+ "width", 10.0,
+ "height", 10.0,
+ NULL);
+
+ lower_rect = gegl_node_new_child (ptn,
+ "operation", "gegl:rectangle",
+ "color", lower_color,
+ "x", 0.0,
+ "y", 0.0,
+ "width", 10.0,
+ "height", 10.0,
+ NULL);
+
+ gegl_node_connect_to (lower_rect, "output", test_op, "input");
+ gegl_node_connect_to (upper_rect, "output", test_op, "aux");
+
+
+ int i;
+ guchar *out = output_with_abyss;
+ for (i = 0; i < out_height; i++)
+ {
+ gegl_node_blit (test_op,
+ 1.0,
+ GEGL_RECTANGLE (0, i, out_width, 1),
+ format,
+ out,
+ GEGL_AUTO_ROWSTRIDE,
+ 0);
+ out += out_width * bpp;
+ }
+
+ g_object_unref (ptn);
+ }
+
+ {
+ /* Explicit transparency */
+ GeglNode *ptn = gegl_node_new();
+
+ GeglNode *test_op, *upper_rect, *lower_rect;
+ GeglNode *upper_over, *lower_over;
+ GeglNode *background;
+
+ test_op = gegl_node_new_child (ptn,
+ "operation", operation_name,
+ NULL);
+
+ background = gegl_node_new_child (ptn,
+ "operation", "gegl:rectangle",
+ "color", transparent,
+ "x", 0.0,
+ "y", 0.0,
+ "width", 10.0 + 5.0,
+ "height", 10.0 + 5.0,
+ NULL);
+
+ upper_rect = gegl_node_new_child (ptn,
+ "operation", "gegl:rectangle",
+ "color", upper_color,
+ "x", 5.0,
+ "y", 5.0,
+ "width", 10.0,
+ "height", 10.0,
+ NULL);
+
+ upper_over = gegl_node_new_child (ptn,
+ "operation", "gegl:over",
+ NULL);
+
+ lower_rect = gegl_node_new_child (ptn,
+ "operation", "gegl:rectangle",
+ "color", lower_color,
+ "x", 0.0,
+ "y", 0.0,
+ "width", 10.0,
+ "height", 10.0,
+ NULL);
+
+ lower_over = gegl_node_new_child (ptn,
+ "operation", "gegl:over",
+ NULL);
+
+ gegl_node_connect_to (lower_rect, "output", lower_over, "aux");
+ gegl_node_connect_to (upper_rect, "output", upper_over, "aux");
+
+ gegl_node_connect_to (background, "output", lower_over, "input");
+ gegl_node_connect_to (background, "output", upper_over, "input");
+
+ gegl_node_connect_to (lower_over, "output", test_op, "input");
+ gegl_node_connect_to (upper_over, "output", test_op, "aux");
+
+ int i;
+ guchar *out = output_no_abyss;
+ for (i = 0; i < out_height; i++)
+ {
+ gegl_node_blit (test_op,
+ 1.0,
+ GEGL_RECTANGLE (0, i, out_width, 1),
+ format,
+ out,
+ GEGL_AUTO_ROWSTRIDE,
+ 0);
+ out += out_width * bpp;
+ }
+
+ g_object_unref (ptn);
+ }
+
+ if (0 == memcmp (output_with_abyss, output_no_abyss, out_width * out_height * bpp))
+ {
+ printf (".");
+ fflush(stdout);
+ result = TRUE;
+ }
+ else
+ {
+ printf ("\n %s ... FAIL\n", operation_name);
+ result = FALSE;
+ }
+
+ if (!result)
+ {
+ GeglBuffer *linear;
+ gchar *filename;
+
+ filename = g_strconcat (operation_name, " - with abyss.png", NULL);
+ linear = gegl_buffer_linear_new_from_data (output_with_abyss,
+ format,
+ GEGL_RECTANGLE (0, 0, out_width, out_height),
+ GEGL_AUTO_ROWSTRIDE,
+ NULL,
+ NULL);
+ dump_to_png (filename, linear);
+ g_free (filename);
+ g_object_unref (linear);
+
+ filename = g_strconcat (operation_name, " - no abyss.png", NULL);
+ linear = gegl_buffer_linear_new_from_data (output_no_abyss,
+ format,
+ GEGL_RECTANGLE (0, 0, out_width, out_height),
+ GEGL_AUTO_ROWSTRIDE,
+ NULL,
+ NULL);
+ dump_to_png (filename, linear);
+ g_free (filename);
+ g_object_unref (linear);
+ }
+
+ gegl_free (output_with_abyss);
+ gegl_free (output_no_abyss);
+
+ return result;
+}
+
+int main(int argc, char **argv)
+{
+ gint tests_run = 0;
+ gint tests_passed = 0;
+ gint tests_failed = 0;
+
+ gint i;
+
+ const char *operation_names[] = {
+ "svg:src",
+ "svg:dst",
+
+ "svg:src-over",
+ "svg:dst-over",
+
+ "svg:src-in",
+ "svg:dst-in",
+
+ "svg:src-out",
+ "svg:dst-out",
+
+ "svg:src-atop",
+ "svg:dst-atop",
+
+ "svg:clear",
+ "svg:xor",
+ };
+
+ gegl_init(0, NULL);
+ g_object_set(G_OBJECT(gegl_config()),
+ "swap", "RAM",
+ "use-opencl", FALSE,
+ NULL);
+
+ printf ("testing abyss handling of svg blends\n");
+
+ for (i = 0; i < G_N_ELEMENTS(operation_names); ++i)
+ {
+ if (test_operation (operation_names[i]))
+ tests_passed++;
+ else
+ tests_failed++;
+ tests_run++;
+ }
+
+ gegl_exit();
+
+ printf ("\n");
+
+ if (tests_passed == tests_run)
+ return 0;
+ return -1;
+
+ return 0;
+}
\ No newline at end of file
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]