Warum werden Helvetica Neue Fettglyphen nicht als normaler Unterpfad in NSBezierPath gezeichnet?

8

Ich möchte ein gefülltes Rechteck nehmen und ein Loch in eine andere Form stanzen. Genau dafür ist NSBezierPath gedacht. Sie fügen einen rechteckigen Pfad hinzu und fügen dann den Unterpfad hinzu, der ihn durchstoßen und schließlich ausfüllen wird. In meinem Fall ist der Unterpfad tatsächlich Text. Kein Problem, funktioniert super:

Außer wenn ich Helvetica Neue Bold für meine Schriftart verwende. Wenn ich das benutze, habe ich nur ein blaues Rechteck ohne Text. Aber der Unterpfad zeichnet tatsächlich - in der Tat, wenn ich das gefüllte Rechteck etwas verkleinere, können Sie tatsächlich einen Teil des Textpfads sehen:

Ich bekomme das gleiche Verhalten mit Helvetica Neue Italic. Helvetica Neue Medium funktioniert ebenso gut wie Helvetica Bold, Times New Roman Bold und Arial Bold.

Ich habe versucht, NSEvenOddWindingRule und NSNonZeroWindingRule zu verwenden. ( BEARBEITEN : Anscheinend habe ich NSEvenOddWinding rule nicht wirklich probiert, weil das schließlich funktioniert)

Dies ist der Code, den ich in der drawRect Methode meiner NSView Unterklasse verwende.

%Vor%

Also, was ist hier los? Warum verhalten sich einige Schriftarten anders als andere, wenn es darum geht, einem Pfad Glyphen hinzuzufügen?

BEARBEITEN : Die Lösung besteht darin, NSEvenOddWindingRule zu verwenden. Fügen Sie nach der Erstellung von path diese Zeile hinzu:

%Vor%

Peter Hoseys Antwort liefert die Erklärung, warum das so ist.

    
Ben Dolman 20.01.2011, 01:55
quelle

1 Antwort

4

Es hat wahrscheinlich mit den Richtungen der Pfade in den Fonts zu tun. Eine Schriftart kann im Uhrzeigersinn Pfade verwenden; ein anderer kann Pfade gegen den Uhrzeigersinn verwenden.

Ein zuverlässigerer Weg, um den gewünschten Effekt zu erzielen, wäre, das Rechteck einfach zu füllen und dann den Text mit dem Compositing-Modus des Grafikkontexts auf NSCompositeSourceOut zu zeichnen. Sie können die Füll- und Textzeichnung in einer Transparenzebene mithilfe von Core Graphics umschließen, wenn Sie den Text nur aus der Füllung herausschneiden möchten.

    
Peter Hosey 20.01.2011, 16:12
quelle