2011-01-20 12 views
8

私がしたいのは、塗りつぶし矩形を取り、別の形を使ってそれに穴を開けることです。これはちょうどNSBezierPathが設計されている種類のものです。長方形のパスを追加し、そのパスを「パンチ」して最後にそれを塗りつぶすサブパスを追加します。私の場合、サブパスは実際にテキストです。いいえ問題は、素晴らしい作品なかっ:Helvetica Neue BoldグリフがNSBezierPathの通常のサブパスとして描画されないのはなぜですか?

alt text

私は私のフォントの太字ヘルベチカノイエを使用する場合を除き。私がそれを使うと、テキストなしの実線の青い矩形で終わるだけです。

alt text

私はヘルベチカノイエ斜体で同じ動作を得る:私は少し満たされた長方形を縮小した場合、あなたは実際にはテキストパスの一部を見ることができ、実際には - しかし、サブパスは確かに描画されます。 Helvetica Bold、Times New Roman Bold、Arial Boldなど、Helvetica Neue Mediumはうまく動作します。

私はNSEvenOddWindingRuleNSNonZeroWindingRuleの両方を使ってみました。 (EDIT:どうやら私は本当にそれがすべての後に動作が判明しないため、NSEvenOddWindingルールをしようとしなかった)これは私が私のNSViewサブクラスのdrawRectメソッド内で使用しているコードです

NSLayoutManager *layoutManger = [[[NSLayoutManager alloc] init] autorelease]; 
NSTextContainer *textContainer = [[[NSTextContainer alloc] 
     initWithContainerSize:NSMakeSize(300, 100)] autorelease]; 

NSFont *font = [NSFont fontWithName:@"Helvetica Neue Bold" size:100]; 

NSDictionary *textAttribs = [NSDictionary dictionaryWithObjectsAndKeys: 
         font, NSFontAttributeName, nil]; 

NSTextStorage *textStorage = [[[NSTextStorage alloc] initWithString:@"Hello" 
             attributes:textAttribs] autorelease]; 

[layoutManger addTextContainer:textContainer]; 
[layoutManger setTextStorage:textStorage]; 

NSRange glyphRange = [layoutManger glyphRangeForTextContainer:textContainer]; 

NSGlyph glyphArray[glyphRange.length]; 

NSUInteger glyphCount = [layoutManger getGlyphs:glyphArray range:glyphRange]; 

NSBezierPath *path = [NSBezierPath bezierPathWithRect:NSMakeRect(0, 0, 200, 100)]; 
[path appendBezierPathWithGlyphs:glyphArray count:glyphCount inFont:font]; 

[[NSColor blueColor] setFill]; 

[path fill]; 

ここでは何が起こっているのですか?グリフをパスに追加する際に、一部のフォントが他と動作が異なるのはなぜですか?

EDIT:解決策は、NSEvenOddWindingRuleです。 pathの作成後に次の行を追加します。

[path setWindingRule:NSEvenOddWindingRule]; 

ピーターHoseyの答えはこれが理由の説明を提供します。

+0

Helvetica Neueが別の種類のフォントであるのかなと思います。 –

答えて

4

おそらくフォント内のパスの方向と関係があるでしょう。 1つのフォントが時計回りのパスを使用することがあります。もう1つは反時計回りのパスを使用する場合があります。

より効果的に効果を得るには、矩形を塗りつぶして、グラフィックスコンテキストの合成モードをNSCompositeSourceOutに設定してテキストを描画します。塗りつぶしのテキストのみを切り抜きたい場合は、コアグラフィックスを使用して塗りつぶしとテキスト描画を透明レイヤーにラップすることができます。

+0

賢い、ありがとう。このソリューションは、Helvetica Neue Boldの場合でも、私の使用例ではうまく機能します。私はまだこれがなぜ実際に起こるかに関して非常に興味があります。同じフォント内であっても、違いがあるようです。 Helvetica NeueとHelvetica Neue Boldの両方がこの混乱した行動を示しますが、Helvetica Neue Mediumはそうではありません。私は、誰かがなぜこれが起こっているのかを実際に説明できることを望んでいます。私はすべてのテキストプログラミングドキュメントを読んで、NSGlyphGeneratorがさらに詳しい情報を提供することを期待していましたが、運はありません。 –

+0

@Ben Dolman:私の答えの最初の段落は、考えられる原因とそれがフォント固有の理由を説明しています。 –

+0

Helvetica NeueとHelvetica Neue Mediumは異なる方向を描いていますか?グリフの描画についてはほとんど分かりませんので、私にとっては奇妙に思えます。ブードゥーは私の好きではない。この振る舞いのドキュメンテーションがどこにあるのか、あるいは概念の概要さえあれば、どんなアイデアが存在しますか? Cocoaのテキストプログラミングのドキュメントは、これをグリフの生成に深く反映させていないようです。 –

関連する問題