Почему глифы Helvetica Neue Bold не отображаются как обычный подпуть в NSBezierPath? - PullRequest
9 голосов
/ 20 января 2011

Я хочу взять заполненный прямоугольник и пробить в нем отверстие, используя другую форму.Это именно то, для чего предназначена NSBezierPath.Вы добавляете прямоугольный путь, затем добавляете подпуть, который будет «пробивать» его и, наконец, заполнять.В моем случае подпуть на самом деле текстовый.Нет проблем, отлично работает:

alt text

За исключением случаев, когда я использую Helvetica Neue Bold для своего шрифта.Когда я использую это, я просто получаю сплошной синий прямоугольник без текста вообще.Но подпуть действительно рисует - на самом деле, если я немного уменьшу закрашенный прямоугольник, вы можете увидеть часть текстового пути:с Helvetica Neue Italic.Helvetica Neue Medium отлично работает, как и Helvetica Bold, Times New Roman Bold и Arial Bold.

Я пытался использовать NSEvenOddWindingRule и NSNonZeroWindingRule.( РЕДАКТИРОВАТЬ : По-видимому, я действительно не пробовал правило NSEvenOddWinding, потому что оно, в конце концов, работает* метод моего NSView подкласса.

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];

Ответ Питера Хоси дает объяснение, почему это так.

1 Ответ

4 голосов
/ 20 января 2011

Вероятно, это связано с указанием путей в шрифтах. Один шрифт может использовать пути по часовой стрелке; другой может использовать пути против часовой стрелки.

Более надежный способ добиться желаемого эффекта - просто заполнить прямоугольник, а затем вывести из него текст с режимом композиции графического контекста, установленным на NSCompositeSourceOut. Вы можете обернуть заливку и отрисовку текста в слое прозрачности, используя Core Graphics, если вы хотите вырезать текст только из заливки.

...