RE^3:RGBQUADの開放?
(
みやさか
)
1999/10/16 02:28
Win32 SDK の BITMAPINFO 構造体の定義を見ると、
> typedef struct tagBITMAPINFO {
> BITMAPINFOHEADER bmiHeader;
> RGBQUAD bmiColors[1];
> } BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
となっていて、bmiColors はポインタではなく実体そのものです。ここには、
ダミーの配列要素 bmiColors[1] として定義されているのですが、ここで
C言語の構造体内に可変長の配列を入れるためのちょっとした「裏技」が
使われます。
この構造体用のメモリを LocalAlloc で割り当てるときには、そのバイト数を
以下の式で計算します。palettes はパレットの数です。
hedsize = sizeof(BITMAPINFO)-sizeof(RGBQUAD)+(palettes)*sizeof(RGBQUAD);
こうすると、実際には sizeof(BITMAPINFO) よりも大きなメモリ領域が
確保されます。そして、bmpinfo.bmiColors[8]; というようにすると、
この余分に割り当てられたメモリ領域にアクセスできるのです。
BITMAPINFO 構造体では、このようにして、ここにパレット配列の実体が
入っています。
もちろんこの裏技は、静的変数や自動変数として割り当てるときには
使えません(サイズが不定なので)。
BMP ファイルのフォーマットを知っているのであれば、BITMAPINFO 構造体
には、BMP ファイルの BITMAPINFOHEADER と RGBQUAD 配列がそのまま
入っている、と思えばいいでしょう。
--「RE^3:RGBQUADの開放?」に対するコメント--
タイトル(Subject):
お名前(Your name):
Mail address:
Password:
:入力しておくとあとで削除できます
Your message:
7thBridge P ver0.26 (c)Takechin