diff options
-rw-r--r-- | tests/libdimension/Makefile.am | 14 | ||||
-rw-r--r-- | tests/libdimension/gl.c | 82 | ||||
-rw-r--r-- | tests/libdimension/png.c | 34 | ||||
-rw-r--r-- | tests/libdimension/render.c | 131 |
4 files changed, 178 insertions, 83 deletions
diff --git a/tests/libdimension/Makefile.am b/tests/libdimension/Makefile.am index f59848e..21275fd 100644 --- a/tests/libdimension/Makefile.am +++ b/tests/libdimension/Makefile.am @@ -22,9 +22,10 @@ INCLUDES = -I$(top_srcdir)/libdimension check_LTLIBRARIES = libdimension-tests.la check_PROGRAMS = error-test \ warning-test \ - prtree-test \ + prtree-test \ png-test \ gl-test \ + render-test \ cxx-test TESTS = $(check_PROGRAMS) XFAIL_TESTS = error-test @@ -37,9 +38,6 @@ if !GL XFAIL_TESTS += gl-test endif -.PHONY: clean-local-png-test -clean-local: clean-local-png-test - libdimension_tests_la_SOURCES = tests.c tests.h if PGO @@ -61,11 +59,15 @@ prtree_test_LDADD = libdimension-tests.la png_test_SOURCES = png.c png_test_LDADD = libdimension-tests.la -clean-local-png-test: - rm -f *.png gl_test_SOURCES = gl.c gl_test_LDADD = libdimension-tests.la +render_test_SOURCES = render.c +render_test_LDADD = libdimension-tests.la + cxx_test_SOURCES = cxx.cpp cxx_test_LDADD = libdimension-tests.la + +clean-local: + rm -f *.png diff --git a/tests/libdimension/gl.c b/tests/libdimension/gl.c index a2538e3..0e5946c 100644 --- a/tests/libdimension/gl.c +++ b/tests/libdimension/gl.c @@ -19,100 +19,72 @@ #include "tests.h" #include <stdlib.h> -#include <stdio.h> +#include <unistd.h> int -main() { - dmnsn_display *display; - dmnsn_progress *progress; - dmnsn_scene *scene; - dmnsn_canvas *canvas; - +main() +{ /* Set the resilience low for tests */ dmnsn_set_resilience(DMNSN_SEVERITY_LOW); - /* Create the default test scene */ - scene = dmnsn_new_default_scene(); + /* Allocate our canvas */ + dmnsn_canvas *canvas = dmnsn_new_canvas(768, 480); /* Optimize the canvas for GL drawing */ - if (dmnsn_gl_optimize_canvas(scene->canvas) != 0) { - dmnsn_delete_scene(scene); + if (dmnsn_gl_optimize_canvas(canvas) != 0) { + dmnsn_delete_canvas(canvas); fprintf(stderr, "--- Couldn't optimize canvas for GL! ---\n"); return EXIT_FAILURE; } - dmnsn_clear_canvas(scene->canvas, dmnsn_black); + /* Paint the canvas blue */ + dmnsn_clear_canvas(canvas, dmnsn_blue); /* Create a new glX display */ - display = dmnsn_new_display(scene->canvas); + dmnsn_display *display = dmnsn_new_display(canvas); if (!display) { - dmnsn_delete_scene(scene); fprintf(stderr, "--- WARNING: Couldn't initialize X or glX! ---\n"); return EXIT_SUCCESS; } - /* Render the scene */ - - printf("Rendering scene\n"); - progress = dmnsn_raytrace_scene_async(scene); - - /* Display the scene as it's rendered */ - while (dmnsn_get_progress(progress) < 1.0) { - if (dmnsn_gl_write_canvas(scene->canvas) != 0) { - dmnsn_delete_display(display); - dmnsn_delete_scene(scene); - fprintf(stderr, "--- Drawing to openGL failed! ---\n"); - return EXIT_FAILURE; - } - dmnsn_display_flush(display); - } - - if (dmnsn_finish_progress(progress) != 0) { - dmnsn_delete_display(display); - dmnsn_delete_scene(scene); - fprintf(stderr, "--- Raytracing failed! ---\n"); - return EXIT_FAILURE; - } - - /* Make sure we show the completed rendering */ + /* Draw to OpenGL */ printf("Drawing to OpenGL\n"); - if (dmnsn_gl_write_canvas(scene->canvas) != 0) { + if (dmnsn_gl_write_canvas(canvas) != 0) { dmnsn_delete_display(display); - dmnsn_delete_scene(scene); - fprintf(stderr, "--- Drawing to openGL failed! ---\n"); + dmnsn_delete_canvas(canvas); + fprintf(stderr, "--- Drawing to OpenGL failed! ---\n"); return EXIT_FAILURE; } dmnsn_display_flush(display); + dmnsn_delete_canvas(canvas); - /* Show the image on screen for a bit */ - sleep(1); + /* + * Now test GL import/export + */ - /* Read a canvas from the GL buffer */ + /* Read the image back from OpenGL */ printf("Reading from OpenGL\n"); - canvas = dmnsn_gl_read_canvas(0, 0, scene->canvas->x, scene->canvas->y); + canvas = dmnsn_gl_read_canvas(0, 0, 768, 480); if (!canvas) { dmnsn_delete_display(display); - dmnsn_delete_scene(scene); - fprintf(stderr, "--- Reading canvas from GL buffer failed! ---\n"); + dmnsn_delete_canvas(canvas); + fprintf(stderr, "--- Reading from OpenGL failed! ---\n"); return EXIT_FAILURE; } - /* And write it back */ + /* And draw it back */ printf("Drawing to OpenGL\n"); if (dmnsn_gl_write_canvas(canvas) != 0) { - dmnsn_delete_canvas(canvas); dmnsn_delete_display(display); - dmnsn_delete_scene(scene); - fprintf(stderr, "--- Drawing to openGL failed! ---\n"); + dmnsn_delete_canvas(canvas); + fprintf(stderr, "--- Drawing to OpenGL failed! ---\n"); return EXIT_FAILURE; } dmnsn_display_flush(display); + dmnsn_delete_canvas(canvas); - /* Show the image on screen for a bit */ + /* Show the image on the screen for a bit */ sleep(1); - dmnsn_delete_canvas(canvas); - dmnsn_delete_display(display); - dmnsn_delete_scene(scene); return EXIT_SUCCESS; } diff --git a/tests/libdimension/png.c b/tests/libdimension/png.c index 2073310..41771d3 100644 --- a/tests/libdimension/png.c +++ b/tests/libdimension/png.c @@ -23,51 +23,41 @@ int main() { - FILE *ifile, *ofile; - dmnsn_scene *scene; - dmnsn_canvas *canvas; - /* Set the resilience low for tests */ dmnsn_set_resilience(DMNSN_SEVERITY_LOW); - /* - * Render the scene - */ - - /* Allocate our default scene */ - scene = dmnsn_new_default_scene(); + /* Allocate our canvas */ + dmnsn_canvas *canvas = dmnsn_new_canvas(768, 480); /* Optimize the canvas for PNG export */ - if (dmnsn_png_optimize_canvas(scene->canvas) != 0) { - dmnsn_delete_scene(scene); + if (dmnsn_png_optimize_canvas(canvas) != 0) { + dmnsn_delete_canvas(canvas); fprintf(stderr, "--- Couldn't optimize canvas for PNG! ---\n"); return EXIT_FAILURE; } - /* Render scene */ - - printf("Rendering scene\n"); - dmnsn_raytrace_scene(scene); + /* Paint the canvas blue */ + dmnsn_clear_canvas(canvas, dmnsn_blue); /* Write the image to PNG */ printf("Writing scene to PNG\n"); - ofile = fopen("png1.png", "wb"); + FILE *ofile = fopen("png1.png", "wb"); if (!ofile) { - dmnsn_delete_scene(scene); + dmnsn_delete_canvas(canvas); fprintf(stderr, "--- Couldn't open 'png1.png' for writing! ---\n"); return EXIT_FAILURE; } - if (dmnsn_png_write_canvas(scene->canvas, ofile) != 0) { + if (dmnsn_png_write_canvas(canvas, ofile) != 0) { fclose(ofile); - dmnsn_delete_scene(scene); + dmnsn_delete_canvas(canvas); fprintf(stderr, "--- Writing canvas to PNG failed! ---\n"); return EXIT_FAILURE; } fclose(ofile); - dmnsn_delete_scene(scene); + dmnsn_delete_canvas(canvas); /* * Now test PNG import/export @@ -76,7 +66,7 @@ main() { /* Read the image back from PNG */ printf("Reading scene from PNG\n"); - ifile = fopen("png1.png", "rb"); + FILE *ifile = fopen("png1.png", "rb"); if (!ifile) { fprintf(stderr, "--- Couldn't open 'png1.png' for reading! ---\n"); return EXIT_FAILURE; diff --git a/tests/libdimension/render.c b/tests/libdimension/render.c new file mode 100644 index 0000000..5059778 --- /dev/null +++ b/tests/libdimension/render.c @@ -0,0 +1,131 @@ +/************************************************************************* + * Copyright (C) 2010 Tavian Barnes <tavianator@gmail.com> * + * * + * This file is part of The Dimension Test Suite. * + * * + * The Dimension Test Suite 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. * + * * + * The Dimension Test Suite 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/>. * + *************************************************************************/ + +#include "tests.h" +#include <errno.h> +#include <stdlib.h> +#include <stdio.h> + +int +main() { + bool have_png = true, have_gl = true; + + /* Set the resilience low for tests */ + dmnsn_set_resilience(DMNSN_SEVERITY_LOW); + + /* Create the default test scene */ + dmnsn_scene *scene = dmnsn_new_default_scene(); + + /* Optimize the canvas for PNG export */ + errno = 0; + if (dmnsn_png_optimize_canvas(scene->canvas) != 0) { + if (errno == ENOTSUP) { + have_png = false; + } else { + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Couldn't optimize canvas for PNG! ---\n"); + return EXIT_FAILURE; + } + } + + /* Optimize the canvas for GL drawing */ + errno = 0; + if (dmnsn_gl_optimize_canvas(scene->canvas) != 0) { + if (errno == ENOTSUP) { + have_gl = false; + } else { + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Couldn't optimize canvas for GL! ---\n"); + return EXIT_FAILURE; + } + } + + dmnsn_clear_canvas(scene->canvas, dmnsn_black); + + /* Create a new glX display */ + dmnsn_display *display = NULL; + if (have_gl) { + display = dmnsn_new_display(scene->canvas); + if (!display) { + fprintf(stderr, "--- WARNING: Couldn't initialize X or glX! ---\n"); + } + } + + /* Render the scene */ + + printf("Rendering scene\n"); + dmnsn_progress *progress = dmnsn_raytrace_scene_async(scene); + + /* Display the scene as it's rendered */ + if (display) { + while (dmnsn_get_progress(progress) < 1.0) { + if (dmnsn_gl_write_canvas(scene->canvas) != 0) { + dmnsn_delete_display(display); + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Drawing to OpenGL failed! ---\n"); + return EXIT_FAILURE; + } + dmnsn_display_flush(display); + } + } + + if (dmnsn_finish_progress(progress) != 0) { + dmnsn_delete_display(display); + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Raytracing failed! ---\n"); + return EXIT_FAILURE; + } + + /* Make sure we show the completed rendering */ + if (display) { + printf("Drawing to OpenGL\n"); + if (dmnsn_gl_write_canvas(scene->canvas) != 0) { + dmnsn_delete_display(display); + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Drawing to OpenGL failed! ---\n"); + return EXIT_FAILURE; + } + dmnsn_display_flush(display); + } + + if (have_png) { + printf("Writing scene to PNG\n"); + FILE *ofile = fopen("render.png", "wb"); + if (!ofile) { + dmnsn_delete_display(display); + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Couldn't open 'render.png' for writing! ---\n"); + return EXIT_FAILURE; + } + + if (dmnsn_png_write_canvas(scene->canvas, ofile) != 0) { + fclose(ofile); + dmnsn_delete_display(display); + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Writing canvas to PNG failed! ---\n"); + return EXIT_FAILURE; + } + + fclose(ofile); + } + + dmnsn_delete_display(display); + dmnsn_delete_scene(scene); + return EXIT_SUCCESS; +} |