2011-01-20 17 views
8

Lo que quiero es tomar un rectángulo lleno y hacer un agujero con otra forma. Este es exactamente el tipo de cosa para la que está diseñado NSBezierPath. Agregue una ruta rectangular, luego agregue el subtrayecto que lo "perforará" y finalmente lo llenará. En mi caso, el subpaso es en realidad texto. No hay problema, funciona muy bien:¿Por qué los glifos Helvetica Neue Bold no se dibujarán como subrutas normales en NSBezierPath?

alt text

Excepto cuando se utiliza Helvetica Neue Negrita para mi fuente. Cuando uso eso, acabo con un rectángulo azul sólido sin ningún texto. Pero el subtrazado es de hecho el dibujo - de hecho, si reducir el tamaño del rectángulo relleno un poco, en realidad se puede ver algo de la trayectoria de texto:

alt text

me sale el mismo comportamiento con Helvetica Neue cursiva. Helvetica Neue Medium funciona bien, al igual que Helvetica Bold, Times New Roman Bold y Arial Bold.

He intentado usar tanto NSEvenOddWindingRule como NSNonZeroWindingRule. (EDITAR: Al parecer realmente no trato NSEvenOddWinding regla, porque eso resultan para trabajar después de todo)

Este es el código que estoy usando el método dentro de mi NSView subclase 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]; 

¿Qué está pasando aquí? ¿Por qué algunas fuentes se comportan de manera diferente a otras cuando se trata de agregar glifos a una ruta?

EDITAR: La solución es utilizar NSEvenOddWindingRule. Después de la creación de path añadir esta línea: la respuesta de

[path setWindingRule:NSEvenOddWindingRule]; 

Peter Hosey ofrece la explicación de por qué es.

+0

Me pregunto si Helvetica Neue es un tipo diferente de letra. –

Respuesta

4

Probablemente tenga que ver con las direcciones de las rutas en las fuentes. Una fuente puede usar rutas a la derecha; otro puede usar caminos a la izquierda.

Una forma más confiable de lograr el efecto que busca sería simplemente llenar el rectángulo y luego dibujar el texto con el modo de composición del contexto de gráficos establecido en NSCompositeSourceOut. Puede envolver el relleno y el dibujo de texto en una capa de transparencia usando Core Graphics si desea cortar el texto solo del relleno.

+0

Brillante, gracias. Esta solución funciona muy bien para mi caso de uso, incluso para Helvetica Neue Bold. Todavía estoy muy curioso de por qué esto realmente sucede. Incluso dentro de la misma fuente parece haber diferencias. Helvetica Neue y Helvetica Neue Bold exhiben este comportamiento confuso, pero Helvetica Neue Medium no. Espero que alguien realmente pueda explicar por qué sucede esto. He revisado todos los documentos de programación de texto y esperaba que NSGlyphGenerator brindara más información, pero no tuve suerte. –

+0

@Ben Dolman: El primer párrafo de mi respuesta explica la causa probable y por qué es específica de la fuente. –

+0

¿Entonces Helvetica Neue y Helvetica Neue Medium dibujan en diferentes direcciones? Sé muy poco sobre el dibujo de glifos, por lo que me parece extraño. Voodoo no me gusta. ¿Alguna idea sobre dónde existe documentación para este comportamiento, o incluso una descripción conceptual? Los documentos de programación de texto de Cocoa no parecen profundizar en la generación de glifos. –

Cuestiones relacionadas