ページ

2008年8月26日火曜日

マウスカーソルのキャプチャ (12)

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

マウスカーソルのキャプチャを入れるにあたってはキャプチャ処理のコントローラ CaptureController に手をいれてある。SimpleCapの中でこのコントローラの位置づけは次のようになっている。

メニュー選択(イベント発生)
   |(1)
   ↓
 AppController
   |(2)
   ↓
 CaptureContoller
   |(3)    ↑
   ↓     |(4)
 キャプチャ処理(WindowHandler, ScreenHandler, ...)



各Handlerはキャプチャ結果を CGImage へ落とした後、その保存は CaptureControllerへ任せる(4)。
マウスカーソル合成はこの (4)のタイミングで行うようにしてある。各Handlerはマウスカーソル合成に必要なキャプチャ画像とその座標だけを容易すれば良いことになる。マウスカーソルの有無も後でここを制御するだけで済む。

以下は (4)の処理の一部。
CaptureController.m
- (void)saveImage:(CGImageRef)cgimage withMouseCursorInRect:(NSRect)rect
{
if (cgimage) {
// composite with mouse cursor
#1# MouseCursor* cursor = [MouseCursor mouseCursor];
NSBitmapImageRep *bitmap_rep = [[[NSBitmapImageRep alloc] initWithCGImage:cgimage] autorelease];
CGImageRelease(cgimage);

if ([cursor isIntersectsRect:rect]) {
NSPoint p = [cursor pointForDrawing];
p.x -= rect.origin.x;
p.y -= rect.origin.y;

NSImage *image = [[[NSImage alloc] init] autorelease];
[image addRepresentation:bitmap_rep];

p.y = [image size].height - p.y;
[image lockFocus];
#2# [[cursor image] compositeToPoint:p operation:NSCompositeSourceOver];
[image unlockFocus];

// re-creation bitmap rep
bitmap_rep = [[[NSBitmapImageRep alloc] initWithData:[image TIFFRepresentation]] autorelease];
}
// save to file
#3# [_file_manager saveImage:bitmap_rep];
}
}


#1# まず MouseCursorのインスタンスを作成する
#2# 位置補正を行った後、キャプチャ画像とマウスカーソル画像を合成する
#3# 最後にその画像を(ファイル管理クラスによって)保存する