// 1.
GBUF_STRUCT * gbuf = GBuf_Create(640,480,GF_DEFAULT);
// 2.
GBuf_LoadImage(gbuf,"bitmap.bmp",0);
BOOL WINAPI GBuf_LoadImage(GBUF_STRUCT *dst,LPSTR filename,DWORD flags)
{
// ファイルの読み込み、bufに格納する
HANDLE handle = CreateFile_Read(filename);
if(handle == INVALID_HANDLE_VALUE)return FALSE;
DWORD size = GetFileSize(handle,NULL),readsize = 0;
LPBYTE buf = (LPBYTE)Malloc(size);
ReadFile(handle,buf,size,&readsize,NULL);
CloseHandle(handle);
if(size != readsize)return FALSE;
// BITMAP
if(memcmp(buf,"BM",2) == 0){
LPBITMAPFILEHEADER fh = (LPBITMAPFILEHEADER)buf;
LPBITMAPINFOHEADER ih = (LPBITMAPINFOHEADER)(buf + sizeof(BITMAPFILEHEADER));
LPRGBQUAD tbl = (LPRGBQUAD)(buf + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)),wtbl;
LPBYTE bits = (LPBYTE)(buf + fh->bfOffBits),input,winput;
G_PIXEL *output = GBuf_GetPtr(dst),*woutput = output;
int x = 0,y = 0;
int ex = (ih->biWidth < dst->width ) ? ih->biWidth : dst->width ;
int ey = (ih->biHeight < dst->height) ? ih->biHeight : dst->height;
LONG pitch;
switch(ih->biBitCount){
case 8:
pitch = (LONG)((ih->biWidth + 3) & 0xfffffffc);
input = winput = bits + (pitch * (ih->biHeight - 1));
while(y < ey){
while(x < ex){
wtbl = tbl + *winput;
woutput->pixel.blue = wtbl->rgbBlue;
woutput->pixel.green = wtbl->rgbGreen;
woutput->pixel.red = wtbl->rgbRed;
woutput->pixel.alpha = 0;
winput++;
woutput++;
x++;
}
woutput = (output += dst->pitch);
winput = (input -= pitch);
x = 0;
y++;
}
break;
case 24:
pitch = (LONG)((ih->biWidth * 3 + 3) & 0xfffffffc);
input = winput = bits + (pitch * (ih->biHeight - 1));
while(y < ey){
while(x < ex){
woutput->pixel.blue = winput[0];
woutput->pixel.green = winput[1];
woutput->pixel.red = winput[2];
woutput->pixel.alpha = 0;
winput += 3;
woutput++;
x++;
}
woutput = (output += dst->pitch);
winput = (input -= pitch);
x = 0;
y++;
}
break;
default:
// 対応していない形式
Free(buf);
return TRUE;
}
Free(buf);
return TRUE;
}
Free(buf);
return FALSE;
}