Pergunta

Então, eu tenho uma CIImage que eu estou tentando desenhar em um NSView's -drawRect o método.

Esta é a linha de código que eu chamo de desenhar a imagem:

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

outputCoreImage, originalBounds, e [self bounds] são todos não-nil, e , de fato, são seus respectivos valores esperados.No Lion (OS X 10.7), isso funcionou bem, no entanto no Mountain Lion (OS X 10.8) eu receber uma EXC_BAD_ACCESS sobre esta linha.Se eu caminhar até a pilha, eu acho que a função interna chamada que quebra é em 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

Eu tenho zumbis, guarda malloc, e fazer exceções ligados, e nenhum deles retornam informações úteis.

Outros Testes De OpenGL:

Eu adicionei este trecho:

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];

para o -windowDidLoad método de meu NSWindowController.Ele roda sem problema.

Eu adicionei este trecho:

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];

para outro NSView's -drawRect.Eu recebi o mesmo erro na CGLGetPixelFormat.

Radar:

A gente lá no #macdev parecem acreditar que esta é, em um SO problema, e eu não estou inclinado a discordar.Eu já apresentou um radar (rdar://11980704) explicando o problema e ligando de volta para esta pergunta.

Solução:

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

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

Parece como forçar a imagem para desenhar usando o software de composição de "resolve" o problema.É um pouco embaçada e lento, mas ele não falha.

Foi útil?

Solução

Resolvido em 10.8.1

A gente lá no #macdev parecem acreditar que esta é, em um SO problema, e eu não estou inclinado a discordar.Eu já apresentou um radar (rdar://11980704) explicando o problema e ligando de volta para esta pergunta.

Outras dicas

Este pode ser o primeiro tempo seu aplicativo de chamadas em qualquer OpenGL rotina que é, provavelmente, fazer algumas primeira-executar a inicialização ou cheques.

Para um experimento, tente adicionar um pouco de código de OpenGL anteriores no aplicativo e veja se que o número de acidentes também.Tente pensar sobre o porquê de chamar OpenGL pode causar um acidente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top