○ データの流れ
┌→ [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用のハンドルです。