Graphics Device Interface
graphics device interface(graphical device interface とも呼ばれる、GDI)は、カーネル及びユーザー(ウィンドウマネージャ)と協調するMicrosoft Windowsの3つの主要コンポーネント(サブシステム)の1つ。
GDIはグラフィカルオブジェクトの表示と、ディスプレイやプリンターのような出力デバイスへの転送のためのWindowsの規格である。
GDI
GDIは直線や曲線の描画、フォントのレンダリング、パレットの制御といった処理を担当する。ウィンドウやメニューなどのような上位レベルの描画については直接関わらず、より上位のuser32.dllにあるユーザーサブシステムに任される。 GDIはハードウェアに直接アクセスするドライバよりも上位に位置し、デバイスの機能的な調整と抽象化がGDIの役目である。GDIを使うことにより、画面やプリンターなどの多様なデバイスに容易に描画でき、そして各デバイスで適切な表示結果を望める。この機能はWindowsの全てのWYSIWYGアプリケーションの要である。
フリーセルやマインスイーパのような高速なグラフィックの描画を要求しないシンプルなゲームはGDIを使う。しかし、GDIはアニメーションをうまく表示できず(フレームバッファを同期する概念がない)、3Dのラスタライゼーション機能がないこともあり、最新のゲームではハードウェアの機能をより活用できるDirectXまたはOpenGLが使われる。
Windows Vistaでは、GDIアプリケーションは新しい描画エンジンであるDesktop Window Managerのもとで動作し、ハードウェアアクセラレーションは用いられない。
GDIプリンター
GDIプリンター(WinmodemのようにWinprintersとしても知られている)、特にGDIレーザープリンターは、本来プリンターが行う処理の一部をホストコンピュータ(パソコン)側で代行する。ホストコンピュータでビットマップイメージをレンダリングし、プリンターにビットマップを転送する。この方式には以下の2つの利点がある。
また以下の点で不利である。
- ホストコンピュータの負荷が高くなる。最近のPCでは問題ないが、古いPCで複雑なドキュメントを印刷する場合は非常に遅くなる場合がある。
- GDIプリンタは通常、プリンターのファームウェアに標準的な印刷機能のエミュレーションを含まない(またはそれを処理できる能力を持たない)。ハイエンドのPCLプリンターやPostScriptプリンターでは、ソフトウェアの互換性やドライバのバグなどの問題があった場合にドライバを更新して対応できるが、GDIプリンターでは対応策がない場合がある。
- GDIプリンターは一般的にWindowsに限り動作する。例外はあるが、他のオペレーティングシステムでは原則的にGDIプリンターを使用できない。
最新のインクジェットプリンターの機種はGDIベース(レーザープリンターではコストが主要因であるのに対し、ここでは主にパフォーマンスの理由)であるが、より柔軟な傾向がある。多くがMacintoshをサポートし、LinuxのコミュニティではLinux版ドライバのサポートをかなり改善した。一部(特にセイコーエプソン)ではより伝統的なエミュレーションを予備として提供することが多い。
一般的には安価なレーザープリンターはGDIデバイスであるが、多くのメーカーではPCLやPostScript、あるいはその両方の機能を持つモデルも製造している。GDIのみをサポートするプリンターはどのメーカーにおいても最も安価なモデルとして位置づけられる。
詳細
デバイスコンテキスト
デバイスコンテキストは、描画する対象を抽象化した存在である。画面またはプリンターへ出力するテキスト及びイメージの属性を定義するために使われ、関連付けられたグラフィックスオブジェクトとそれに関連する属性の集合からなる。実際のコンテキストはGDIによって管理される。構造体へのハンドルであるデバイスコンテキストは出力を行う前に取得し、要素が書き込まれた後に解放する。大抵のGDIオブジェクトのように、デバイスコンテキストは直接データにアクセスできないという意味で隠蔽されているが、それを制御し、何かを描画し、情報を取得し、オブジェクトを変更するといったような様々なGDI関数にデバイスコンテキストを渡すことができる。
デバイスコンテキストには次の種類がある。
- 画面
- プリンター
- メモリ
- 情報(インフォメーションコンテキスト)
このうち、情報は描画に用いることはできない情報取得専用のデバイスコンテキストである。
グラフィックスオブジェクト
デバイスコンテキストに関連付けが可能なグラフィックスオブジェクトには次の種類がある。これらは、SelectObject関数によってデバイスコンテキストに関連付けさせることが可能である。
- ビットマップ
- ブラシ
- パレット
- フォント
- パス
- ペン
- リージョン
GDI+
GDI+は、Windows XPで新しく登場したグラフィックサブシステムである。Windows XP以降、標準搭載されているほか、Windows 98/NT 4.0 SP6以降で使用可能である[1][2]。GDI+は「次世代」の2Dグラフィック環境であり、アルファブレンド、グラデーション、アンチエイリアス、より複雑なラインパス管理、(GDIで特に欠けていた)JPEGやPNGのような最新の画像ファイルフォーマットの根本的なサポート、2Dビューのパイプライン上のアフィン変換の合成に対する統合的なサポートといった先進的な機能を追加している。これらの機能はWindows XPのユーザインタフェースの様々な箇所に使われており、基本的なグラフィックレイヤのこうした表現は、FlashやSVGといったベクターグラフィックシステムの実装を大きく単純化する。
基本的にはネイティブC++用のライブラリ(DLL)のみが提供される形となっているが、.NET Frameworkの基本クラスライブラリでは System.Drawing
の名前空間にGDI+のマネージインタフェースが用意されており、標準的に使用されている。
なお、Vistaで1.1にバージョンが上がった。
Direct2D
Windows Vista以降のWindows OS上では、ハードウェアによるGDIアクセラレーションが実行されない(BitBltを除く)。また、GDI+では飛躍的に表現力や描画品質が向上しているが、内部で使用されているAPIはレガシーなGDIそのものであったりソフトウェア実装であったりするため、描画速度は当然犠牲になる。これらを補完する形で登場したのがDirect2DおよびDirectWriteである。Direct2D/DirectWriteは、GDI+の先進的な機能をDirect3D 10.1上に構築したCOMベースの高レベルAPIで、GDI/GDI+で問題となっていた描画速度性能を、Direct3Dによるハードウェア アクセラレーションを活用することで大幅に改善することが可能となる。ただし現在のDirect2D 1.0では、印刷機能(プリンターデバイスへの出力機能)を直接サポートしないため、印刷時にはGDI/GDI+、あるいはXPSドキュメントAPI(XPSの作成やそれを用いての印刷などをサポートするAPI)を使用する必要がある。
脚注
- ^ “GDI+” (英語). MSDN ライブラリ. マイクロソフト. 2009年2月22日閲覧。
- ^ “Platform SDK Redistributable: GDI+” (英語). ダウンロードセンター. マイクロソフト (日付(YYYY-MM-DD)). 2009年2月22日閲覧。