Graphics Device Interface (GDI) について
Graphics Device Interface(GDI)は、Windows
オペレーティングシステムの中核をなすグラフィカルサブシステムの一つです。GDIは、アプリケーションがディスプレイや
プリンターなどの出力デバイスにグラフィックスを表示・印刷する際に、その描画処理を抽象化し、統一的なインターフェースを提供する役割を担います。これにより、開発者は特定の
ハードウェアに依存することなく、多様なデバイスに対して同じように描画処理を行うことができます。
GDI の主な機能
GDIは、以下のようなグラフィックス処理を行います。
- - 直線、曲線、矩形、楕円などの基本的な図形の描画と塗りつぶし
- - ビットマップ画像(ラスター画像)の操作
- - フォントの管理とレンダリング
- - パレットの制御
これらの処理は、`gdi32.dll` という
ライブラリによって提供されています。
GDI の役割と特徴
GDIは、
ハードウェアを直接制御する
デバイスドライバーよりも上位に位置し、デバイスの機能を抽象化する役割を持っています。これにより、アプリケーションは多様な出力デバイスに対して、適切な表示結果を期待できます。この機能は、WindowsのWYSIWYGアプリケーション(見たままを印刷できるアプリケーション)にとって不可欠です。
かつては、
フリーセルや
マインスイーパのような、高速な描画が不要なゲームにGDIが使われていましたが、GDIにはアニメーション表示が苦手(フレームバッファ同期の概念がない)、3Dラスタライズ機能がないという欠点があり、ゲーム開発には不向きです。そのため、現代のゲーム開発では、DirectX (Direct2D/
Direct3D)、
OpenGL、Vulkanのような、より
ハードウェアの性能を最大限に活用できるグラフィックスAPIが主流となっています。
Windows Vista 以降の GDI
Windows Vistaでは、GDIアプリケーションは
Desktop Window Manager (DWM) という新しい描画エンジン上で動作するようになりました。これにより、GDIコンテンツは一旦システムメモリ上のビットマップに
CPUで描画されるようになり、
ハードウェアアクセラレーションは用いられなくなりました。しかし、Windows 7以降では、DWMが有効になっている場合に、GDIの一部が再び
ハードウェアアクセラレートされるようになっています。
GDI
プリンターは、
プリンターで行うべき処理の一部をホストコンピュータ(PC)側で行うタイプの
プリンターです。具体的には、PC側でビットマップイメージを描画し、それを
プリンターに転送します。
- - プリンターに描画処理用のCPUやRAMを搭載する必要がないため、コストを削減できます。
- - イメージを印刷することに特化できるため、性能を最適化できます。
- - ホストコンピュータの負荷が高まります。特に古いPCで複雑なドキュメントを印刷する場合は、印刷に時間がかかることがあります。
- - GDIプリンターは、プリンターのファームウェアに標準的な印刷機能のエミュレーションを含まないことが多いです。そのため、PCLやPostScriptプリンターのように、ドライバーを更新してバグに対応することが難しい場合があります。
- - GDIプリンターは、通常Windowsでしか動作しません。他のOSでは使用できない場合があります。
最新の
インクジェット[[プリンター]]では、性能上の理由からGDIベースのものが増えていますが、柔軟性が高まっています。多くの
プリンターがMacに対応し、
Linuxコミュニティもドライバーのサポートを強化しています。一部のメーカーでは、従来の印刷エミュレーションを予備として提供することもあります。
安価なレーザー
プリンターもGDIデバイスであることが多いですが、
PCLや
PostScriptに対応したモデルも存在します。
GDI の詳細
デバイスコンテキスト
デバイスコンテキストは、描画対象を抽象化した存在です。画面や
プリンターへ出力するテキストやイメージの属性を定義するために使用されます。デバイスコンテキストはGDIによって管理され、ハンドルを通じて操作します。描画を行う前にデバイスコンテキストを取得し、要素の書き込み後に解放する必要があります。
デバイスコンテキストには以下の種類があります。
- - 画面
- - プリンター
- - メモリ
- - 情報(描画には使用できない情報取得専用)
グラフィックスオブジェクト
デバイスコンテキストに関連付け可能なグラフィックスオブジェクトには以下の種類があります。
- - ビットマップ (HBITMAP)
- - ブラシ (HBRUSH)
- - フォント (HFONT)
- - ペン (HPEN)
- - リージョン (HRGN)
- - パス (リージョンに変換可能)
- - パレット (HPALETTE)
これらのオブジェクトは、`SelectObject` や `SelectPalette` 関数を使ってデバイスコンテキストに関連付けます。
GDIオブジェクトの数には上限があり、1セッションで65,535個まで、1プロセスで10,000個までという制限があります。
GDI+ (Graphics Device Interface Plus)
GDI+は、Windows XPで導入された新しいグラフィックスサブシステムです。GDI+は、アルファブレンド、グラデーション、アンチエイリアス、より複雑なラインパス管理、
JPEGやPNGなどの新しい画像形式のサポート、2D変換の合成など、GDIにはなかった高度な機能を提供します。
GDI+は、ネイティブ
C++のクラス
ライブラリとして提供されていますが、
.NET Frameworkや
Delphiなどの言語でも利用可能です。
Direct2D
Direct2Dは、Windows 7で導入された、
ハードウェアアクセラレーションを活用した2DグラフィックスAPIです。Direct2Dは、GDI+の描画性能を改善するために開発され、
Direct3Dを基盤としています。これにより、DWMの有無に関わらず
ハードウェアアクセラレーションが有効になり、より高速な描画が可能になりました。
Direct2Dは、OpenTypeフォントや垂直方向へのClearTypeアンチエイリアスなど、GDI+にはない機能も備えています。
Direct2Dでは、画像ファイルの読み書きはWIC(Windows Imaging Component)が担当します。
Direct2Dは、
Direct3Dとの連携機構を備えており、
Direct3Dテクスチャに直接書き込むことができます。
Direct2D 1.0では印刷機能は直接サポートされていませんでしたが、Direct2D 1.1以降では印刷機能もサポートされています。
関連情報
外部リンク