diff options
-rw-r--r-- | tests/Makefile.am | 32 | ||||
-rw-r--r-- | tests/error.cpp (renamed from tests/error.c) | 9 | ||||
-rw-r--r-- | tests/gl.c | 126 | ||||
-rw-r--r-- | tests/gl.cpp (renamed from tests/glxx.cpp) | 3 | ||||
-rw-r--r-- | tests/png.c | 155 | ||||
-rw-r--r-- | tests/png.cpp (renamed from tests/pngxx.cpp) | 2 | ||||
-rw-r--r-- | tests/tests.c | 350 | ||||
-rw-r--r-- | tests/tests.cpp (renamed from tests/testsxx.cpp) | 85 | ||||
-rw-r--r-- | tests/tests.h | 74 | ||||
-rw-r--r-- | tests/tests.hpp (renamed from tests/testsxx.hpp) | 9 | ||||
-rw-r--r-- | tests/warning.cpp (renamed from tests/warning.c) | 25 |
11 files changed, 116 insertions, 754 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index f4c4107..e26b181 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -17,42 +17,28 @@ ## along with this program. If not, see <http://www.gnu.org/licenses/>. ## ########################################################################### -check_LTLIBRARIES = libdimension-tests.la \ - libdimensionxx-tests.la +check_LTLIBRARIES = libdimension-tests.la check_PROGRAMS = warning-test \ error-test \ png-test \ - pngxx-test \ - gl-test \ - glxx-test + gl-test TESTS = $(check_PROGRAMS) XFAIL_TESTS = error-test INCLUDES = -I../libdimension -I../libdimensionxx -libdimension_tests_la_SOURCES = tests.h \ - tests.c -libdimension_tests_la_LIBADD = ../libdimension/libdimension.la +libdimension_tests_la_SOURCES = tests.hpp \ + tests.cpp +libdimension_tests_la_LIBADD = ../libdimensionxx/libdimensionxx.la -libdimensionxx_tests_la_SOURCES = testsxx.hpp \ - testsxx.cpp -libdimensionxx_tests_la_LIBADD = ./libdimension-tests.la \ - ../libdimensionxx/libdimensionxx.la - -warning_test_SOURCES = warning.c +warning_test_SOURCES = warning.cpp warning_test_LDADD = ./libdimension-tests.la -error_test_SOURCES = error.c +error_test_SOURCES = error.cpp error_test_LDADD = ./libdimension-tests.la -png_test_SOURCES = png.c +png_test_SOURCES = png.cpp png_test_LDADD = ./libdimension-tests.la -pngxx_test_SOURCES = pngxx.cpp -pngxx_test_LDADD = ./libdimensionxx-tests.la - -gl_test_SOURCES = gl.c +gl_test_SOURCES = gl.cpp gl_test_LDADD = ./libdimension-tests.la - -glxx_test_SOURCES = glxx.cpp -glxx_test_LDADD = ./libdimensionxx-tests.la diff --git a/tests/error.c b/tests/error.cpp index 217db36..705e013 100644 --- a/tests/error.c +++ b/tests/error.cpp @@ -19,14 +19,15 @@ /* Make sure that errors terminate us - this test should fail */ -#include "tests.h" -#include <stdlib.h> +#include "tests.hpp" int main() { - dmnsn_set_resilience(DMNSN_SEVERITY_LOW); - dmnsn_error(DMNSN_SEVERITY_LOW, "This error is expected."); + using namespace Dimension; + + resilience(SEVERITY_LOW); + dmnsn_error(SEVERITY_LOW, "This error is expected."); return EXIT_SUCCESS; } diff --git a/tests/gl.c b/tests/gl.c deleted file mode 100644 index 8b999af..0000000 --- a/tests/gl.c +++ /dev/null @@ -1,126 +0,0 @@ -/************************************************************************* - * Copyright (C) 2009 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 <stdlib.h> -#include <stdio.h> - -int -main() { - dmnsn_display *display; - dmnsn_progress *progress, *barprogress; - dmnsn_scene *scene; - dmnsn_canvas *canvas; - - /* Set the resilience low for tests */ - dmnsn_set_resilience(DMNSN_SEVERITY_LOW); - - /* Create the default test scene */ - scene = dmnsn_new_default_scene(); - if (!scene) { - fprintf(stderr, "--- Couldn't create default scene! ---\n"); - return EXIT_FAILURE; - } - - /* Optimize the canvas for GL drawing */ - if (dmnsn_gl_optimize_canvas(scene->canvas) != 0) { - dmnsn_delete_default_scene(scene); - fprintf(stderr, "--- Couldn't optimize canvas for GL! ---\n"); - return EXIT_FAILURE; - } - - /* Create a new glX display */ - display = dmnsn_new_display(scene->canvas); - if (!display) { - dmnsn_delete_default_scene(scene); - fprintf(stderr, "--- Couldn't initialize X or glX! ---\n"); - return EXIT_FAILURE; - } - - /* Render the scene */ - - progress = dmnsn_raytrace_scene_async(scene); - if (!progress) { - dmnsn_delete_display(display); - dmnsn_delete_default_scene(scene); - fprintf(stderr, "--- Couldn't start raytracing worker thread! ---\n"); - return EXIT_FAILURE; - } - - barprogress = dmnsn_progressbar_async("Raytracing scene: ", progress); - - /* 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_default_scene(scene); - fprintf(stderr, "--- Drawing to openGL failed! ---\n"); - return EXIT_FAILURE; - } - dmnsn_display_flush(display); - } - - dmnsn_finish_progress(barprogress); - - if (dmnsn_finish_progress(progress) != 0) { - dmnsn_delete_display(display); - dmnsn_delete_default_scene(scene); - fprintf(stderr, "--- Raytracing failed! ---\n"); - return EXIT_FAILURE; - } - - /* Make sure we show the completed rendering */ - if (dmnsn_gl_write_canvas(scene->canvas) != 0) { - dmnsn_delete_display(display); - dmnsn_delete_default_scene(scene); - fprintf(stderr, "--- Drawing to openGL failed! ---\n"); - return EXIT_FAILURE; - } - dmnsn_display_flush(display); - - /* Show the image on screen for a bit */ - sleep(1); - - /* Read a canvas from the GL buffer */ - canvas = dmnsn_gl_read_canvas(0, 0, scene->canvas->x, scene->canvas->y); - if (!canvas) { - dmnsn_delete_display(display); - dmnsn_delete_default_scene(scene); - fprintf(stderr, "--- Reading canvas from GL buffer failed! ---\n"); - return EXIT_FAILURE; - } - - /* And write it back */ - if (dmnsn_gl_write_canvas(canvas) != 0) { - dmnsn_delete_canvas(canvas); - dmnsn_delete_display(display); - dmnsn_delete_default_scene(scene); - fprintf(stderr, "--- Drawing to openGL failed! ---\n"); - return EXIT_FAILURE; - } - dmnsn_display_flush(display); - - /* Show the image on screen for a bit */ - sleep(1); - - dmnsn_delete_canvas(canvas); - dmnsn_delete_display(display); - dmnsn_delete_default_scene(scene); - return EXIT_SUCCESS; -} diff --git a/tests/glxx.cpp b/tests/gl.cpp index e44510b..c01859b 100644 --- a/tests/glxx.cpp +++ b/tests/gl.cpp @@ -17,8 +17,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * *************************************************************************/ -#include "tests.h" -#include "testsxx.hpp" +#include "tests.hpp" #include <fstream> #include <iostream> diff --git a/tests/png.c b/tests/png.c deleted file mode 100644 index 488cd56..0000000 --- a/tests/png.c +++ /dev/null @@ -1,155 +0,0 @@ -/************************************************************************* - * Copyright (C) 2009 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 <stdlib.h> -#include <stdio.h> - -int -main() { - dmnsn_progress *progress; - 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(); - if (!scene) { - fprintf(stderr, "--- Allocation of default scene failed! ---\n"); - return EXIT_FAILURE; - } - - /* Optimize the canvas for PNG export */ - if (dmnsn_png_optimize_canvas(scene->canvas) != 0) { - dmnsn_delete_default_scene(scene); - fprintf(stderr, "--- Couldn't optimize canvas for PNG! ---\n"); - return EXIT_FAILURE; - } - - /* Render scene */ - - progress = dmnsn_raytrace_scene_async(scene); - if (!progress) { - dmnsn_delete_default_scene(scene); - fprintf(stderr, "--- Couldn't start raytracing worker thread! ---\n"); - return EXIT_FAILURE; - } - - dmnsn_progressbar("Raytracing scene: ", progress); - - if (dmnsn_finish_progress(progress) != 0) { - dmnsn_delete_default_scene(scene); - fprintf(stderr, "--- Raytracing failed! ---\n"); - return EXIT_FAILURE; - } - - /* Write the image to PNG */ - - ofile = fopen("png1.png", "wb"); - if (!ofile) { - dmnsn_delete_default_scene(scene); - fprintf(stderr, "--- Couldn't open 'png1.png' for writing! ---\n"); - return EXIT_FAILURE; - } - - progress = dmnsn_png_write_canvas_async(scene->canvas, ofile); - if (!progress) { - fclose(ofile); - dmnsn_delete_default_scene(scene); - fprintf(stderr, "--- Couldn't start PNG writing worker thread! ---\n"); - return EXIT_FAILURE; - } - - dmnsn_progressbar("Writing PNG file: ", progress); - - if (dmnsn_finish_progress(progress) != 0) { - fclose(ofile); - dmnsn_delete_default_scene(scene); - fprintf(stderr, "--- Writing canvas to PNG failed! ---\n"); - return EXIT_FAILURE; - } - - fclose(ofile); - dmnsn_delete_default_scene(scene); - } - - /* Now test PNG import/export */ - { - /* Read the image back from PNG */ - - ifile = fopen("png1.png", "rb"); - if (!ifile) { - fprintf(stderr, "--- Couldn't open 'png1.png' for reading! ---\n"); - return EXIT_FAILURE; - } - - progress = dmnsn_png_read_canvas_async(&canvas, ifile); - if (!progress) { - fclose(ifile); - fprintf(stderr, "--- Couldn't start PNG reading worker thread! ---\n"); - return EXIT_FAILURE; - } - - dmnsn_progressbar("Reading PNG file: ", progress); - - if (dmnsn_finish_progress(progress) != 0) { - fclose(ifile); - fprintf(stderr, "--- Reading canvas from PNG failed! ---\n"); - return EXIT_FAILURE; - } - - fclose(ifile); - - /* And write it back */ - - ofile = fopen("png2.png", "wb"); - if (!ofile) { - fprintf(stderr, "--- Couldn't open 'png2.png' for writing! ---\n"); - dmnsn_delete_canvas(canvas); - return EXIT_FAILURE; - } - - progress = dmnsn_png_write_canvas_async(canvas, ofile); - if (!progress) { - fclose(ofile); - dmnsn_delete_canvas(canvas); - fprintf(stderr, "--- Couldn't start PNG writing worker thread! ---\n"); - return EXIT_FAILURE; - } - - dmnsn_progressbar("Writing PNG file: ", progress); - - if (dmnsn_finish_progress(progress) != 0) { - fclose(ofile); - dmnsn_delete_canvas(canvas); - fprintf(stderr, "--- Writing canvas to PNG failed! ---\n"); - return EXIT_FAILURE; - } - - fclose(ofile); - dmnsn_delete_canvas(canvas); - } - - return EXIT_SUCCESS; -} diff --git a/tests/pngxx.cpp b/tests/png.cpp index 327ccd0..92a48d1 100644 --- a/tests/pngxx.cpp +++ b/tests/png.cpp @@ -17,7 +17,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * *************************************************************************/ -#include "testsxx.hpp" +#include "tests.hpp" #include <fstream> #include <iostream> diff --git a/tests/tests.c b/tests/tests.c deleted file mode 100644 index f8c02de..0000000 --- a/tests/tests.c +++ /dev/null @@ -1,350 +0,0 @@ -/************************************************************************* - * Copyright (C) 2009 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" - -dmnsn_scene * -dmnsn_new_default_scene() -{ - dmnsn_scene *scene; - dmnsn_object *sphere, *cube; - dmnsn_matrix trans; - dmnsn_sRGB sRGB; - dmnsn_color color; - - /* Allocate a new scene */ - scene = dmnsn_new_scene(); - if (!scene) { - return NULL; - } - - /* Background color */ - sRGB.R = 0.0; - sRGB.G = 0.0; - sRGB.B = 0.1; - color = dmnsn_color_from_sRGB(sRGB); - color.filter = 0.1; - scene->background = color; - - /* Allocate a canvas */ - scene->canvas = dmnsn_new_canvas(768, 480); - if (!scene->canvas) { - dmnsn_delete_scene(scene); - return NULL; - } - - /* Set up the transformation matrix for the perspective camera */ - trans = dmnsn_scale_matrix( - dmnsn_vector_construct( - ((double)scene->canvas->x)/scene->canvas->y, 1.0, 1.0 - ) - ); - trans = dmnsn_matrix_mul( - dmnsn_translation_matrix(dmnsn_vector_construct(0.0, 0.0, -4.0)), - trans - ); - trans = dmnsn_matrix_mul( - dmnsn_rotation_matrix(dmnsn_vector_construct(0.0, 1.0, 0.0)), - trans - ); - - /* Create a perspective camera */ - scene->camera = dmnsn_new_perspective_camera(); - if (!scene->camera) { - dmnsn_delete_canvas(scene->canvas); - dmnsn_delete_scene(scene); - return NULL; - } - dmnsn_set_perspective_camera_trans(scene->camera, trans); - - /* Now make our objects */ - - sphere = dmnsn_new_sphere(); - if (!sphere) { - dmnsn_delete_camera(scene->camera); - dmnsn_delete_canvas(scene->canvas); - dmnsn_delete_scene(scene); - return NULL; - } - - sphere->texture = dmnsn_new_texture(); - if (!sphere->texture) { - dmnsn_delete_object(sphere); - dmnsn_delete_camera(scene->camera); - dmnsn_delete_canvas(scene->canvas); - dmnsn_delete_scene(scene); - return NULL; - } - - sphere->texture->pigment = dmnsn_new_solid_pigment(dmnsn_white); - if (!sphere->texture->pigment) { - dmnsn_delete_texture(sphere->texture); - dmnsn_delete_object(sphere); - dmnsn_delete_camera(scene->camera); - dmnsn_delete_canvas(scene->canvas); - dmnsn_delete_scene(scene); - return NULL; - } - - sphere->trans = dmnsn_matrix_inverse( - dmnsn_scale_matrix(dmnsn_vector_construct(1.25, 1.25, 1.25)) - ); - dmnsn_array_push(scene->objects, &sphere); - - cube = dmnsn_new_cube(); - if (!cube) { - dmnsn_delete_pigment(sphere->texture->pigment); - dmnsn_delete_texture(sphere->texture); - dmnsn_delete_object(sphere); - dmnsn_delete_camera(scene->camera); - dmnsn_delete_canvas(scene->canvas); - dmnsn_delete_scene(scene); - return NULL; - } - - cube->trans = dmnsn_matrix_inverse( - dmnsn_rotation_matrix(dmnsn_vector_construct(0.75, 0.0, 0.0)) - ); - dmnsn_array_push(scene->objects, &cube); - - return scene; -} - -void -dmnsn_delete_default_scene(dmnsn_scene *scene) -{ - dmnsn_object *sphere, *cube; - dmnsn_array_get(scene->objects, 0, &sphere); - dmnsn_array_get(scene->objects, 1, &cube); - -// dmnsn_delete_pigment(cube->texture->pigment); - dmnsn_delete_texture(cube->texture); - dmnsn_delete_object(cube); - - dmnsn_delete_pigment(sphere->texture->pigment); - dmnsn_delete_texture(sphere->texture); - dmnsn_delete_object(sphere); - - dmnsn_delete_camera(scene->camera); - dmnsn_delete_canvas(scene->canvas); - dmnsn_delete_scene(scene); -} - -/* XIfEvent callback */ -static Bool -WaitForNotify(Display *d, XEvent *e, char *arg) -{ - return (e->type == MapNotify) && (e->xmap.window == (Window)arg); -} - -dmnsn_display * -dmnsn_new_display(const dmnsn_canvas *canvas) -{ - int attributeList[] = { - GLX_RGBA, - GLX_DOUBLEBUFFER, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - None - }; - dmnsn_display *display; - XVisualInfo *vi; - XSetWindowAttributes swa; - - display = malloc(sizeof(dmnsn_display)); - if (!display) { - return NULL; - } - - /* Get an X connection */ - display->dpy = XOpenDisplay(0); - if (!display->dpy) { - free(display); - return NULL; - } - - /* Get an appropriate visual */ - vi = glXChooseVisual(display->dpy, DefaultScreen(display->dpy), - attributeList); - if (!vi) { - XCloseDisplay(display->dpy); - free(display); - return NULL; - } - - /* Create a GLX context */ - display->cx = glXCreateContext(display->dpy, vi, 0, GL_TRUE); - if (!display->cx) { - XCloseDisplay(display->dpy); - free(display); - return NULL; - } - - /* Create a color map */ - display->cmap = XCreateColormap(display->dpy, - RootWindow(display->dpy, vi->screen), - vi->visual, AllocNone); - if (!display->cmap) { - glXDestroyContext(display->dpy, display->cx); - XCloseDisplay(display->dpy); - free(display); - return NULL; - } - - /* Create a window */ - swa.colormap = display->cmap; - swa.border_pixel = 0; - swa.event_mask = StructureNotifyMask; - display->win = XCreateWindow(display->dpy, - RootWindow(display->dpy, vi->screen), - 0, 0, canvas->x, canvas->y, - 0, vi->depth, InputOutput, vi->visual, - CWBorderPixel|CWColormap|CWEventMask, &swa); - if (!display->win) { - XFreeColormap(display->dpy, display->cmap); - glXDestroyContext(display->dpy, display->cx); - XCloseDisplay(display->dpy); - free(display); - return NULL; - } - - XStoreName(display->dpy, display->win, "glX"); - - XMapWindow(display->dpy, display->win); - XIfEvent(display->dpy, &display->event, WaitForNotify, (char*)display->win); - - /* Connect the context to the window */ - glXMakeCurrent(display->dpy, display->win, display->cx); - - return display; -} - -void -dmnsn_delete_display(dmnsn_display *display) -{ - if (display) { - XDestroyWindow(display->dpy, display->win); - XFreeColormap(display->dpy, display->cmap); - glXDestroyContext(display->dpy, display->cx); - XCloseDisplay(display->dpy); - free(display); - } -} - -void -dmnsn_display_flush(dmnsn_display *display) -{ - glFlush(); - glXSwapBuffers(display->dpy, display->win); -} - -/* Print a progress bar of the progress of `progress' */ -void -dmnsn_progressbar(const char *str, const dmnsn_progress *progress) -{ - dmnsn_progress *barprogress = dmnsn_progressbar_async(str, progress); - if (dmnsn_finish_progress(barprogress) != 0) { - dmnsn_error(DMNSN_SEVERITY_HIGH, - "Progress bar background thread failed."); - } -} - -typedef struct { - dmnsn_progress *barprogress; - const char *str; - const dmnsn_progress *progress; -} dmnsn_progressbar_payload; - -/* Progress bar thread callback */ -static void *dmnsn_progressbar_thread(void *ptr); - -/* Print a progress bar in the background */ -dmnsn_progress * -dmnsn_progressbar_async(const char *str, const dmnsn_progress *progress) -{ - dmnsn_progress *barprogress = dmnsn_new_progress(); - dmnsn_progressbar_payload *payload; - - if (barprogress) { - payload = malloc(sizeof(dmnsn_progressbar_payload)); - if (!payload) { - dmnsn_error(DMNSN_SEVERITY_HIGH, - "Couldn't allocate progress bar payload."); - } - - payload->barprogress = barprogress; - payload->str = str; - payload->progress = progress; - - /* Create the worker thread */ - if (pthread_create(&barprogress->thread, NULL, &dmnsn_progressbar_thread, - payload) != 0) - { - dmnsn_error(DMNSN_SEVERITY_HIGH, - "Couldn't start progress bar background thread."); - } - } - - return barprogress; -} - -/* Actual progress bar implementation */ -static int dmnsn_progressbar_impl(dmnsn_progress *barprogress, const char *str, - const dmnsn_progress *progress); - -/* Progress bar thread callback */ -static void * -dmnsn_progressbar_thread(void *ptr) -{ - dmnsn_progressbar_payload *payload = ptr; - int *retval = malloc(sizeof(int)); - if (retval) { - *retval = dmnsn_progressbar_impl(payload->barprogress, - payload->str, payload->progress); - } - dmnsn_done_progress(payload->barprogress); - free(payload); - return retval; -} - -/* Actual progress bar implementation */ -static int -dmnsn_progressbar_impl(dmnsn_progress *barprogress, - const char *str, const dmnsn_progress *progress) -{ - const unsigned int increments = 32; - unsigned int i; - - dmnsn_new_progress_element(barprogress, increments); - - printf("%s|", str); - fflush(stdout); - for (i = 0; i < increments; ++i) { - dmnsn_wait_progress(progress, ((double)(i + 1))/increments); - - printf("="); - fflush(stdout); - dmnsn_increment_progress(barprogress); - } - printf("|\n"); - fflush(stdout); - - return 0; -} diff --git a/tests/testsxx.cpp b/tests/tests.cpp index fa8c2f0..002adbb 100644 --- a/tests/testsxx.cpp +++ b/tests/tests.cpp @@ -17,7 +17,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * *************************************************************************/ -#include "testsxx.hpp" +#include "tests.hpp" namespace Dimension { @@ -62,23 +62,98 @@ namespace Dimension return scene; } + namespace + { + /* XIfEvent callback */ + Bool + WaitForNotify(::Display *d, XEvent *e, char *arg) + { + return (e->type == MapNotify) && (e->xmap.window == (Window)arg); + } + } + Display::Display(const Canvas& canvas) - : m_display(dmnsn_new_display(canvas.dmnsn())) { - if (!m_display) { + int attributeList[] = { + GLX_RGBA, + GLX_DOUBLEBUFFER, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + None + }; + XVisualInfo *vi; + XSetWindowAttributes swa; + + /* Get an X connection */ + m_dpy = XOpenDisplay(0); + if (!m_dpy) { + throw Dimension_Error("Couldn't create display."); + } + + /* Get an appropriate visual */ + vi = glXChooseVisual(m_dpy, DefaultScreen(m_dpy), + attributeList); + if (!vi) { + XCloseDisplay(m_dpy); throw Dimension_Error("Couldn't create display."); } + + /* Create a GLX context */ + m_cx = glXCreateContext(m_dpy, vi, 0, GL_TRUE); + if (!m_cx) { + XCloseDisplay(m_dpy); + throw Dimension_Error("Couldn't create display."); + } + + /* Create a color map */ + m_cmap = XCreateColormap(m_dpy, + RootWindow(m_dpy, vi->screen), + vi->visual, AllocNone); + if (!m_cmap) { + glXDestroyContext(m_dpy, m_cx); + XCloseDisplay(m_dpy); + throw Dimension_Error("Couldn't create display."); + } + + /* Create a window */ + swa.colormap = m_cmap; + swa.border_pixel = 0; + swa.event_mask = StructureNotifyMask; + m_win = XCreateWindow(m_dpy, + RootWindow(m_dpy, vi->screen), + 0, 0, canvas.width(), canvas.height(), + 0, vi->depth, InputOutput, vi->visual, + CWBorderPixel|CWColormap|CWEventMask, &swa); + if (!m_win) { + XFreeColormap(m_dpy, m_cmap); + glXDestroyContext(m_dpy, m_cx); + XCloseDisplay(m_dpy); + throw Dimension_Error("Couldn't create display."); + } + + XStoreName(m_dpy, m_win, "glX"); + + XMapWindow(m_dpy, m_win); + XIfEvent(m_dpy, &m_event, &WaitForNotify, (char*)m_win); + + /* Connect the context to the window */ + glXMakeCurrent(m_dpy, m_win, m_cx); } Display::~Display() { - dmnsn_delete_display(m_display); + XDestroyWindow(m_dpy, m_win); + XFreeColormap(m_dpy, m_cmap); + glXDestroyContext(m_dpy, m_cx); + XCloseDisplay(m_dpy); } void Display::flush() { - dmnsn_display_flush(m_display); + glFlush(); + glXSwapBuffers(m_dpy, m_win); } namespace diff --git a/tests/tests.h b/tests/tests.h deleted file mode 100644 index 19111c8..0000000 --- a/tests/tests.h +++ /dev/null @@ -1,74 +0,0 @@ -/************************************************************************* - * Copyright (C) 2009 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/>. * - *************************************************************************/ - -#ifndef TESTS_H -#define TESTS_H - -#include "../libdimension/dimension.h" -#include <GL/glx.h> -#include <GL/gl.h> -#include <unistd.h> -#include <stdio.h> - -#ifdef __cplusplus -/* We've been included from a C++ file; mark everything here as extern "C" */ -extern "C" { -#endif - -/* - * Convenience - */ - -dmnsn_scene *dmnsn_new_default_scene(); -void dmnsn_delete_default_scene(dmnsn_scene *scene); - -/* - * Windowing - */ - -typedef struct { - Display *dpy; - Window win; - Colormap cmap; - GLXContext cx; - XEvent event; -} dmnsn_display; - -dmnsn_display *dmnsn_new_display(const dmnsn_canvas *canvas); -void dmnsn_delete_display(dmnsn_display *display); - -/* Flush the GL buffers */ -void dmnsn_display_flush(dmnsn_display *display); - -/* - * Asynchronicity - */ - -/* Print a progress bar of the progress of `progress' */ -void dmnsn_progressbar(const char *str, const dmnsn_progress *progress); -/* Print a progress bar asynchronously, convienently guaranteed to succeed if - it returns so our tests don't get cluttered up */ -dmnsn_progress *dmnsn_progressbar_async(const char *str, - const dmnsn_progress *progress); - -#ifdef __cplusplus -} -#endif - -#endif /* TESTS_H */ diff --git a/tests/testsxx.hpp b/tests/tests.hpp index e2b654f..437bd36 100644 --- a/tests/testsxx.hpp +++ b/tests/tests.hpp @@ -20,9 +20,10 @@ #ifndef TESTSXX_HPP #define TESTSXX_HPP -#include "tests.h" #include "../libdimensionxx/dimensionxx.hpp" #include <iostream> +#include <GL/glx.h> +#include <GL/gl.h> namespace Dimension { @@ -41,7 +42,11 @@ namespace Dimension void flush(); private: - dmnsn_display* m_display; + ::Display *m_dpy; + Window m_win; + Colormap m_cmap; + GLXContext m_cx; + XEvent m_event; }; Progress progressbar_async(std::ostream& ostr, diff --git a/tests/warning.c b/tests/warning.cpp index 7b6aac3..9d74e9d 100644 --- a/tests/warning.c +++ b/tests/warning.cpp @@ -19,35 +19,36 @@ /* Make sure warnings don't kill us - this test should pass */ -#include "tests.h" -#include <stdlib.h> +#include "tests.hpp" int main() { - if (dmnsn_get_resilience() != DMNSN_SEVERITY_MEDIUM) { + using namespace Dimension; + + if (resilience() != SEVERITY_MEDIUM) { return EXIT_FAILURE; } - dmnsn_set_resilience(DMNSN_SEVERITY_LOW); - if (dmnsn_get_resilience() != DMNSN_SEVERITY_LOW) { + resilience(SEVERITY_LOW); + if (resilience() != SEVERITY_LOW) { return EXIT_FAILURE; } - dmnsn_set_resilience(DMNSN_SEVERITY_MEDIUM); - if (dmnsn_get_resilience() != DMNSN_SEVERITY_MEDIUM) { + resilience(SEVERITY_MEDIUM); + if (resilience() != SEVERITY_MEDIUM) { return EXIT_FAILURE; } - dmnsn_error(DMNSN_SEVERITY_LOW, "This warning is expected."); + dmnsn_error(SEVERITY_LOW, "This warning is expected."); - dmnsn_set_resilience(DMNSN_SEVERITY_HIGH); - if (dmnsn_get_resilience() != DMNSN_SEVERITY_HIGH) { + resilience(SEVERITY_HIGH); + if (resilience() != SEVERITY_HIGH) { return EXIT_FAILURE; } - dmnsn_error(DMNSN_SEVERITY_LOW, "This warning is expected."); - dmnsn_error(DMNSN_SEVERITY_MEDIUM, "This warning is expected."); + dmnsn_error(SEVERITY_LOW, "This warning is expected."); + dmnsn_error(SEVERITY_MEDIUM, "This warning is expected."); return EXIT_SUCCESS; } |