Re: bitmap caching issue (was: settings to build for 10.5 on 10.6?)
Re: bitmap caching issue (was: settings to build for 10.5 on 10.6?)
- Subject: Re: bitmap caching issue (was: settings to build for 10.5 on 10.6?)
- From: Ken Ferry <email@hidden>
- Date: Sun, 20 Sep 2009 13:16:02 -0700
Hi Matt,
It sounds like the bug discussed in this passage from the AppKit release
notes <http://developer.apple.com/mac/library/releasenotes/Cocoa/AppKit.html>
is what's biting you:
NSBitmapImageRep notable bug fix: -[NSBitmapImageRep CGImage] safer now (New
since WWDC 2008)
In Leopard, -[NSBitmapImageRep CGImage] would under most circumstances
return a CGImage that was not retained by the bitmap rep, but which would
cause a crash if its data was accessed (e.g., by drawing it) after the
bitmap rep had been destroyed.
This is fixed in SnowLeopard.
There was an ownership problem. The NSBitmapImageRep owned a raw buffer of
data and the CGImage. The CGImage didn't retain the NSBitmapImageRep since
that would cause a retain cycle.
This problem is gone in 10.6.
-Ken
On Sun, Sep 20, 2009 at 12:58 PM, Matt Neuburg <email@hidden> wrote:
> Okey-dokey, I'm back with more information. I have finally tracked down the
> source of my Core Animation crash on 10.5 (the problem, you may recall, is
> that it's crashing on 10.5 but working just fine on 10.6). And it has
> nothing to do with my build settings after all.
>
> Here's the story. My animation is a transition based around setting a
> layer's contents. The crash, it turns out, has to do with how I'm acquiring
> the CGImages used to set the layer's contents. I'm acquiring them from a
> "screen shot" of a window (see my thread "adding a page curl transition").
> Like this (v is a window's content view, fglayer is the CALayer that does
> the animation):
>
> NSBitmapImageRep* b = [v bitmapImageRepForCachingDisplayInRect: [v
> visibleRect]];
> [v cacheDisplayInRect:[v visibleRect] toBitmapImageRep:b];
> fglayer.contents = (id)[b CGImage];
>
> If I set the contents of the layer that way on 10.6, everything is fine. If
> I do it on 10.5, I crash during the resulting animation. I am guessing that
> the reason has something to do with image / bitmap caching. On 10.5, the
> CGImage isn't really there, I'm guessing; it's as if the bitmap and the
> CGImage are places to draw to but they don't really have any separate
> existence. On 10.6, where the nature of window drawing has changed somehow,
> they do exist, and everything works.
>
> I can solve the problem - prevent the crash - on 10.5 by copying the bitmap
> off to a TIFFRepresentation and turning *that* into a CGImage. So from that
> point of view the problem is solved! But is there a better way? Is there
> some simpler (or "correct") way to make my CGImage real - to say "Draw
> here,
> draw now?" (I tried things like retaining or copying the CGImage and that
> didn't work.) m.
>
> >>On Sep 16, 2009, at 1:03 PM, Matt Neuburg wrote:
> >>
> >>> I've already set the SDK and Base to 10.5, and my app does launch
> >>> successfully (if I set it to 32 bit) on my Leopard MacBook, and all
> >>> of *my*
> >>> code runs okay (I'm not making any 10.6-only calls AFAIK), but as
> >>> soon as my
> >>> app tries to perform an animation (CoreAnimation), it crashes
> >>> (here's a
> >>> snippet from the crash log):
> >>>
> >>> Code Type: X86 (Native)
> >>> ...
> >>> Thread 0 Crashed:
> >>> 0 com.apple.CoreGraphics 0x9295ccf0
> >>> sseCGSConvertXXXX8888TransposePermute + 368
> >>> 1 com.apple.CoreGraphics 0x928d9526 argb32_image + 886
> >>> 2 libRIP.A.dylib 0x96031372 ripl_Mark + 38
> >>> 3 libRIP.A.dylib 0x96033977 ripl_BltImage + 1307
> >>> 4 libRIP.A.dylib 0x9601d549 ripc_RenderImage +
> >>> 273
> >>> 5 libRIP.A.dylib 0x9602de6a ripc_DrawImage + 5102
> >>> 6 com.apple.CoreGraphics 0x928cd17d CGContextDrawImage
> >>> + 397
> >>> 7 com.apple.QuartzCore 0x9425c85f
> >>> create_image_by_rendering +
> >>> 469
> >>> 8 com.apple.QuartzCore 0x9425c358
> >>> CARenderImageNewWithCGImage
> >>> + 928
> >>> 9 com.apple.QuartzCore 0x942842e0
> >>> CARenderPrepareCGImage + 25
> >>> 10 com.apple.QuartzCore 0x942842b5
> >>> CALayerPrepareCommit + 242
> >>> 11 com.apple.QuartzCore 0x94258543
> >>> CAContextCommitTransaction
> >>> + 187
> >>> 12 com.apple.QuartzCore 0x94258239 CATransactionCommit
> >>> + 229
> >>> ...
>
> --
> matt neuburg, phd = email@hidden, <http://www.tidbits.com/matt/>
> A fool + a tool + an autorelease pool = cool!
> AppleScript: the Definitive Guide - Second Edition!
> http://www.tidbits.com/matt/default.html#applescriptthings
>
>
>
> _______________________________________________
>
> Cocoa-dev mailing list (email@hidden)
>
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
>
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden