NSImage を NSView へ描画するコードを書いていて isFlipped/setFlipped: が Mac OS X v10.6 から Deprecated になっているのに気がついた。
Mac Dev Center: Deprecated NSImage Methods
なんてこった。便利なのでよく使っていたのだが。。
flipped な NSView に NSImage を drawAtPoint:fromRect:operation:fraction: などでそのまま描くと画像は上下反転して描かれる。
今までは -[NSImage setFlipped:YES] を呼んでおくと座標系が合って正しく描画されていた。
setFlipped: が使えないとなるとどうすれば良いのか。
リファレンスを眺めていると NSAffineTransform を使って座標系を変更する方法が示されていた。
Mac Dev Center: Cocoa Drawing Guide: Coordinate Systems and Transforms
紹介されいたコードはこう:
- (void)drawRect:(NSRect)rect
{
NSRect frameRect = [self bounds];
NSAffineTransform* xform = [NSAffineTransform transform];
[xform translateXBy:0.0 yBy:frameRect.size.height];
[xform scaleXBy:1.0 yBy:-1.0];
[xform concat];
// Draw flipped content.
}
なるほど。
試してみたところうまくいった。
setFlipped: を使っている過去のコードは書き換えた方が良さそうだ。
(追記)
v10.6 からは lockFocusFlipped: が用意された。
Mac Dev Center: NSImage Class Reference
座標変換するとかなりややこしいことになるのでこっちの方が良い。
ただ 10.5 と 10.6 両対応しようとすると lockFocusFlipped: と setFliiped: のどちらをつかうかを実行時に判断する必要がある。
(追記)
v10.6 から drawInRect:fromRect:operation:fraction:respectFlipped:hints: が用意された。
Mac Dev Center: NSImage Class Reference
これを使えば簡単に flip できる。
(Kenさんの情報より)