blitz-research / monkey

Blitz Research Monkey Source
225 stars 59 forks source link

Image.GetSurface() and Image.GetSurfaceRegion() #50

Open skn3 opened 10 years ago

skn3 commented 10 years ago

Added two methods to the monkey Image class so module developers can have more access to images. GetSurface() just returns the images surface object GetSurfaceRegion(frame:int=0) returns the x,y,width,height the image/frame takes up in the images surface.

These two are very useful methods and I have used for for stuff like saving images to photo gallery on iOS. For example I could convert a monkey image to UIImage with something like:

Local region := image.GetSurfaceRegion()
SaveNativeFunction(image.GetSurface(), region[0],region[1],region[2],region[3],"blah.png")
//allocate read in array
NSInteger dataLength = surfaceWidth * surfaceHeight * 4;
GLubyte *buffer = (GLubyte *) malloc(dataLength);

//remember old frame buffer
GLint oldFrameBuffer;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFrameBuffer);

//setup temp frame buffer
GLuint frameBuffer;
glGenFramebuffers(1, &frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, surface->texture, 0);

glViewport(surfaceX, surfaceY, surfaceWidth, surfaceHeight);
glReadPixels(surfaceX, surfaceY, surfaceWidth, surfaceHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

//restore frame buffer
glBindFramebuffer(GL_FRAMEBUFFER, oldFrameBuffer);

//make data provider with data.
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, dataLength, NULL);

//prep the ingredients
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * surfaceWidth;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaLast;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

//make the cgimage
CGImageRef imageRef = CGImageCreate(surfaceWidth, surfaceHeight, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);

//make the uiimage
UIImage *image = [UIImage imageWithCGImage:imageRef];

//free it
CGImageRelease(imageRef);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(provider);
free(buffer);