/* * 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 . * * Copyright (C) 2009 Martin Nordholts */ #include "config.h" #include #include #include "gegl.h" #define SUCCESS 0 #define FAILURE -1 #define FLOATS_EQUAL(x,y) (fabs((x) - (y)) < 0.00001f) static gboolean test_change_processor_rect_do_test (GeglProcessor *processor, const GeglRectangle *rect, GeglNode *sink) { gint i = 0; gboolean result = TRUE; float expected_result_buffer[4] = { 1.0, 1.0, 1.0, 1.0 }; float result_buffer[4] = { 0, }; GeglBuffer *buffer = NULL; gegl_node_set (sink, "buffer", &buffer, NULL); gegl_processor_set_rectangle (processor, rect); while (gegl_processor_work (processor, NULL)); gegl_buffer_get (buffer, rect, 1.0, babl_format ("RGBA float"), result_buffer, GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE); /* Compare with a small epsilon to account for accumulated error */ for(i = 0; i < G_N_ELEMENTS (expected_result_buffer); i++) result = result && FLOATS_EQUAL (expected_result_buffer[i], result_buffer[i]); gegl_node_set (sink, "buffer", NULL, NULL); g_object_unref (buffer); return result; } int main(int argc, char *argv[]) { gint result = SUCCESS; GeglRectangle rect1 = { 0, 0, 1, 1 }; GeglRectangle rect2 = { 1, 0, 1, 1 }; GeglRectangle rect3 = { 1, 1, 1, 1 }; GeglRectangle rect4 = { 0, 1, 1, 1 }; GeglColor *common_color = NULL; GeglNode *gegl = NULL; GeglNode *color = NULL; GeglNode *layer = NULL; GeglNode *text = NULL; GeglNode *sink = NULL; GeglProcessor *processor = NULL; /* Convenient line to keep around: g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); */ g_thread_init (NULL); gegl_init (&argc, &argv); common_color = gegl_color_new ("rgb(1.0, 1.0, 1.0)"); gegl = gegl_node_new (); color = gegl_node_new_child (gegl, "operation", "gegl:color", "value", common_color, NULL); layer = gegl_node_new_child (gegl, "operation", "gegl:layer", "x", 0.0, "y", 0.0, NULL); text = gegl_node_new_child (gegl, "operation", "gegl:text", "color", common_color, "string", "█████████████████████████", "size", 200.0, NULL); sink = gegl_node_new_child (gegl, "operation", "gegl:buffer-sink", NULL); /* We build our graph for processing complexity, not for compositing * complexity */ gegl_node_link_many (color, layer, sink, NULL); gegl_node_connect_to (text, "output", layer, "aux"); /* Create a processor */ processor = gegl_node_new_processor (sink, NULL); /* Do the tests */ if (!test_change_processor_rect_do_test (processor, &rect1, sink)) { g_printerr ("test-change-processor-rect: First compare failed\n"); result = FAILURE; goto abort; } if (!test_change_processor_rect_do_test (processor, &rect2, sink)) { g_printerr ("test-change-processor-rect: Second compare failed\n"); result = FAILURE; goto abort; } if (!test_change_processor_rect_do_test (processor, &rect3, sink)) { g_printerr ("test-change-processor-rect: Third compare failed\n"); result = FAILURE; goto abort; } if (!test_change_processor_rect_do_test (processor, &rect4, sink)) { g_printerr ("test-change-processor-rect: Fourth compare failed\n"); result = FAILURE; goto abort; } /* Cleanup */ abort: g_object_unref (processor); g_object_unref (common_color); g_object_unref (gegl); gegl_exit (); return result; }