diff options
Diffstat (limited to 'libdimension')
-rw-r--r-- | libdimension/Makefile.am | 4 | ||||
-rw-r--r-- | libdimension/dimension.h | 1 | ||||
-rw-r--r-- | libdimension/dimension/gl.h | 37 | ||||
-rw-r--r-- | libdimension/gl.c | 91 |
4 files changed, 132 insertions, 1 deletions
diff --git a/libdimension/Makefile.am b/libdimension/Makefile.am index 16bf4a7..7a18535 100644 --- a/libdimension/Makefile.am +++ b/libdimension/Makefile.am @@ -25,6 +25,7 @@ nobase_include_HEADERS = dimension.h \ dimension/color.h \ dimension/error.h \ dimension/geometry.h \ + dimension/gl.h \ dimension/png.h \ dimension/progress.h \ dimension/object.h \ @@ -41,6 +42,7 @@ libdimension_la_SOURCES = $(nobase_include_HEADERS) \ color.c \ error.c \ geometry.c \ + gl.c \ inlines.c \ png.c \ progress.c \ @@ -49,4 +51,4 @@ libdimension_la_SOURCES = $(nobase_include_HEADERS) \ raytrace.c \ scene.c libdimension_la_LDFLAGS = -version-info 0:0:0 -libdimension_la_LIBADD = -lm -lpthread -lpng +libdimension_la_LIBADD = -lm -lpthread -lpng -lGL diff --git a/libdimension/dimension.h b/libdimension/dimension.h index 5734616..869b959 100644 --- a/libdimension/dimension.h +++ b/libdimension/dimension.h @@ -57,6 +57,7 @@ extern "C" { #include <dimension/geometry.h> #include <dimension/color.h> #include <dimension/canvas.h> +#include <dimension/gl.h> #include <dimension/png.h> #include <dimension/object.h> #include <dimension/objects.h> diff --git a/libdimension/dimension/gl.h b/libdimension/dimension/gl.h new file mode 100644 index 0000000..e27c418 --- /dev/null +++ b/libdimension/dimension/gl.h @@ -0,0 +1,37 @@ +/************************************************************************* + * Copyright (C) 2008 Tavian Barnes <tavianator@gmail.com> * + * * + * This file is part of The Dimension Library. * + * * + * The Dimension Library is free software; you can redistribute it and/ * + * or modify it under the terms of the GNU Lesser 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 Library 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this program. If not, see * + * <http://www.gnu.org/licenses/>. * + *************************************************************************/ + +/* + * Draw a canvas to a GL framebuffer with glDrawPixels, or read one with + * glReadPixels. Should be fast, so no _async() versions. + */ + +#ifndef DIMENSION_GL_H +#define DIMENSION_GL_H + +#include <stdio.h> + +/* Write canvas to GL framebuffer. Returns 0 on success, nonzero on failure */ +int dmnsn_gl_write_canvas(const dmnsn_canvas *canvas); + +/* Read a canvas from a GL framebuffer. Returns NULL on failure. */ +dmnsn_canvas *dmnsn_gl_read_canvas(); + +#endif /* DIMENSION_GL_H */ diff --git a/libdimension/gl.c b/libdimension/gl.c new file mode 100644 index 0000000..3542a2d --- /dev/null +++ b/libdimension/gl.c @@ -0,0 +1,91 @@ +/************************************************************************* + * Copyright (C) 2008 Tavian Barnes <tavianator@gmail.com> * + * * + * This file is part of The Dimension Library. * + * * + * The Dimension Library is free software; you can redistribute it and/ * + * or modify it under the terms of the GNU Lesser 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 Library 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this program. If not, see * + * <http://www.gnu.org/licenses/>. * + *************************************************************************/ + +#include "dimension.h" +#include <GL/gl.h> + +/* Write canvas to GL framebuffer. Returns 0 on success, nonzero on failure */ +int +dmnsn_gl_write_canvas(const dmnsn_canvas *canvas) +{ + GLuint *pixels; /* Array of 32-bit ints in RGBA order */ + GLuint *pixel; + dmnsn_sRGB sRGB; + dmnsn_color color; + unsigned int x, y, width, height; + + width = canvas->x; + height = canvas->y; + + pixels = malloc(4*width*height*sizeof(GLuint)); + if (!pixels) { + return 1; + } + + for (y = 0; y < height; ++y) { + for (x = 0; x < width; ++x) { + pixel = pixels + 4*(y*width + x); + + color = dmnsn_get_pixel(canvas, x, y); + sRGB = dmnsn_sRGB_from_color(color); + + /* Saturate R, G, and B to [0, UINT32_MAX] */ + + if (sRGB.R <= 0.0) { + pixel[0] = 0; + } else if (sRGB.R >= 1.0) { + pixel[0] = UINT32_MAX; + } else { + pixel[0] = sRGB.R*UINT32_MAX; + } + + if (sRGB.G <= 0.0) { + pixel[1] = 0; + } else if (sRGB.G >= 1.0) { + pixel[1] = UINT32_MAX; + } else { + pixel[1] = sRGB.G*UINT32_MAX; + } + + if (sRGB.B <= 0.0) { + pixel[2] = 0; + } else if (sRGB.B >= 1.0) { + pixel[2] = UINT32_MAX; + } else { + pixel[2] = sRGB.B*UINT32_MAX; + } + + /* color.filter + color.trans is in [0.0, 1.0] by definition */ + pixel[3] = (color.filter + color.trans)*UINT32_MAX; + } + } + + glDrawPixels(width, height, GL_RGBA, GL_UNSIGNED_INT, pixels); + + free(pixels); + return 0; +} + +/* Read a canvas from a GL framebuffer. Returns NULL on failure. */ +dmnsn_canvas * +dmnsn_gl_read_canvas() +{ + return NULL; +} |