ディスプレイのキャプチャ
ゲームやプレゼンテーションプログラムなどの臨場感のあるアプリケーションを作成する場合は、フルスクリーン描画を行いたいと思うでしょう。
一般的なアプローチは、使用したいディスプレイをキャプチャすることです。ディスプレイをキャプチャすると、ディスプレイを排他的に使用できます。他のアプリケーションやシステムサービスでは、ディスプレイの使用や構成の変更はできません。さらに、ディスプレイの変更について通知されないため、ウィンドウの位置を変更したり、Finder がデスクトップアイコンの位置を変更したりするのを防ぐことができます。
単一のディスプレイをキャプチャするには、関数 CGDisplayCapture を呼び出して下さい。一度にすべてのオンラインディスプレイをキャプチャするには、CGCaptureAllDisplays を呼び出します。デフォルトでは、キャプチャされたスクリーンは黒色で塗りつぶされます。関数 CGDisplayCaptureWithOptions または CGCaptureAllDisplaysWithOptions を使用してキャプチャする場合、この機能を無効にするオプションがあります。
ディスプレイをキャプチャした後、いくつかの描画オプションがあります。
- OpenGL アプリケーションを作成する場合、OpenGL フルスクリーン描画コンテキストを作成できます。詳細については、OpenGL Programming Guide for Mac を参照してください。
- Quartz 2D を使用してスクリーンに直接描画できます。CGDisplayGetDrawingContext 関数を使用して、ディスプレイ用のフル機能のグラフィックスコンテキストを取得します。グラフィックスコンテキストは、ディスプレイが解放されるか、またはその構成が変更されるまで有効です。コンテキストの原点はディスプレイの左下隅です。
- OS X v10.5 では、独自の描画エンジンを使用してスクリーンに直接描画することができます。 CGDisplayBaseAddress または CGDisplayAddressForPosition を呼び出して、描画するフレームバッファ内のアドレスを取得します。OS X v10.6 以降では、Quartz、OpenGL 又は他のグラフィックス技術を使用する必要があります。
キャプチャされたディスプレイの使用が終了したら、CGDisplayRelease または CGReleaseAllDisplays を呼び出して解放する必要があります。
リスト 1 は、メイン・ディスプレイをキャプチャし、Quartz 2D を使用してテキスト文字列を描画する方法を示しています。番号付きコード行の詳細な説明は、リストの後に示します。
リスト 1 メインディスプレイのキャプチャ
char *text = "Hello, World!"; CGDirectDisplayID display = kCGDirectMainDisplay; // 1 CGError err = CGDisplayCapture (display); // 2 if (err == kCGErrorSuccess) { CGContextRef ctx = CGDisplayGetDrawingContext (display); // 3 if (ctx != NULL) { CGContextSelectFont (ctx, "Times-Roman", 48, kCGEncodingMacRoman); CGContextSetTextDrawingMode (ctx, kCGTextFillStroke); CGContextSetRGBFillColor (ctx, 1, 1, 1, 0.75); CGContextSetRGBStrokeColor (ctx, 1, 1, 1, 0.75); CGContextShowTextAtPoint (ctx, 40, 40, text, strlen(text)); // 4 sleep (4); // 5 } CGDisplayRelease (display); // 6 }
コードの動作は以下のとおりです。
- メインディスプレイのディスプレイ ID を取得します。
- メインディスプレイをキャプチャし、色を黒に変更します。ディスプレイが別のアプリケーションによってキャプチャされた場合にのみエラーが返されます。
- キャプチャされたディスプレイに関連した Quartz グラフィックスコンテキストを取得します。
- テキスト文字列をスクリーンの左下隅に描画します。
- ユーザーがテキストを読むことができるように数秒間処理を中断します。
- キャプチャされたディスプレイを解放します。
前の章 次の章