« 2009年11月 | メイン | 2010年03月 »

2010年01月 アーカイブ

2010年01月06日

NSImageに文字を描画するとさかさまになる?

今日も今日なでCocoaアプリを書いていたわけですが、
ドはまりしたことがあったのでここで書いておこうかと。

アプリケーションの描画の際に、
今までカスタムビュー上にそのまま描画していた部分を、
テキストやパスなどのベクタデータも含めて
半透明合成等のピクセル合成処理をかけないといけなくなったので、
一度NSBitmapRepresentaionをバックエンドに持たせたNSImageにデータを描画し、
一種のラスタライズを行ってからそのNSImageをカスタムビュー上に描画しなおすことにしました。

この方針でおおよそもくろみ通りうまくいっていたのですが、
テキストを描画していた部分をこの方法に置き換えてみたところ、
文字の天地が逆になってしまうという問題が発生してしまいました。

色々往生してみたところ、cocoa-devで同じようなハマりをしている人が見つかりました。
focusが当たっているビューの座標系が上下反転させた状態で、
NSImageにlockFocusでfocusを当てて画像上に文字を書くと、この症状が起きるようです。
Cocoaの仕様的にどうにもならないようでしたので、
NSImageにsetFlipped:YESを設定した状態で反転したビットマップを作り、
さらにそのあとにNSAffineTransformで上下反転マトクリクスを作成して
現在のグラフィクスコンテキストに結合し、
上下反転コピーを行ったビットマップをもう一個作ることで
なんとなく対処できました。

一応予定の見栄えにはなったのですが、
2回ビットマップができるので大変無駄臭いような気がします…。