NSView の CGContextRef に ATSUI でテキストを描画する方法
Cocoa の NSView
に Apple Type Services for Unicode Imaging (ATSUI) でテキストを描画する方法を紹介する。
ATSUI では描画に Quartz の CGContextRef
を設定することができる。CGContextRef
は NSGraphicsContext
の graphicsPort
で取得できるので、以下のようなコードで設定できる。
**CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];**
ATSUAttributeTag tags[] = { kATSUCGContextTag };
ByteCount sizes[] = { sizeof(CGContextRef) };
ATSUAttributeValuePtr values[] = { **&context** };
ATSUSetLayoutControls(layout, 1, tags, sizes, values);
以下のコードでは、NSView
の drawRect:
で 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);
}