extern "C" {
#endif
-typedef int CGSConnectionID;
-typedef int CGSWindowID;
-typedef int CGSSurfaceID;
-
-CGLError CGLGetSurface(CGLContextObj, CGSConnectionID*, CGSWindowID*, CGSSurfaceID*);
OSStatus CGSGetSurfaceBounds(CGSConnectionID, CGWindowID, CGSSurfaceID, CGRect *);
#ifdef __cplusplus
}
+Image::Image *
+getDrawBufferImage(GLenum format) {
+ GLint channels = __gl_format_channels(format);
+ if (channels > 4) {
+ return NULL;
+ }
+
+ GLint width, height;
+ if (!getDrawableBounds(&width, &height)) {
+ return NULL;
+ }
+
+ Image::Image *image = new Image::Image(width, height, channels, true);
+ if (!image) {
+ return NULL;
+ }
+
+ GLint drawbuffer = GL_NONE;
+ GLint readbuffer = GL_NONE;
+ glGetIntegerv(GL_DRAW_BUFFER, &drawbuffer);
+ glGetIntegerv(GL_READ_BUFFER, &readbuffer);
+ glReadBuffer(drawbuffer);
+
+ glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
+ glPixelStorei(GL_PACK_SWAP_BYTES, GL_FALSE);
+ glPixelStorei(GL_PACK_LSB_FIRST, GL_FALSE);
+ glPixelStorei(GL_PACK_ROW_LENGTH, 0);
+ glPixelStorei(GL_PACK_IMAGE_HEIGHT, 0);
+ glPixelStorei(GL_PACK_SKIP_ROWS, 0);
+ glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
+ glPixelStorei(GL_PACK_SKIP_IMAGES, 0);
+ glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
+ glReadPixels(0, 0, width, height, format, GL_UNSIGNED_BYTE, image->pixels);
+
+ glPopClientAttrib();
+
+ glReadBuffer(readbuffer);
+
+ return image;
+}
+
+
static inline void
dumpDrawBufferImage(JSONWriter &json, GLenum format)
{