Hi Aki, Many thanks for your reply, much appreciated. Would you mind giving me a little more information on how to override this method? The docs are a little sparse in this regard. For instance, if I try passing a different colour into super's method, it has no effect; instead, it seems that I need to use [color set] before calling super (which would seem to be hinted at by the docs, as they say "if for any reason you modify the set color or font..."). Do I call [customColor set] using my own colour, then call super, then call [color set] using the passed-in colour after calling super?
My custom attributes set only the colour, so this should be fine. (Although I'm not sure how I would use this method if I wanted, say, the underline to be a different colour from the text, which I need for certain link attributes.) Many thanks again and all the best, Keith --- On Fri, 10/2/09, Aki Inoue <a...@apple.com> wrote: > From: Aki Inoue <a...@apple.com> > Subject: Re: NSLayoutManager and best override point for temporary attributes > To: "Keith Blount" <keithblo...@yahoo.com> > Cc: "Martin Wierschin" <mar...@nisus.com>, cocoa-dev@lists.apple.com > Date: Friday, October 2, 2009, 10:24 PM > Keith, > > If your custom attributes modifies just the graphics state > (don't affect the layout), you can override > -[NSLayoutManager > showPackedGlyphs:length:glyphRange:atPoint:font:color:printingAdjustment:]. > > The method is the bottleneck for calling CG APIs. You > can query the text attribute using glyphRange.location and > see if there is one of your custom attributes. > > You should be able to customize alpha, color, blending > mode, compositing mode, clipping, etc. > > Aki > > On 2009/10/02, at 7:04, Keith Blount wrote: > > > Hi, > > > > Looking at this again, would NSLayoutManager's > > > > > -textStorage:edited:range:changeInLength:invalidatedRange: > > > > method be a good candidate for overriding to add > temporary attributes? The text storage calls this whenever > it's edited and provides it with the new range of > characters. So it seems that I could add any temporary > attributes to the range that gets passed in here, checking > that changeInLength > 0. > > > > Or, what if in the -addAttribute:..., > -setAttributes:... and removeAttribute:... methods of my > NSTextStorage, I called through to all of the text storage's > layout managers to ask them to add the temporary attribute > if necessary, after -edited:range:changeInLength: gets > called? > > > > Many thanks again! > > > > All the best, > > Keith > > > > --- On Thu, 10/1/09, Martin Wierschin <mar...@nisus.com> > wrote: > > > >> From: Martin Wierschin <mar...@nisus.com> > >> Subject: Re: NSLayoutManager and best override > point for temporary attributes > >> To: "Keith Blount" <keithblo...@yahoo.com> > >> Cc: cocoa-dev@lists.apple.com > >> Date: Thursday, October 1, 2009, 1:50 AM > >> Hi Keith, > >> > >>> I have certain custom text attributes that are > used in > >> my NSTextStorage to which I would like to add > temporary > >> attributes via the NSLayoutManager. > >> > >> What version of OSX are you testing under? Under > Leopard > >> there's a bug in -[NSLayoutManager > >> > temporaryAttribute:atCharacterIndex:longestEffectiveRange:inRange:] > >> that calculates effective ranges that are too > short. For > >> specific test cases this caused big inefficiencies > in the > >> text system. I believe this bug is fixed in Snow > Leopard. > >> > >>> more recently I have taken to overriding > >> NSLayoutManager's > >> > -temporaryAttributesAtCharacterIndex:effectiveRange: > >> > >> If this is too slow, then I'd look to using some > kind of > >> cache for your calculations. But really, > NSLayoutManager's > >> temporary attributes are already a cache; one > likely to be > >> specifically designed for high performance > index/run access. > >> I think your original idea of setting temporary > attributes > >> whenever text changes would be the most > efficient. > >> > >> Perhaps you're recalculating too much, too often? > I don't > >> know the access patterns for temporary attributes, > but I > >> would guess they are only queried when associated > text is > >> displayed on screen. If that's the case, you could > fix them > >> up lazily, eg: whenever text changes just note > down that the > >> attributes are dirty in that range. Your temporary > attribute > >> methods in your NSLayoutManager subclass can then > ensure > >> that temporary attributes are not dirty before > they are > >> returned. > >> > >> If none of that is efficient enough, you could rig > up a > >> NSTextStorage subclass that has two sets of > attributes: one > >> set for private use and another derived set which > only the > >> layout system sees. > >> > >> Hopefully some of that helps, > >> > >> ~Martin > >> > >> > > > > > > > > _______________________________________________ > > > > Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) > > > > 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: > > http://lists.apple.com/mailman/options/cocoa-dev/aki%40apple.com > > > > This email sent to a...@apple.com > > _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) 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: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com