Many thanks, Aki, much appreciated.

> You can do:
> NSGraphicsContext *context = [NSGraphicsContext
> currentContext];
> [context saveGraphicsState];
> [yourCustomColor set];
> [super showPackedGlyphs:...];
> [context restoreGraphicsState];
> 

This works perfectly, thank you.

> There is no rendering primitive method like this for
> underlines.  You still need to use temporary attributes
> for that purpose.  I believe the temporary attribute
> approach is efficient enough for that kind of usage
> patterns.

Returning to the original question for the underlines, is the most efficient 
approach to override -temporaryAttributesAtIndex... and check for the underline 
+ custom attribute there and modify the returned dictionary, or to use 
-addTemporaryAttributes: on any changed text every time it is changed (e.g. in 
-textStorage:edited:range:changeInLength:invalidatedRange:)?

Thanks again!
Keith

> 
> Aki
> 
> On 2009/10/02, at 17:32, Keith Blount wrote:
> 
> > 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

Reply via email to