KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I am using an NSView to host several Core Animation CALayer objects. What I want to be able to do is grab a snapshot of the view's current state as a bitmap image. This is relatively simple with a normal NSView using something like this: void ClearBitmapImageRep(NSBitmapImageRep* bitmap) { unsigned char* bitmapData = [bitmap bitmapData]; if (bitmapData != NULL) bzero(bitmapData, [bitmap bytesPerRow] * [bitmap pixelsHigh]); } @implementation NSView (Additions) - (NSBitmapImageRep*)bitmapImageRepInRect:(NSRect)rect { NSBitmapImageRep* imageRep = [self bitmapImageRepForCachingDisplayInRect:rect]; ClearBitmapImageRep(imageRep); [self cacheDisplayInRect:rect toBitmapImageRep:imageRep]; return imageRep; } @end However, when I use this code, the Core Animation layers are not rendered. I have investigated CARenderer , as it appears to do what I need, however I cannot get it to render my existing layer tree. I tried the following: NSOpenGLPixelFormatAttribute att[] = { NSOpenGLPFAWindow, NSOpenGLPFADoubleBuffer, NSOpenGLPFAColorSize, 24, NSOpenGLPFAAlphaSize, 8, NSOpenGLPFADepthSize, 24, NSOpenGLPFANoRecovery, NSOpenGLPFAAccelerated, 0 }; NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:att]; NSOpenGLView* openGLView = [[NSOpenGLView alloc] initWithFrame:[self frame] pixelFormat:pixelFormat]; NSOpenGLContext* oglctx = [openGLView openGLContext]; CARenderer* renderer = [CARenderer rendererWithCGLContext:[oglctx CGLContextObj] options:nil]; renderer.layer = myContentLayer; [renderer render]; NSBitmapImageRep* bitmap = [oglView bitmapImageRepInRect:[oglView bounds]]; However, when I do this I get an exception: CAContextInvalidLayer -- layer <CALayer: 0x1092ea0> is already attached to a context I'm guessing t
Tags (comma-separated)
Save Edits
Cancel