Thanks for looking at this David,

The "selection" isn't really there in my application; I added this later to the 
screen shots to show more clearly what was going on.  For those reading along 
who don't want to download the screen shot, here's what's happening:

I print the string "abcabcabcabcabc" 25 times, each time with an extra period 
appended, like so:

abcabcabcabcabc
abcabcabcabcabc.
abcabcabcabcabc..
abcabcabcabcabc...
etc.

The effect I'm seeing is that the "abcabcabcabcabc" part of the string doesn't 
have the same width when I draw the text via an intermediate CGLayer.  The 
"abcabcabcabcabc" in the last line is a few pixels "tighter" than in the first 
line (and it's a gradual effect).

I can understand that text rendering is (subtly) different depending on the 
context I'm drawing to, so I could understand that the "direct" version has 
different (sub-pixel) anti-aliasing and even (as a consequence) different 
spacing.  (By the way, given your explanation I would expect the spacing 
differences in the "direct" version and not in the CGLayer version.)  However, 
the point is that the spacing is inconsistent _within_ the same context.  It 
sounds nit-picky, but in my "real" app the text is editable, and it is very 
noticeable that while typing, the characters to the left of the cursor "jitter 
around".

I tried setting CGContextShouldAntialias and CGContextShouldSmoothFonts to NO 
(in all permutations) and the effect is still there.

In case it matters, I am seeing the exact same behavior on an Intel MBP with 
10.6 and on a PPC iBook G4 with 10.5.

Thanks,
Sander

On Feb 5, 2010, at 9:06 PM, David Duncan wrote:

> On Feb 5, 2010, at 7:46 AM, Sander Stoks wrote:
> 
>> I want to draw rotated text, and I found out that the regular Cocoa Text 
>> drawing in that case looks surprisingly bad.  I posted about this before, 
>> and got the suggestion of drawing to an offscreen bitmap instead, and 
>> rotating that.  That works, but when I'm editing the text I see the text 
>> which is already there "jitter" on screen.  I pruned this down to a minimal 
>> project which shows the problem.  This can be downloaded at 
>> http://www.stoks.nl/TextTest.zip - it only contains a single NSView subclass 
>> which has selectable code paths (via an #if 0) for either drawing directly 
>> using NSLayoutManager's drawGlyphsForGlyphRange.  This looks fine (as long 
>> as it's not rotated).  The other path uses a CGLayer, sets the current 
>> NSGraphicsContext so it points to this layer, use drawGlyphsForGlyphRange 
>> again, and finally CGContextDrawLayerAtPoint to display the resulting text.
>> 
>> As you can see in http://www.stoks.nl/TextCompared.png, the text drawn via 
>> the intermediate CGLayer "shrinks" its intra-glyph-spacing as the string 
>> gets longer.
> 
> 
> Its hard to tell because your text is selected in your screen shot, but I 
> would guess that this has to do with subpixel antialiasing. By default your 
> text will be drawn without a background. When you draw directly into the 
> NSView however, there is an established background, that of the window, and 
> so the text can be blended into it with subpixel antialiasing. When you draw 
> to the CGLayer however, there is no such background, so the text is drawn 
> without.
> 
> This typically manifests as the text not appearing as if it has the right 
> weight (appears thin or not bold enough), although it is harder to tell in 
> your case due to the selection area. If you see colored highlights when you 
> zoom in on the image in one but not the other, then it is the issue I'm 
> describing.
> --
> David Duncan
> Apple DTS Animation and Printing
> 
> 

_______________________________________________

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