Quartz ディスプレイサービスの概要
Quartz Display Services は、ユーザのコンピュータに接続されたディスプレイの配置やディスプレイモード、およびその他のディスプレイ関連の操作を動的に変更することをサポートする一連のシステムソフトウェア機能です。(この文書では、ディスプレイ という用語は、フレームバッファ、ガンマ補正表またはカラーパレット、場合によっては付属のモニタで構成されるグラフィックスハードウェアシステムを指します)。
たとえば、Mac アプリでは Quartz Display Services を使用して以下のことができます。
- ディスプレイモードの確認と変更
- 一度の操作で一連のディスプレイを構成
- 排他的使用のために 1 つ以上のディスプレイをキャプチャ
- フェード効果を実行
- ディスプレイミラーリングを有効にする
- ガンマ色補正表とカラーパレットを補正
- スクリーン更新操作の通知を受け取る
Quartz Display Services は低レベルの API です。モニターが切り離されたりディスプレイモードが変更されても、ウィンドウなどのユーザーインターフェース要素は自動的に再配置されません。代わりに、Quartz はディスプレイ状態の変更の通知メカニズムを提供します。Cocoa はこれらの状態変化を自動的に検出し、影響を受けるディスプレイ上のウィンドウのサイズ、位置、レイアウトを調整します。
OS X のシステム環境設定では、Quartz Display Services を使用して、[Display] 環境設定パネルでいくつかの操作を実行します。たとえば、[Display] ペインには、ディスプレイモードを別のディスプレイ解像度に切り替えるためのコントロールが含まれています。
2 台以上のモニタが接続されているシステムでは、図 1 に示した配置パネルには以下のようなコントロールがあります:
- 拡張デスクトップ上のディスプレイを再配置
- メニューバーをあるディスプレイから別のディスプレイに移動してメインディスプレイを変更
- ディスプレイミラーリングセットを作成
図 1
以下のいくつかの節では、Quartz Display Services API のいくつかの重要な機能とともに、ディスプレイの基本的な機能を紹介します。この文書の他の記事には、この API を使用して一般的な操作を実行する例が含まれています。
ディスプレイの状態
フレームバッファハードウェアがモニタに接続されていると、ディスプレイはオンラインであるとみなされます。フレームバッファにモニタが接続されていない場合、ディスプレイはオフラインとみなされます。
ディスプレイがオンラインの場合、ディスプレイはグローバルディスプレイ(デスクトップ)座標系にマッピングされます。ディスプレイの左上隅を原点と呼びます。ディスプレイの原点は常にグローバルディスプレイ(デスクトップ) 座標で指定されます。
原点が(0,0) のディスプレイは、メインディスプレイまたはプライマリディスプレイと呼ばれます。ディスプレイミラーリングのないシステムでは、メニューバーを備えたディスプレイが通常、メインディスプレイ です。ユーザは、メニューバーを[ディスプレイの環境設定] で別のディスプレイにドラッグすることによって、メインディスプレイを変更できます。
オンライン表示はアクティブ、ミラーリング、またはスリープ状態になる事ができます。これらの用語は以下のように定義されます。
- awake で描画可能なディスプレイは、アクティブです。
- 同じコンテンツが両方のディスプレイに同時に描画される場合、ディスプレイは別のディスプレイをミラーリングしています。ミラーリングしているディスプレイに描画することはできません。
- ディスプレイは、フレームバッファーと付属のモニターが省電力モードになっている時、スリープ状態になります。スリープ状態のディスプレイは、依然としてグローバルディスプレイ空間の一部と見なされますが、そこに描画することはできません。
ディスプレイ ID
モニタが接続され、ディスプレイがオンラインの場合、Quartz は CGDirectDisplayID 型の一意のディスプレイ ID を割り当てます。ディスプレイ ID はプロセス間で保持され、通常はマシンが再起動されるまで一定のままです。CGGetOnlineDisplayList 関数を使用して、システム内のすべてのオンラインのディスプレイに対応するディスプレイ ID の配列を取得できます。
通常、アクティブなディスプレイは描画に使用できるので、それにもっと関心があります。 CGGetActiveDisplayList 関数を使用して、システム内のすべてのアクティブなディスプレイに対応するディスプレイ ID の配列を取得できます。リストの最初のディスプレイは常にメインディスプレイです。メインディスプレイは、CGMainDisplayID 関数への呼び出しとして定義された定数 kCGDirectMainDisplay によっても表されます。
以下の関数は、ディスプレイ ID の配列も取得します。
- CGGetDisplaysWithPoint は、境界線に指定された点が含まれている、オンラインディスプレイのディスプレイ ID を取得します。
- CGGetDisplaysWithRect は、指定された長方形を境界に含むオンラインディスプレイ用のディスプレイ ID を取得します。
- CGGetDisplaysWithOpenGLDisplayMask は、OpenGL ディスプレイマスク内に設定されたビットに対応するオンラインディスプレイ用のディスプレイ ID を取得します。
ディスプレイモード(OS X v10.6 以降)
すべてのディスプレイにはサポートされている一連の操作モードがあります。ディスプレイモードは、解像度(ピクセル単位の幅と高さ)、ピクセルあたりのビット数、及びリフレッシュレートなどの標準プロパティと、スクリーンを満たすためのピクセルストレッチなどのオプションのプロパティのセットです。
各ディスプレイモードは、CGDisplayMode 不透明型のインスタンスで表されます。ディスプレイがサポートするモードを調べるには、ディスプレイモードの配列を返す CGDisplayCopyAllDisplayModes 関数を使用して下さい。オンラインディスプレイの現在のディスプレイモードを調べるには、CGDisplayCopyDisplayMode 関数を使用して下さい。これは、単一のディスプレイモードを返します。ディスプレイモードには、Quartz Display Services の CGDisplayMode 関数を使用して照会できる一連のプロパティが含まれています。ディスプレイモードの終了時には、ディスプレイモードを解放する責任があなたにはあります。
ディスプレイモードは読み取り専用です。解像度などの特定のディスプレイプロパティを変更したい場合は、適切なディスプレイモードを見つけてそれを使用してディスプレイモードを変更する必要があります。単一のディスプレイモードを変更するためのコンビニエンス関数である CGDisplaySetDisplayMode を使用できます。詳細については、ディスプレイモードの変更(OS X v10.6 以降) を参照してください。
ディスプレイモード(OS X v10.5)
すべてのディスプレイにはサポートされている一連の操作モードがあります。ディスプレイモードは、解像度(ピクセル単位の幅と高さ)、ピクセルあたりのビット数、及びリフレッシュレートなどの標準プロパティと、スクリーンを満たすためのピクセルストレッチなどのオプションのプロパティのセットです。
各ディスプレイモードは、ディスプレイモード辞書によって表されます。ディスプレイがサポートするモードを調べるには、モード辞書のリストを返す CGDisplayAvailableModes 関数(注: XCode 8.3 では Deprecated と書いてある。) を使用して下さい。オンラインディスプレイの現在のディスプレイモードを調べるには、CGDisplayCurrentMode 関数(注: XCode 8.3 では Deprecated と書いてある。) を使用して下さい。この関数は単一のモード辞書を返します。ディスプレイモードの辞書には、Core Foundation の CFDictionary 関数を使用して照会できる一連のキー値のペアが含まれています。
選択したプロパティのセットに最適なモードを見つけるには、CGDisplayBestModeForParameters 関数(注: XCode 8.3 では Deprecated と書いてある。) を使用して下さい。たとえば、解像度が 750 x 550 ピクセル、ピクセルあたり 24 ビットのディスプレイでサポートされているモードを要求した場合、この関数は 800 x 600 ピクセルとピクセルあたり 32 ビットの解像度でサポートされるモードを返すことがあります。
モード辞書は読み取り専用です。解像度などの特定のディスプレイプロパティを変更する場合は、適切なモード辞書を見つけてそれを使用してディスプレイモードを変更する必要があります。単一のディスプレイモードを変更するためのコンビニエンス関数である CGDisplaySwitchToMode (注: XCode 8.3 では Deprecated と書いてある。)を使用できます。詳細については、ディスプレイモードの変更(OS X v10.5) を参照してください。
ディスプレイの配置
複数のディスプレイを備えたシステムでは、あなたのアプリケーションはグローバルディスプレイ空間内のディスプレイの配置を制御できます。これは、各ディスプレイの原点を CGConfigureDisplayOrigin 関数で設定することで行われます。新しい原点は、要求された場所に可能な限り接近して配置され、重なったり、ディスプレイ間にギャップを残したりすることはありません。この関数を使用して、原点を (0,0) に設定することで、ディスプレイをメインディスプレイとして指定することもできます。この関数の使用の詳細については、処理(Transaction) を使用したディスプレイの構成 を参照してください。
あなたのアプリケーションが終了すると、ディスプレイの設定が[ディスプレイ] 環境設定の現在の設定に戻ります。
ディスプレイのミラーリング
複数のディスプレイを持つシステムでは、あなたのアプリケーションは同じコンテンツを 2 つ以上のディスプレイに同時に描画できます。これはミラーリングと呼ばれ、ディスプレイはミラーリングセットと呼ばれます。ミラーリングセットの構成を作成または変更するには、CGConfigureDisplayMirrorOfDisplay 関数を使用して下さい。1 つのディスプレイは、ミラーリングセット内のメインまたはプライマリディスプレイに指定され、すべての描画はこのディスプレイに向けられます。この関数の使用の詳細については、処理を使用したディスプレイの構成 を参照してください。
ディスプレイミラーリングとディスプレイマット生成は、デバイスドライバの裁量で、ハードウェア(推奨) またはソフトウェアのいずれかで実装されます。ハードウェアミラーリングでは、グラフィックスハードウェアは、1 つのフレーム・バッファの内容を 2 つ以上のディスプレイに同時にレンダリングします。ソフトウェアミラーリングでは、ミラーリングセット内の各ディスプレイのフレームバッファに同じ内容が描画されます。最も高い解像度および最も深いピクセル深度を有するディスプレイは、典型的にはメインディスプレイとなります。
Quartz では、すべてのウィンドウベースのコンテンツがミラーリングセットのすべてのディスプレイに配置されます。ウィンドウに描画するアプリケーションは、ミラーリングをサポートすることを心配する必要はありません。ディスプレイに直接描画するアプリケーションでは、ミラーリングを適切にサポートするために、従来のデバイスループを実装する必要があります。
前の章 次の章