Windowsコード集 上のページ

#0000 グラフィック描画ライブラリ

■ グラフィック描画ライブラリについて
ずっと温めていたものの、なかなか開発に踏み込めずにいたグラフィック描画ライブラリですが、いろいろと考えた末、このような形で発表させていただく事にしました。
フルカラーおよびハイカラーモードでの使用を前提としています。256色パレットでの利用は考慮されておりません。しかし昨今のビデオカードやCPUの性能は著しく進化しているので、最大限のパフォーマンスを要求するプログラムを作ろうとしない限りはこれで十分だと考えます。
ここでは、独自の仕様に基づく描画関数のコードを掲載します。他のライブラリとのリンクはデバイスコンテキスト(DC)を用いますので、GDIやDirectDraw等とのインターフェースは確保されています。

■ 注意
ここで紹介されているコードは、全て同一の規格の元に作られた物です。
コードを使用するときは、GBufコアをダウンロードする必要があります。
他の方がこれらを利用して開発を行われる事に関しては、トップページにて記述されている注意書きの範囲でしたら有効に活用しても構いません。ただし、ここで提唱している物以外で仕様に合わせたコードの掲載は行いませんのでご了承ください。要望に関しても同じです。かけ離れた仕様に関しての要望が合った場合は、それに答える事はできません。

■ ALGee(G-5) アーキテクチャー
○ データの流れ
                                            ┌→ [DirectDrawSurface]
       [GBuf] ←→ [GBuf] ←→ [DIB-GBuf] ←┤
                                            └→ [DC]

○ 説明

GBuf
グラフィックバッファです。1ピクセルをRGBAの32bitで構成しています。
このバッファは、同じGBuf同士もしくはDIB-GBufのみついてのデータのやり取りができます。
掲載される関数のほとんどは、このGBufを有効に活用するための物です。

DIB-GBuf
GBufにデバイスコンテキストハンドルとBITMAPハンドルを含めた物です。
このバッファはDIBSectionで生成されているので、GDI関数を利用するのに使われます。
また、DirectDrawSurfaceやGDIとの橋渡しとして使う事ができます。
このバッファは生成・開放を繰り返す場合には、あまり使わない方が良いようです。

DirectDrawSurface,GDI
DirectX(DirectDraw)のオブジェクト及び、GDIから生成されるデバイスコンテキスト(DC)です。
これらとのデータのやり取りは、GDIを使用する事でそれが可能になっています。


○ GBufの構造
    // データ型
    typedef unsigned char   G_BYTE;     // ピクセル
    typedef unsigned long   G_LONG;     // ロング
    typedef unsigned long   G_FLAG;     // フラグ

    // 1ピクセルの情報
    typedef struct{
        G_BYTE              blue;       // 青輝度
        G_BYTE              green;      // 緑輝度
        G_BYTE              red;        // 赤輝度
        G_BYTE              alpha;      // アルファ値
    }GPIXEL_STRUCT;

    typedef union{
        GPIXEL_STRUCT       pixel;      // 輝度フォーマット
        G_LONG              data;       // パック値
    }G_PIXEL;

    // GBuf構造体
    typedef struct{
        int                 width;      // 幅
        int                 height;     // 高さ
        int                 pitch;      // 1ライン辺りの長さ(バイト)
        G_FLAG              flags;      // フラグ
        G_PIXEL             *gbuf;      // 画像データ
        G_PIXEL             *gtop;      // 先頭位置

        // マスク
        G_PIXEL             mask;       // マスクデータ

        // DIB
        HBITMAP             bitmap;     // BITMAPハンドル
        HDC                 dc;         // デバイスコンテキスト
    }GBUF_STRUCT;

    // 画像属性
    #define GF_DIB          1           // DIB
    #define GF_ALPHA        2           // アルファ
    #define GF_MASK         4           // マスク
    #define GF_DEFAULT      0           // デフォルト
以下に、特に重要であるGBuf(グラフィックバッファ)構造体を中心に説明します。

width,height
グラフィックバッファのサイズです。

pitch
1ラインの移動に必要なデータサイズを記した、ダブルワード値です。
通常は、"- width"が設定されます。

flags
グラフィックバッファの属性です。
現在は、DIBモード、アルファモード、マスクモードの3種類の属性が定義されています。

gbuf,gtop
グラフィックバッファをアクセスするためのポインタです。
gbufはバッファの先頭ポインタ、gtopは[0,0]の位置があるポインタが設定されています。
DIBモードではDIBSectionのポインタ、通常はヒープで確保したポインタとなっています。
ピクセル構造はGPIXEL_STRUCTが示す通り、4バイトの情報で定義されます。このうち、alphaはflagsにGF_ALPHAが定義されている場合に参照されるようになっています。

mask
マスクモード時の、マスクカラーです。
flagsにGF_MASKが定義されている場合に、この値が参照されるようになっています。

bitmap,dc
GDI用のハンドルです。


上のページ