マルチスクリーンのバグ取り、次は全画面。
全画面キャプチャの時に画面の配置状況によってはカウントダウン時の点線の位置がおかしいとの指摘を受けた。キャプチャ自体は問題なく行えている。
点線がおかしい例
点線が上の方に固まって表示されている。
描画コードはこう。
- (void)drawRect:(NSRect)rect
{
[[NSColor clearColor] set];
NSRectFill(rect);
for (NSScreen* screen in [NSScreen screens]) {
NSRect frame = [screen frame];
frame.origin.y = 0.1;
frame.size.width -= 0.1;
frame.size.height -= 0.1;
[self drawSelectedBoxRect:frame Counter:_animation_counter];
}
}
このコードでは y値を 0に固定し、さらに座標系の違いをまったく考えていない。NSScreen#screens で取得したスクリーン座標系の値を、そのままカスタムビューのローカル座標系で使っている。これではマルチスクリーンで変な描画になるわけだ。単一スクリーンの場合は y値を0(コードでは0.1)にすることで無理矢理?ローカル座標系に合わせているため問題がでなかった。なお 0.1 で調整しているのは、ぴったりの数値にすると線が画面の外にはみ出してしまう為、少しだけ小さくなる様に設定している。
このコードを、スクリーン座標系からローカル座標系に変換するように書き直す。こんな感じ。
- (void)drawRect:(NSRect)rect
{
[[NSColor clearColor] set];
NSRectFill(rect);
for (NSScreen* screen in [NSScreen screens]) {
NSRect frame = [screen frame];
frame.origin = [[_capture_controller view] convertPoint:[[_capture_controller window] convertScreenToBase:frame.origin] fromView:nil];
frame.origin.y -= frame.size.height;
frame.size.width -= 0.1;
frame.origin.y += 0.1;
frame.size.height -= 0.1;
[self drawSelectedBoxRect:frame Counter:_animation_counter];
}
}
基本的には NSWindow#convertScreenToBase: などを使い座標系変換すれば良い。ただし以前書いたように原点の取り方が異なることからその調整が必要になる。コード中、frame.origin.y から frame.size.heightを差し引いているのがその調整。0.1調整は実際の描画を見ながら適当に調整した。
実際にマルチスクリーンで試したところ問題なく点線が描画できた。
- - - -
マルチスクリーンはまだ続く。やれやれ。