summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/Makefile.am32
-rw-r--r--tests/error.cpp (renamed from tests/error.c)9
-rw-r--r--tests/gl.c126
-rw-r--r--tests/gl.cpp (renamed from tests/glxx.cpp)3
-rw-r--r--tests/png.c155
-rw-r--r--tests/png.cpp (renamed from tests/pngxx.cpp)2
-rw-r--r--tests/tests.c350
-rw-r--r--tests/tests.cpp (renamed from tests/testsxx.cpp)85
-rw-r--r--tests/tests.h74
-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;
}