}
+Image::Image *
+getDrawBufferImage(GLenum format) {
+ GLint width, height;
+
+ if (format != GL_RGBA) {
+ // FIXME: this function can only handle 4-channel images
+ return NULL;
+ }
+
+ if (!getDrawableBounds(&width, &height)) {
+ return NULL;
+ }
+
+ Image::Image *image = new Image::Image(width, height, 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, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);
+
+ glPopClientAttrib();
+
+ glReadBuffer(readbuffer);
+
+ return image;
+}
+
+
static inline void
dumpDrawBufferImage(JSONWriter &json, GLenum format)
{