Question

Donc, j'ai un CIImage que je suis d'essayer de dessiner une NSView's -drawRect la méthode.

C'est la ligne de code que j'appelle de dessiner l'image:

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

outputCoreImage, originalBounds, et [self bounds] sont tous nonnil, et, en effet, sont leurs valeurs attendues.Sur Lion (OS X 10.7), cela a bien fonctionné, cependant sur Mountain Lion (OS X 10.8) j'ai un message d' EXC_BAD_ACCESS sur cette ligne.Si je marche jusqu'à la pile, je trouve que la fonction interne d'appel que les pauses, c'est sur 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

J'ai des zombies, de la garde de malloc, et journal d'exceptions près, allumé, et aucun d'entre eux de retour de l'information utile.

D'Autres OpenGL Test:

J'ai ajouté ce morceau:

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

à l' -windowDidLoad méthode de mon NSWindowController.Il s'exécute sans problème.

J'ai ajouté ce morceau:

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

à l'autre NSView's -drawRect.J'ai reçu le même message d'erreur sur CGLGetPixelFormat.

Radar:

Les gens de plus en #macdev semblent croire que c'est dans un OS question, et je ne suis pas enclin à être en désaccord.J'ai déposé un radar (rdar://11980704) en expliquant le problème et lier de nouveau à cette question.

Solution de contournement:

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

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

Il semble comme le fait de forcer l'image à dessiner en utilisant le moteur de rendu logiciel "résout" le problème.C'est un peu flou et lent, mais il ne tombe pas en panne.

Était-ce utile?

La solution

Résolu dans 10.8.1

Les gens de plus en #macdev semblent croire que c'est dans un OS question, et je ne suis pas enclin à être en désaccord.J'ai déposé un radar (rdar://11980704) en expliquant le problème et lier de nouveau à cette question.

Autres conseils

Cela pourrait être la première fois que votre application appels en toute OpenGL routine qui est sans doute certains de la première exécution de l'initialisation ou de contrôles.

Pour une expérience, essayez d'ajouter un peu de code OpenGL plus tôt dans votre application et de voir si des collisions.Essayez de réfléchir à pourquoi appeler OpenGL pourrait provoquer un incident.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top