Graphics Device Interface
Graphics Device Interface (グラフィクス・デバイス・インタフェイス、GDI)とは、カーネル及びユーザ(ウィンドウマネージャ)と協調する 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 レーザープリンターは本来プリンターが行う処理の一部をホストコンピュータ (PC) 側で代行する。ホストコンピュータでビットマップイメージを描写し、プリンターにビットマップを転送する。この方式には以下の2つの利点がある。
また、以下の点で不利である。
- ホストコンピュータの負荷が高くなる。最近のPCでは問題ないが、古いPCで複雑なドキュメントを印刷する場合は非常に遅くなる場合がある。
- GDI プリンターは通常、プリンターのファームウェアに標準的な印刷機能のエミュレーションを含まない(またはそれを処理できる能力を持たない)。ハイエンドの PCL プリンターや PostScriptプリンターでは、ソフトウェアの互換性やドライバのバグなどの問題があった場合にドライバを更新して対応できるが、GDI プリンターでは対応策がない場合がある。
- GDIプリンターは一般的に Windows に限り動作する。例外はあるが、他の OS では原則的に GDI プリンターを使用できない。
最新のインクジェットプリンターの機種は GDI ベース(レーザプリンターでは費用が主要因であるのに対し、ここでは主に性能の理由)であるが、より柔軟な傾向がある。多くが Mac に対応し、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 で v1.1 となった。
Direct2D
Windows Vista 以降の Windows OS 上では、ハードウェアによるGDIアクセラレーションが実行されない(除 BitBlt)。また、GDI+ では飛躍的に表現力や描画品質が向上しているが、内部で使用されている API はレガシーな GDI そのものであったりソフトウェア実装であったりするため、描画速度は当然犠牲になる。これらを補完する形で登場したのが Direct2D および DirectWrite である。Direct2D/DirectWrite は、GDI+ の先進的な機能を Direct3D 10.1 上に構築した COM ベースの高レベル API で、GDI/GDI+ で問題となっていた描画速度性能を、Direct3D によるハードウェアアクセラレーションを活用することで大幅に改善することが可能となる。また、DirectWriteはGDI+に欠けていた、OpenTypeフォントへの対応や垂直方向へのClearTypeアンチエイリアスといった機能を備えている。 なお、Windows 7 および Windows Vista SP2 + Platform Update 以降に提供されている Direct2D 1.0 では、印刷機能(印刷機器への出力機能)に直接対応しないため、印刷時には GDI/GDI+ あるいは XPS ドキュメント API(XPS 作成やそれを用いての印刷などに対応する API)を使用する必要がある。しかし、Windows 8 および Windows 7 SP1 + Platform Update 以降に提供されている Direct2D 1.1 以降であれば、メタデータの出力機能などが追加実装されており、描画内容をプリンターデバイスに出力して印刷することも可能である[1]。 さらに、Direct2DにはベースとなっているDirect3Dとの連携機構が確保されており、Direct2D 1.0 APIを使用してDXGIインターフェイス経由でDirect3D 10.xテクスチャに直接書き込んだり、またDirect2D 1.1 APIを使用してDirect3D 11.xテクスチャに直接書き込んだりすることが可能となっている。
なお、GDI+での強化点であった各種形式の画像ファイルの読み込みや書き出しといった機能に関しては、Direct2Dコンポーネントは直接サポートせず、代わりにWIC(Windows Imaging Component)が担うことになる。
脚注
- ^ “GDI+” (英語). MSDN ライブラリ. マイクロソフト. 2009年2月22日閲覧。
- ^ “Platform SDK Redistributable: GDI+” (英語). ダウンロードセンター. マイクロソフト (日付(YYYY-MM-DD)). 2009年2月22日閲覧。
関連項目
- WinG
- DirectX
- Windows Graphics Foundation
- ラスターイメージプロセッサ (Raster Image Processor)
- Direct2D