]> git.cworth.org Git - apitrace/blobdiff - glstate.cpp
Make windows build user friendlier.
[apitrace] / glstate.cpp
index a60c687691f39ef317025a4ab5f8426b9f8dbaa0..59d28c967336fc3c044a700e5224f94dfe9bb58a 100644 (file)
 #include "glstate.hpp"
 
 
+#ifdef __APPLE__
+
+#include <Carbon/Carbon.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OSStatus CGSGetSurfaceBounds(CGSConnectionID, CGWindowID, CGSSurfaceID, CGRect *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __APPLE__ */
+
+
 namespace glstate {
 
 
@@ -328,10 +345,29 @@ getDrawableBounds(GLint *width, GLint *height) {
     *width  = rect.right  - rect.left;
     *height = rect.bottom - rect.top;
 
-#elif 0 /* __APPLE__ */
+#elif defined(__APPLE__)
 
-    CGLError CGLGetSurface(CGLContextObj, CGSConnectionID*, CGSWindowID*, CGSSurfaceID*);
-    CGError CGSGetWindowBounds(CGSConnectionID, CGWindowID, CGRect *ret);
+    CGLContextObj ctx = CGLGetCurrentContext();
+    if (ctx == NULL) {
+        return false;
+    }
+
+    CGSConnectionID cid;
+    CGSWindowID wid;
+    CGSSurfaceID sid;
+
+    if (CGLGetSurface(ctx, &cid, &wid, &sid) != kCGLNoError) {
+        return false;
+    }
+
+    CGRect rect;
+
+    if (CGSGetSurfaceBounds(cid, wid, sid, &rect) != 0) {
+        return false;
+    }
+
+    *width = rect.size.width;
+    *height = rect.size.height;
 
 #else
 
@@ -364,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)
 {
@@ -398,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);