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: Andreas Höschler
Subject: Re: Drawing strings on a line
Date: Mon, 22 Jun 2009 23:36:51 +0200

Hi David,


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.

Thanks for your responses. Since neither core foundation (MacOSX) nor cairo can be used I did stick to the above approach. The method that actually works for me is

- (void)drawString:(NSString *)str atPoint:(NSPoint)point angle:(float)angle offset:(BOOL)offset
{
   static NSDictionary *_attr = nil;
if (!_attr) _attr = [[NSDictionary alloc] initWithObjectsAndKeys:LABELFONT, NSFontAttributeName, nil];
   NSSize size = [str sizeWithAttributes:_attr];
   NSAffineTransform * transform = [NSAffineTransform transform];
   [transform translateXBy: point.x yBy: point.y];
   [transform rotateByDegrees:angle];
[transform translateXBy: (offset ? - size.width / 2 : 0.0) yBy: - size.height / 2]; // <--
   [NSGraphicsContext saveGraphicsState];
   [transform concat];
   [str drawAtPoint:NSMakePoint(0,0) withAttributes:_attr];
   [NSGraphicsContext restoreGraphicsState];
}

Thanks a lot,

  Andreas





reply via email to

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