ページ

2009年3月5日木曜日

β版バグ修正 - マルチスクリーン

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

マルチスクリーン利用時にモニタの配置状況によっては範囲選択がうまく働かないとの報告をもらった。

例えば、サブ画面(メニューバーの無い方)が左に来ている場合。


サブ画面が右側にある場合は問題ない。同様にサブ画面が上にあるケースも問題が出る。
これに関連してスクリーン全体のキャプチャ時の点滅する点線の描画もおかしいようだ(キャプチャ自体は問題ない)。


何が起こっているか調査して整理してみよう。
まずは考慮すべき座標系について。SimpleCapでは次の3つを考える必要がある。

a. スクリーン座標系
b. SimpleCapのメインビューのローカル座標系
c. CGWindow系関数(キャプチャ関数)の座標系


それぞれは次のような独自の座標系を持っている。

a. スクリーン座標系
Cocoa(そしてQuartz)標準の座標系。左下が原点(0,0)となる。NSScreen で取得できる各種座標もこの座標系。


b. SimpleCapのメインビューのローカル座標系
filip(Y軸がスクリーン座標系と反転)させた座標系を使っている。左上が原点(0,0)になる。


c. CGWindow系関数(キャプチャ関数)の座標系
これも左上が原点(0,0)となる。



a,b,c共に異なる座標系を構成している。これらはスクリーンが一つの場合は特に支障をきたさないのだが、マルチスクリーンになると違いが出てくる。特に b.とc.は座標系は同じなのだがマルチスクリーンにした時の原点の取り方が異なっている。

これらを少し丁寧に調べてみよう。
検証にあたっては PowerBookG4(1280x854)とシネマディスプレイ(1600x1024)を使う。



スクリーンの位置関係は色々な組み合わせがあるが、整理しやすいようにX軸、Y軸方向で別々に考えてみる。

まずはY軸方向から。メインとサブ画面の上下関係は2種類ある。

(Y-1) サブ画面がメイン画面の上にあるケース


スクリーン座標系は、メイン画面の左下を原点として積み上げているのがわかる。一方、ローカル座標は2つのスクリーンを包含する矩形の左上を原点としている。最後の CGWindow系はメイン画面の左上を原点として、サブ画面は負の領域に配置されている。範囲選択では、ローカル座標をそのまま CGWindow系へ渡してキャプチャしている為、ここで座標系の不一致が起こり問題となっている。

(Y-2) サブ画面がメイン画面の下にあるケース

こちらはローカル座標とCGWindow系の座標系が一致しているのでキャプチャ自体は問題ない。ただしスクリーン系とは違っているので別の部分(ボタンの位置が変)に問題が出ている。


続いてX座標方向。Y軸方向と違ってFlipしていないのでこちらは原点の取り方だけが違う。

(X-1) サブ画面がメイン画面の左にあるケース

これもローカル座標系とCGWindow系で原点の取り方で違いが大きく出ている。

(X-2) サブ画面がメイン画面の右にあるケース

X軸だけ見ればこのケースはすべて同じに扱える。

- - - -
なるほど。マルチスクリーンになったとたん3つともてんでバラバラの座標系になっている。これは正常に動作しないわけだ。

さてどうするか。