summaryrefslogtreecommitdiffstats
path: root/libdimension/gl.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@gmail.com>2011-08-27 10:40:42 -0600
committerTavian Barnes <tavianator@gmail.com>2011-08-27 10:40:42 -0600
commit27fe8b723cc51d9ea8ddeac5a29c0629376efe43 (patch)
treefcb966485d988dbf7d051085e2d80f91fb2888ea /libdimension/gl.c
parentfdf706b6486b9d67b60f737464316c4a5d7d7de6 (diff)
downloaddimension-27fe8b723cc51d9ea8ddeac5a29c0629376efe43.tar.xz
Simplify canvas export functions a bit.
Diffstat (limited to 'libdimension/gl.c')
-rw-r--r--libdimension/gl.c99
1 files changed, 19 insertions, 80 deletions
diff --git a/libdimension/gl.c b/libdimension/gl.c
index a968d75..71d0194 100644
--- a/libdimension/gl.c
+++ b/libdimension/gl.c
@@ -29,9 +29,21 @@
#include <stdint.h>
/** GL optimizer callback. */
-static void dmnsn_gl_optimizer_fn(const dmnsn_canvas *canvas,
- dmnsn_canvas_optimizer optimizer,
- size_t x, size_t y);
+static void
+dmnsn_gl_optimizer_fn(const dmnsn_canvas *canvas,
+ dmnsn_canvas_optimizer optimizer, size_t x, size_t y)
+{
+ GLushort *pixel = (GLushort *)optimizer.ptr + 4*(y*canvas->width + x);
+ dmnsn_color color = dmnsn_get_pixel(canvas, x, y);
+ color = dmnsn_remove_filter(color);
+ color = dmnsn_color_to_sRGB(color);
+
+ /* Saturate R, G, and B to [0, UINT16_MAX] */
+ pixel[0] = dmnsn_min(dmnsn_max(color.R, 0.0), 1.0)*UINT16_MAX;
+ pixel[1] = dmnsn_min(dmnsn_max(color.G, 0.0), 1.0)*UINT16_MAX;
+ pixel[2] = dmnsn_min(dmnsn_max(color.B, 0.0), 1.0)*UINT16_MAX;
+ pixel[3] = dmnsn_min(dmnsn_max(color.trans, 0.0), 1.0)*UINT16_MAX;
+}
/* Optimize canvas for GL drawing */
int
@@ -87,38 +99,10 @@ dmnsn_gl_write_canvas(const dmnsn_canvas *canvas)
color = dmnsn_color_to_sRGB(color);
/* Saturate R, G, and B to [0, UINT16_MAX] */
-
- if (color.R <= 0.0) {
- pixel[0] = 0;
- } else if (color.R >= 1.0) {
- pixel[0] = UINT16_MAX;
- } else {
- pixel[0] = color.R*UINT16_MAX;
- }
-
- if (color.G <= 0.0) {
- pixel[1] = 0;
- } else if (color.G >= 1.0) {
- pixel[1] = UINT16_MAX;
- } else {
- pixel[1] = color.G*UINT16_MAX;
- }
-
- if (color.B <= 0.0) {
- pixel[2] = 0;
- } else if (color.B >= 1.0) {
- pixel[2] = UINT16_MAX;
- } else {
- pixel[2] = color.B*UINT16_MAX;
- }
-
- if (color.trans <= 0.0) {
- pixel[3] = 0;
- } else if (color.trans >= 1.0) {
- pixel[3] = UINT16_MAX;
- } else {
- pixel[3] = color.trans*UINT16_MAX;
- }
+ pixel[0] = dmnsn_min(dmnsn_max(color.R, 0.0), 1.0)*UINT16_MAX;
+ pixel[1] = dmnsn_min(dmnsn_max(color.G, 0.0), 1.0)*UINT16_MAX;
+ pixel[2] = dmnsn_min(dmnsn_max(color.B, 0.0), 1.0)*UINT16_MAX;
+ pixel[3] = dmnsn_min(dmnsn_max(color.trans, 0.0), 1.0)*UINT16_MAX;
}
}
@@ -163,48 +147,3 @@ dmnsn_gl_read_canvas(size_t x0, size_t y0,
dmnsn_free(pixels);
return canvas;
}
-
-/* GL optimizer callback */
-static void
-dmnsn_gl_optimizer_fn(const dmnsn_canvas *canvas,
- dmnsn_canvas_optimizer optimizer, size_t x, size_t y)
-{
- GLushort *pixel = (GLushort *)optimizer.ptr + 4*(y*canvas->width + x);
- dmnsn_color color = dmnsn_get_pixel(canvas, x, y);
- color = dmnsn_remove_filter(color);
- color = dmnsn_color_to_sRGB(color);
-
- /* Saturate R, G, and B to [0, UINT16_MAX] */
-
- if (color.R <= 0.0) {
- pixel[0] = 0;
- } else if (color.R >= 1.0) {
- pixel[0] = UINT16_MAX;
- } else {
- pixel[0] = color.R*UINT16_MAX;
- }
-
- if (color.G <= 0.0) {
- pixel[1] = 0;
- } else if (color.G >= 1.0) {
- pixel[1] = UINT16_MAX;
- } else {
- pixel[1] = color.G*UINT16_MAX;
- }
-
- if (color.B <= 0.0) {
- pixel[2] = 0;
- } else if (color.B >= 1.0) {
- pixel[2] = UINT16_MAX;
- } else {
- pixel[2] = color.B*UINT16_MAX;
- }
-
- if (color.trans <= 0.0) {
- pixel[3] = 0;
- } else if (color.trans >= 1.0) {
- pixel[3] = UINT16_MAX;
- } else {
- pixel[3] = color.trans*UINT16_MAX;
- }
-}