]> git.cworth.org Git - apitrace/blobdiff - glstate.cpp
Make windows build user friendlier.
[apitrace] / glstate.cpp
index 6dc6f8063a2bf37c5c0b6896ac7f777214fa76bd..59d28c967336fc3c044a700e5224f94dfe9bb58a 100644 (file)
 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
@@ -405,6 +400,49 @@ getDrawableBounds(GLint *width, GLint *height) {
 }
 
 
+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)
 {
@@ -439,6 +477,13 @@ dumpDrawBufferImage(JSONWriter &json, GLenum format)
         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, pixels);