Pregunta

Así que tengo un CIImage que estoy tratando de dibujar en un NSView's -drawRect método.

Esta es la línea de código que me llame para dibujar la imagen:

[outputCoreImage drawInRect: [self bounds]
                   fromRect: originalBounds
                  operation: NSCompositeSourceOver
                   fraction: 1];

outputCoreImage, originalBounds, y [self bounds] son todos los no-nil, y, de hecho, son sus respectivos valores esperados.En Lion (OS X 10.7), este funcionaba bien, sin embargo en Mountain Lion (OS X 10.8) que voy a recibir una EXC_BAD_ACCESS en esta línea.Si estoy de pie arriba de la pila, me parece que el interior de la llamada a la función que se rompe es en CGLGetPixelFormat.

frame #0: 0x00007fff99c3b26d OpenGL`CGLGetPixelFormat + 27
frame #1: 0x00007fff8fa98978 CoreImage`-[CIOpenGLContextImpl createAccelContext] + 335
frame #2: 0x00007fff8fa98d30 CoreImage`-[CIOpenGLContextImpl updateContext] + 111
frame #3: 0x00007fff8fa9a865 CoreImage`-[CIOpenGLContextImpl _lockfeContext] + 25
frame #4: 0x00007fff8fa7e4ac CoreImage`-[CIContextImpl setObject:forKey:] + 120
frame #5: 0x00007fff8fa9881c CoreImage`-[CIOpenGLContextImpl setObject:forKey:] + 259
frame #6: 0x00007fff90db93e3 libCGXCoreImage.A.dylib`cgxcoreimage_instance_render + 1477
frame #7: 0x00007fff97074ac6 CoreGraphics`CGSCoreImageInstanceRender + 32
frame #8: 0x00007fff947c89cc libRIP.A.dylib`ripc_AcquireCoreImage + 1344
frame #9: 0x00007fff947b8a00 libRIP.A.dylib`ripc_DrawShading + 9680
frame #10: 0x00007fff96cb2b2b CoreGraphics`CGContextDrawShading + 51
frame #11: 0x00007fff8fa78237 CoreImage`-[CICGContextImpl render:] + 918
frame #12: 0x00007fff8fa7d76a CoreImage`-[CIContext drawImage:inRect:fromRect:] + 1855
frame #13: 0x00007fff9897b8f3 AppKit`-[CIImage(NSAppKitAdditions) drawInRect:fromRect:operation:fraction:] + 243

He zombies, guardia de malloc, y registro de excepciones todo activado, y ninguno de ellos devolver cualquier información útil.

Otros OpenGL Pruebas:

He añadido este fragmento:

CIImage *anImage  = [[CIImage alloc] init];
[[[self window] contentView] lockFocus];
{
    [anImage drawInRect: [[self window] frame]
               fromRect: [[self window] frame]
              operation: NSCompositeSourceOver
               fraction: 1];
}
[[[self window] contentView] unlockFocus];

a la -windowDidLoad método de mi NSWindowController.Se ejecuta sin problema.

He añadido este fragmento:

NSData *data = [NSData dataWithContentsOfURL: [NSURL URLWithString: @"http://cache.virtualtourist.com/14/684723-Red_Square_Moscow.jpg"]];

CIImage *anImage  = [[CIImage alloc] initWithData: data];
[self lockFocus];
{
    [anImage drawInRect: [self bounds]
               fromRect: [anImage extent]
              operation: NSCompositeSourceOver
               fraction: 1];
}
[self unlockFocus];

a otro NSView's -drawRect.He recibido el mismo error en CGLGetPixelFormat.

Radar:

La gente en #macdev parecen creer que este es un sistema operativo problema, y no estoy inclinado a estar en desacuerdo.He presentado un radar (rdar://11980704) explicando el problema y vincular de nuevo a esta pregunta.

Solución:

CGContextRef contextReference = [[NSGraphicsContext currentContext] graphicsPort];
CIContext *coreImageContext = [CIContext contextWithCGContext: contextReference
                                                      options: @{kCIContextUseSoftwareRenderer : @YES}];

[coreImageContext drawImage: outputCoreImage
                     inRect: [self bounds]
                   fromRect: originalBounds];

Parece forzar la imagen a dibujar usando el software renderer "resuelve" el problema.Es un poco borrosa y lento, pero no se cae.

¿Fue útil?

Solución

Resuelto en 10.8.1

La gente en #macdev parecen creer que este es un sistema operativo problema, y no estoy inclinado a estar en desacuerdo.He presentado un radar (rdar://11980704) explicando el problema y vincular de nuevo a esta pregunta.

Otros consejos

Esta podría ser la primera vez que la aplicación de las llamadas a OpenGL rutina de la que es, probablemente, haciendo que algunos de la primera ejecución de la inicialización o cheques.

Para un experimento, trate de añadir un poco de OpenGL código anterior en la aplicación y a ver si los choques.Trate de pensar acerca de por qué una llamada a OpenGL podría causar un accidente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top