Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // This C code captures the screen of Macs and shows it in an OpenGL window through the function glDrawPixels
- // gcc -o opengl-capture opengl-capture.c -framework Carbon -framework OpenGL -framework GLUT
- #include <OpenGL/gl.h>
- #include <GLUT/glut.h>
- #include </System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreGraphics.framework/Headers/CoreGraphics.h>
- #include <objc/objc-runtime.h>
- unsigned int window_width = 800, window_height = 600;
- int* getMainScreenSize() {
- CGRect r = CGDisplayBounds(kCGDirectMainDisplay);
- int *size=malloc(sizeof(int)*2);
- size[0]=r.size.width;
- size[1]=r.size.height;
- return size;
- }
- int* getAllScreensSize() {
- CGImageRef img = CGWindowListCreateImage(CGRectInfinite, kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);
- int *size=malloc(sizeof(int)*2);
- size[0]=CGImageGetWidth(img);
- size[1]=CGImageGetHeight(img);
- return size;
- }
- CGImageRef captureImage(CGRect r) {
- return CGWindowListCreateImage(r, kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);
- }
- unsigned char* macPixelsToRGB(CGImageRef image,unsigned char *pixelData) {
- int bytesPerPixel=CGImageGetBitsPerPixel(image)/8;
- int bytesPerRow=CGImageGetBytesPerRow(image);
- int imageWidth=CGImageGetWidth(image);
- int imageHeight=CGImageGetHeight(image);
- int x,y,m,p;
- unsigned char *rgb=(unsigned char*)malloc(imageWidth*imageHeight*3);
- for(y=0; y<imageHeight; y++) {
- for(x=0; x<imageWidth; x++) {
- m=y*bytesPerRow+x*bytesPerPixel;
- p=(y*imageWidth+x)*3;
- rgb[p+0]=pixelData[m+2]/2;
- rgb[p+1]=pixelData[m+1]/2;
- rgb[p+2]=pixelData[m+0]/2;
- //rgb[p+0]=(int)(127.0*(double)y/(double)imageHeight);
- //rgb[p+1]=0;
- //rgb[p+2]=0;
- }
- }
- return rgb;
- }
- unsigned char* getImageBuffer(CGImageRef image) {
- if(image == NULL) {
- fprintf(stderr,"CGWindowListCreateImage failed!\n");
- return NULL;
- }
- CGDataProviderRef provider = CGImageGetDataProvider(image);
- CFDataRef dataRef = CGDataProviderCopyData(provider);
- unsigned char *pixelData=(unsigned char*)CFDataGetBytePtr(dataRef);
- return macPixelsToRGB(image,pixelData);
- }
- unsigned char* captureScreenRegion(int x,int y,int width,int height) {
- CGRect r;
- r.origin.x = x;
- r.origin.y = y;
- r.size.width = width;
- r.size.height = height;
- return getImageBuffer(captureImage(r));
- }
- unsigned char* captureTheWholeScreen() {
- return getImageBuffer(captureImage(CGRectInfinite));
- }
- void display() {
- unsigned char *pixels=captureScreenRegion(0,0,window_width,window_height);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glRasterPos2f(-1,1);
- glPixelZoom( 1, -1 );
- glDrawPixels(window_width,window_height,GL_RGB,GL_BYTE,pixels);
- free(pixels);
- glutSwapBuffers();
- }
- int main(int argc, char** argv) {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
- glutInitWindowSize(window_width, window_height);
- glutCreateWindow("OpenGL glDrawPixels demo");
- glutDisplayFunc(display);
- glEnable(GL_DEPTH_TEST);
- glClearColor(0.0, 0.0, 0.0, 1.0);
- glutMainLoop();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement