summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordon bright <hugh.m.bright@gmail.com>2013-01-26 05:52:06 (GMT)
committerdon bright <hugh.m.bright@gmail.com>2013-01-26 05:52:06 (GMT)
commit544a8e5b799f5dd0a35d650c00db10074104650a (patch)
tree0651f5efa1422aaf166a303c1210a92b23850681 /src
parent395628cb4ef7f8559c667af22fb273e21e4a5ad8 (diff)
refactor to reduce duplicate code
Diffstat (limited to 'src')
-rw-r--r--src/OffscreenContext.h23
-rw-r--r--src/OffscreenContextCGL.mm2
-rw-r--r--src/OffscreenContextGLX.cc25
-rw-r--r--src/OffscreenContextWGL.cc42
4 files changed, 11 insertions, 81 deletions
diff --git a/src/OffscreenContext.h b/src/OffscreenContext.h
index 3494898..a32ea2c 100644
--- a/src/OffscreenContext.h
+++ b/src/OffscreenContext.h
@@ -4,31 +4,12 @@
#include <iostream>
#include <fstream>
#include <string>
+#include "fbo.h"
struct OffscreenContext *create_offscreen_context(int w, int h);
bool teardown_offscreen_context(OffscreenContext *ctx);
+bool save_framebuffer(OffscreenContext *ctx, const char * filename);
bool save_framebuffer(OffscreenContext *ctx, std::ostream &output);
std::string offscreen_context_getinfo(OffscreenContext *ctx);
-void bind_offscreen_context(OffscreenContext *ctx)
-{
- if (ctx) fbo_bind(ctx->fbo);
-}
-
-/*
- Capture framebuffer from OpenGL and write it to the given filename as PNG.
-*/
-inline bool save_framebuffer(OffscreenContext *ctx, const char *filename)
-{
- std::ofstream fstream(filename);
- if (!fstream.is_open()) {
- std::cerr << "Can't open file " << filename << " for writing";
- return false;
- } else {
- save_framebuffer(ctx, fstream);
- fstream.close();
- }
- return true;
-}
-
#endif
diff --git a/src/OffscreenContextCGL.mm b/src/OffscreenContextCGL.mm
index b3a5501..c6d76ab 100644
--- a/src/OffscreenContextCGL.mm
+++ b/src/OffscreenContextCGL.mm
@@ -19,6 +19,8 @@ struct OffscreenContext
fbo_t *fbo;
};
+#include "OffscreenContextAll.hpp"
+
std::string offscreen_context_getinfo(OffscreenContext *ctx)
{
std::stringstream out;
diff --git a/src/OffscreenContextGLX.cc b/src/OffscreenContextGLX.cc
index dee47ed..574fbb5 100644
--- a/src/OffscreenContextGLX.cc
+++ b/src/OffscreenContextGLX.cc
@@ -62,6 +62,8 @@ struct OffscreenContext
fbo_t *fbo;
};
+#include "OffscreenContextAll.hpp"
+
void offscreen_context_init(OffscreenContext &ctx, int width, int height)
{
ctx.width = width;
@@ -296,30 +298,9 @@ bool teardown_offscreen_context(OffscreenContext *ctx)
return false;
}
-/*!
- Capture framebuffer from OpenGL and write it to the given ostream
-*/
bool save_framebuffer(OffscreenContext *ctx, std::ostream &output)
{
glXSwapBuffers(ctx->xdisplay, ctx->xwindow);
- if (!ctx) return false;
- int samplesPerPixel = 4; // R, G, B and A
- GLubyte pixels[ctx->width * ctx->height * samplesPerPixel];
- glReadPixels(0, 0, ctx->width, ctx->height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
-
- // Flip it vertically - images read from OpenGL buffers are upside-down
- int rowBytes = samplesPerPixel * ctx->width;
- unsigned char *flippedBuffer = (unsigned char *)malloc(rowBytes * ctx->height);
- if (!flippedBuffer) {
- cerr << "Unable to allocate flipped buffer for corrected image.";
- return 1;
- }
- flip_image(pixels, flippedBuffer, samplesPerPixel, ctx->width, ctx->height);
-
- bool writeok = write_png(output, flippedBuffer, ctx->width, ctx->height);
-
- free(flippedBuffer);
-
- return writeok;
+ return save_framebuffer_common(ctx, output);
}
diff --git a/src/OffscreenContextWGL.cc b/src/OffscreenContextWGL.cc
index b2b0e2a..b892c24 100644
--- a/src/OffscreenContextWGL.cc
+++ b/src/OffscreenContextWGL.cc
@@ -38,6 +38,8 @@ struct OffscreenContext
fbo_t *fbo;
};
+#include "OffscreenContextAll.hpp"
+
void offscreen_context_init(OffscreenContext &ctx, int width, int height)
{
ctx.window = (HWND)NULL;
@@ -214,46 +216,10 @@ bool teardown_offscreen_context(OffscreenContext *ctx)
return false;
}
-/*!
- Capture framebuffer from OpenGL and write it to the given filename as PNG.
-*/
-bool save_framebuffer(OffscreenContext *ctx, const char *filename)
-{
- std::ofstream fstream(filename);
- if (!fstream.is_open()) {
- PRINTB("Can't open file \"%s\" for writing", filename);
- return false;
- } else {
- save_framebuffer(ctx, fstream);
- fstream.close();
- }
- return true;
-}
-
-/*!
- Capture framebuffer from OpenGL and write it to the given filename as PNG.
-*/
bool save_framebuffer(OffscreenContext *ctx, std::ostream &output)
{
+ if (!ctx) return false;
wglSwapLayerBuffers( ctx->dev_context, WGL_SWAP_MAIN_PLANE );
- if (!ctx || !filename) return false;
- int samplesPerPixel = 4; // R, G, B and A
- vector<GLubyte> pixels(ctx->width * ctx->height * samplesPerPixel);
- glReadPixels(0, 0, ctx->width, ctx->height, GL_RGBA, GL_UNSIGNED_BYTE, &pixels[0]);
-
- // Flip it vertically - images read from OpenGL buffers are upside-down
- int rowBytes = samplesPerPixel * ctx->width;
- unsigned char *flippedBuffer = (unsigned char *)malloc(rowBytes * ctx->height);
- if (!flippedBuffer) {
- std::cerr << "Unable to allocate flipped buffer for corrected image.";
- return 1;
- }
- flip_image(&pixels[0], flippedBuffer, samplesPerPixel, ctx->width, ctx->height);
-
- bool writeok = write_png(output, flippedBuffer, ctx->width, ctx->height);
-
- free(flippedBuffer);
-
- return writeok;
+ return save_framebuffer_common( ctx, output );
}
contact: Jan Huwald // Impressum