NSView の CGContextRef に ATSUI でテキストを描画する方法

NSView の CGContextRef に ATSUI でテキストを描画する方法

2007/01/15 2:00am

Cocoa の NSViewApple Type Services for Unicode Imaging (ATSUI) でテキストを描画する方法を紹介する。

ATSUI では描画に Quartz の CGContextRef を設定することができる。CGContextRefNSGraphicsContextgraphicsPort で取得できるので、以下のようなコードで設定できる。

**CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];**
ATSUAttributeTag tags[] = { kATSUCGContextTag };
ByteCount sizes[] = { sizeof(CGContextRef) };
ATSUAttributeValuePtr values[] = { **&context** };
ATSUSetLayoutControls(layout, 1, tags, sizes, values);

以下のコードでは、NSViewdrawRect: で Hello, World を描画している。

- (void) drawRect : (NSRect) rect
{
  NSString *s = @"Hello, World!";
  UniChar *text;
  UniCharCount length;
  ATSUStyle style;
  ATSUTextLayout layout;

  // Setup
  ATSUCreateStyle(&style);
  ATSUCreateTextLayout(&layout);

  length = [s length];
  text = (UniChar *)malloc(length * sizeof(UniChar));
  [s getCharacters:text];

  ATSUSetTextPointerLocation(
    layout,
    text,
    kATSUFromTextBeginning,
    kATSUToTextEnd,
    length);
  ATSUSetRunStyle(
    layout,
    style,
    kATSUFromTextBeginning,
    kATSUToTextEnd
  );

  // CGContext
  CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
  ATSUAttributeTag tags[] = { kATSUCGContextTag };
  ByteCount sizes[] = { sizeof(CGContextRef) };
  ATSUAttributeValuePtr values[] = { &context };
  ATSUSetLayoutControls(layout, 1, tags, sizes, values);

  // Drawing
  ATSUDrawText(
    layout,
    kATSUFromTextBeginning,
    kATSUToTextEnd,
    X2Fix(10.0f),
    X2Fix(10.0f));

  free(text);
  ATSUDisposeStyle(style);
  ATSUDisposeTextLayout(layout);
}