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 によるハードウェアアクセラレーションを活用することで大幅に改善することが可能となる。ただし、現在の Direct2D 1.0 では、印刷機能(印刷機器への出力機能)に直接対応しないため、印刷時には GDI/GDI+ あるいは XPS ドキュメント API(XPS 作成やそれを用いての印刷などに対応する API)を使用する必要がある。
脚注 [編集]
- ^ “GDI+” (英語). MSDN ライブラリ. マイクロソフト. 2009年2月22日閲覧。
- ^ “Platform SDK Redistributable: GDI+” (英語). ダウンロードセンター. マイクロソフト (日付(YYYY-MM-DD)). 2009年2月22日閲覧。
関連項目 [編集]
- WinG
- DirectX
- Windows Graphics Foundation
- ラスターイメージプロセッサ (Raster Image Processor)
- Direct2D