#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 {
*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
}
+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)
{
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);