+
+static inline void
+writeDrawBufferImage(JSONWriter &json, GLenum format)
+{
+ GLint width = glretrace::window_width;
+ GLint height = glretrace::window_height;
+
+ GLint channels = __gl_format_channels(format);
+
+ if (!width || !height) {
+ json.writeNull();
+ } else {
+ json.beginObject();
+
+ // Tell the GUI this is no ordinary object, but an image
+ json.writeStringMember("__class__", "image");
+
+ json.writeNumberMember("__width__", width);
+ json.writeNumberMember("__height__", height);
+ json.writeNumberMember("__depth__", 1);
+
+ // Hardcoded for now, but we could chose types more adequate to the
+ // texture internal format
+ json.writeStringMember("__type__", "uint8");
+ json.writeBoolMember("__normalized__", true);
+ json.writeNumberMember("__channels__", channels);
+
+ GLubyte *pixels = new GLubyte[width*height*channels];
+
+ GLint drawbuffer = glretrace::double_buffer ? GL_BACK : GL_FRONT;
+ GLint readbuffer = glretrace::double_buffer ? GL_BACK : GL_FRONT;
+ glGetIntegerv(GL_DRAW_BUFFER, &drawbuffer);
+ glGetIntegerv(GL_READ_BUFFER, &readbuffer);
+ glReadBuffer(drawbuffer);
+
+ glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
+ glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
+ glReadPixels(0, 0, width, height, format, GL_UNSIGNED_BYTE, pixels);
+
+ glPopClientAttrib();
+ glReadBuffer(readbuffer);
+
+ json.beginMember("__data__");
+ json.writeBase64(pixels, width * height * channels * sizeof *pixels);
+ json.endMember(); // __data__
+
+ delete [] pixels;
+ json.endObject();
+ }
+}
+