MacOS の新しい画像ライブラリは Metal だが、2次元に限定されてしまうが、使いやすいのは Core Graphics だろう。
なのだが、情報が乏しいのなんのって。
iOS 系のサンプルや公式ドキュメントを参考に MacOS 向けの簡単なサンプルコードを書いてみた。
簡単な描画サンプル
- (void)drawRect:(CGRect)dirtyRect {
//[super drawRect:dirtyRect];//不要のようだ
NSGraphicsContext* nsgc = [NSGraphicsContext currentContext];
CGContextRef context = [nsgc CGContext];
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
double col[4],col2[4];
col[0] = 1.0;col[1] = 1.0;col[2] = 0.5;col[3] = 1.0;
col2[0] = 1.0;col2[1] = 0.0;col2[2] = 0.0;col2[3] = 0.8;
CGColorRef color = CGColorCreate(space,col);
CGColorRef color2 = CGColorCreate(space,col2);
//透明レイヤー開始
//CGContextBeginTransparencyLayer(context, nil);
//パスの描画を開始
CGContextBeginPath(context);
float startAngle = -M_PI/2;
float endAngle = startAngle + (M_PI * 2.0) * 0.5;
CGContextMoveToPoint(context, 100, 100);
CGContextAddArc(context, 100, 100, 50.0f, startAngle, endAngle, clockwise);
CGContextClosePath(context);
CGContextSetFillColorWithColor(context, color);
CGContextDrawPath(context, kCGPathFill);
CGContextBeginPath(context);
CGContextMoveToPoint(context, 0, 0);
//CGContextSetStrokeColor(context, col2);
CGContextSetLineWidth(context,2.0);
CGContextAddLineToPoint(context, 100, 100);
CGContextAddLineToPoint(context, 150, 50);
CGContextDrawPath(context, kCGPathStroke);
//透明レイヤー終了
//CGContextEndTransparencyLayer(context);
CGColorRelease(color);
}
Metal に比べると実に簡単。
点を打ってラインで繋ぎ・・・というふうに本当に直感的。
これでアイキャッチのような図形が描画できる。
なお、cocoa 系の Core Graphics の座標系は以下の通り。
clockwise は 1 と定義してます。
Core Graphics が Quartz???
ところで、Core Graphics は Quartz の枠組みを踏襲しているようだが、その実装は CPU レンダリング主体、少なくとも OpenGL 絡みは使っていないはずで、今後も安心して使えると思うのだが、そこらへん、曖昧に説明しているサイトがあったりして「は?」となっている。
追記:ソースコードはこちらの CoreGraphics 特集?に収載されてます。
Core Graphics + Metal
Core Graphics のお手軽さと Metal の速さを組み合わせて両方を活かして使いたいという欲求はあるようで、以下のような記事があった。
Combine the power of CoreGraphics and Metal by sharing resource memory
サンプルが動画になっている。
見事。