discuss-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Drawing strings on a line


From: David Chisnall
Subject: Re: Drawing strings on a line
Date: Wed, 3 Jun 2009 23:30:17 +0100


On 3 Jun 2009, at 19:19, Andreas Höschler wrote:

Hello all,

I am developing a mapping application where I need to draw labels in a view. Currently I am using (as a first approach)

              [_name drawAtPoint:labelPoint withAttributes:nil];

This works: However, it does not exactly has the desired effect, since the labels are always drawn horizontally. The labels are actually street names and the streets are drawn with NSBezierPath stroke. Ideally I would like the street label to be exactly drawn on the NSBezierPath which is a connected list of points, but at least to be drawn with the same angle as the NSBezierPath segment. There is this NSBezierPath

- (void)appendBezierPathWithGlyphs:(NSGlyph *)glyphs count: (int)count inFont:(NSFont *)fontObj

This is, without any doubts in my mind, the worst-named method in the whole of AppKit. It appends a set of gylphs, but they are drawn horizontally at the current point, not along the path. I've not tested it on GNUstep, but the easiest way of doing this on OS X is to do something like this:

void drawAtPointWithAngle(NSAttributedString *str, NSPoint p, CGFloat angle)
{
    NSAffineTransform * transform = [NSAffineTransform transform];
    [transform translateXBy: -p.x yBy: -p.y];
    [transform rotateByDegrees: angle];
    [NSGraphicsContext saveGraphicsState];
    [transform concat];
    [str drawAtPoint: NSMakePoint(0,0)];
    [NSGraphicsContext restoreGraphicsState];
}

Assuming I've not mixed up the transforms (it's late - I probably have), this will set a coordinate transform for a translated, rotated, system, draw the string horizontally at the origin in this space (i.e. translated and rotated) and then reset the context.

David

P.S. Prior to 10.5, this was really slow because the NSAttrubutedString method set up all of the text system objects and then destroyed them at the end. With 10.5, there is just one instance of the text system objects that is shared between all NSAttributedString instances, so this is very fast. If this isn't the case in GNUstep, it should be, because Cocoa programmers are likely to use this convenience method a lot more now that it's fast for them.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]