Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

edgeAntialiasingMask

タグ: Quartz Mac Objective-C

CALayerはデフォルトではレイヤ境界にアンチエイリアスを掛けるが、MacOS X 10.5で追加された edgeAntialiasingMask を使うとそのアンチエイリアスを解除できる。

@interface MyView : NSView
@end

@implementation MyView
- (void)awakeFromNib
{
    self.wantsLayer = YES;
    CALayer* superlayer = [CALayer layer];
    superlayer.anchorPoint = CGPointZero;
    [self.layer addSublayer:superlayer];
	for(int i = 0; i < 4; i++)
	{
		CGFloat x = 9 + i * 80.5;
		CGFloat y = (i % 2) ? 9.5f : 9.0f;
		for(int j = 0; j < 2; j++)
		{
			for(int k = 0; k < 4; k++)
			{
				CALayer* layer = [CALayer layer];
				layer.bounds = CGRectMake(0, 0, 30, 30);
				layer.anchorPoint = CGPointZero;
				layer.position = CGPointMake(x + (k % 2) * 30, y + j * 60 + (k / 2) * 30);
				if(j == 0)
				{
					layer.edgeAntialiasingMask = edgeAntialiasingMask;
				}
				
				CGColorRef color =
					i < 2
					? CGColorCreateGenericRGB((k == 0 ? 1 : 0), (k == 1 ? 1 : 0), (k == 2 ? 1 : 0), 1)
					: CGColorCreateGenericRGB(0, 0, 0, 1);
				layer.backgroundColor = color;
				CGColorRelease(color);
				
				[superlayer addSublayer:layer];
			}
		}
	}
}
@end
edgeAntialiasingMask.png

一番左には「四辺の座標が整数になっているレイヤ」を並べている。
下4レイヤはレイヤ境界のアンチエリアス無しで、上4レイヤはアンチエイリアス有り。
どちらも、見た目には違いがない。

左から2番目は「四辺の座標が整数になっていないレイヤ」を並べたもので、アンチエリアスの有無に関しては左と同じ。
こちらは上4レイヤの境界がぼやけ、アンチエリアスが掛かっているのが分かる。

右2つは、左2つの集合と同じ条件で「全てのレイヤの色を黒に」したもの。
こうすると、レイヤ境界のアンチエイリアスが重なりあっている部分に隙間が空いているように見える。
右から2番目の、四辺の座標を整数にしている集合には隙間が見えないので、「常に四辺を整数にしておけば隙間は空かない」ように思えるが、superlayerのpositionが浮動小数点数なら隙間は空くし、そうじゃなくてもアニメーション中は境界がちらつく。
edgeAntialiasingMask でアンチエイリアスを解除すると、このような「隙間なく並んでいるCALayerの間に隙間が描かれる現象」を防ぐことができる。

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/162-8f2bbdc4
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。