ata是Windows位图格式,
// data图像数据直接传输到DC
if (alphaI >= 255 && !(data->Reserved & PixelAlphaFlag) && data->Stride < 0)
{
GetBitmapInfoHeader(data, &bi);
BitBltImageData(DC, x, y, data, &bi);
return;
}
// 调整DC可见矩形左上角坐标
x -= r.left;
y -= r.top;
if (x > 0)
{
r.left += x;
x = 0;
}
if (y > 0)
{
r.top += y;
y = 0;
}
// 计算data传输到DC的实际尺寸到图像数据dst
tmp.Width = r.right - r.left;
tmp.Height = r.bottom - r.top;
tmp.Reserved = 0;
if (!GetSubBitmapData(&tmp, x, y, data->Width, data->Height, &dst))
return;
// 按32位像素格式分配dst扫描线内存
dst.Stride = dst.Width << 2;
dst.Scan0 = scan0 = (LPVOID)new CHAR[dst.Height * dst.Stride];
// 计算data与DC的交集子图像数据
if (x < 0) x = -x;
if (y < 0) y = -y;
GetSubBitmapData(data, x, y, dst.Width, dst.Height, &src);
GetBitmapInfoHeader(&src, &bi);
// 如果alpha<1,或者data含Alpha信息,获取DC原图形到dst
if (alphaI < 255 || (data->Reserved & PixelAlphaFlag));
GetDCImageData(DC, r.left, r.top, &dst, &bi);
// dst扫描线内存转换成Windows位图格式
dst.Scan0 = (LPBYTE)scan0 + (dst.Height - 1) * dst.Stride;
dst.Stride = -dst.Stride;
// 图像混合
ImageMixer(&dst, &src, alphaI);
// 还原dst扫描线内存格式后,传输到DC
dst.Scan0 = scan0;
BitBltImageData(DC, r.left, r.top, &dst, &bi);
delete[] scan0;
}
//---------------------------------------------------------------------------
VOID GetBitmapInfoHeader(CONST BitmapData *data, CONST PBITMAPINFO pbi)
{
pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbi->bmiHeader.biWidth = data->Width;
pbi->bmiHeader.biHeight = data->Height;
pbi->bmiHeader.biPlanes = 1;
pbi->bmiHeader.biBitCount = (data->PixelFormat >> 8) & 0xff;
pbi->bmiHeader.biCompression = BI_RGB;
}
//---------------------------------------------------------------------------
VOID GetDCImageData(HDC DC, INT x, INT y, BitmapData *data, PBITMAPINFO pbi)
{
HBITMAP bitmap = CreateCompatibleBitmap(DC, data->Width, data->Height);
HDC memDC = CreateCompatibleDC(DC);
HBITMAP saveBitmap = (HBITMAP)SelectObject(memDC, bitmap);
BitBlt(memDC, 0, 0, data->Width, data->Height, DC, x, y, SRCCOPY);
SelectObject(memDC, saveBitmap);
DeleteDC(memDC);
GetDIBits(DC, bitmap, 0, data->Height, data->Scan0, pbi, DIB_RGB_COLORS);
DeleteObject(bitmap);
}
//---------------------------------------------------------------------------
VOID BitBltImageData(HDC DC, INT x, INT y, CONST BitmapData *data, PBITMAPINFO pbi)
{
HBITMAP bitmap = CreateDIBitmap(DC, &pbi->bmiHeader, CBM_INIT, data->Scan0, pbi, DIB_RGB_COLORS);
HDC memDC = CreateCompatibleDC(DC);
HBITMAP saveBitmap = (HBITMAP)SelectObject(memDC, bitmap);
BitBlt(DC, x, y, data->Width, data->Height, memDC, 0, 0, SRCCOPY);
SelectObject(memDC, saveBitmap);
DeleteDC(memDC);
DeleteObject(bitmap);
}
//---------------------------------------------------------------------------
VOID ImageDraw(HDC DC, INT x, INT y, CONST BitmapData *data, float alpha = 1.0f)
{
BITMAPINFO bi;
RECT r;
INT alphaI;
LPVOID scan0;
BitmapData dst, src, tmp;
// 获取DC可见矩形
if (GetClipBox(DC, &r) <= NULLREGION)
return;
alphaI = (INT)(alpha * 255);
// 如果alpha=1,同时data不含alpha信息,同时data是Windows位图格式,
// data图像数据直接传输到DC
if (alphaI >= 255 && !(data->Reserved & PixelAlphaFlag) && data->Stride < 0)
{
GetBitmapInfoHeader(data, &bi);
BitBltImageData(DC, x, y, data, &bi);
return;
}
// 调整DC可见矩形左上角坐标
x