📄 bitmap.cpp
字号:
// Bitmap.cpp: implementation of the Bitmap class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Bitmap.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Bitmap::Bitmap(LPDIRECTDRAW7 lpdd, int cx ,int cy)
{
width = cx, height = cy;
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.dwWidth = width;
ddsd.dwHeight = height;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
lpdd->CreateSurface(&ddsd, &lpdds, NULL);
}
Bitmap::~Bitmap()
{
if(lpdds) lpdds->Release();
lpdds = NULL;
}
HRESULT Bitmap::Draw(LPDIRECTDRAWSURFACE7 drawingsurface,int x, int y)
{
RECT rc = { 0, 0, width, height};
return drawingsurface->BltFast(x, y, lpdds, &rc,
DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
}
BOOL Bitmap::LoadBitmap(LPCTSTR filename, int x, int y)
{
HBITMAP hbmp = (HBITMAP)LoadImage(GetModuleHandle(NULL),
filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
HDC xdc;
lpdds->GetDC(&xdc);
HDC hdc = CreateCompatibleDC(xdc);
SelectObject(hdc, hbmp);
BitBlt(xdc, 0, 0, width, height,
hdc, x, y, SRCCOPY);
lpdds->ReleaseDC(xdc);
DeleteDC(hdc);
DeleteObject(hbmp);
return TRUE;
}
HRESULT Bitmap::SetColorKey(COLORREF key)
{
DDCOLORKEY ddkey;
ddkey.dwColorSpaceHighValue = key;
ddkey.dwColorSpaceLowValue = key;
return lpdds->SetColorKey(DDCKEY_SRCBLT, &ddkey);
}
HRESULT Bitmap::CreateSurface(LPDIRECTDRAW7 lpdd, int cx, int cy)
{
width = cx, height = cy;
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.dwWidth = width;
ddsd.dwHeight = height;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
return lpdd->CreateSurface(&ddsd, &lpdds, NULL);
}
HRESULT Bitmap::AlphaBlendDraw(LPDIRECTDRAWSURFACE7 drawingsurface, int x, int y, int alpha)
{
#define GetRValue565(color) (((color) >> 11) & 0x1F)
#define GetGValue565(color) (((color) >> 5) & 0x3F)
#define GetBValue565(color) ((color) & 0x1F)
#define RGB16BIT565(r,g,b) ((b%32) + ((g%64) << 5) + ((r%32) << 11))
alpha = alpha % 32;
unsigned short* dest, *src;
int pitch;
DDSURFACEDESC2 ddsd = { sizeof(ddsd)};
drawingsurface->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL);
dest = (unsigned short*)ddsd.lpSurface;
pitch = ddsd.lPitch/sizeof(unsigned short);
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
lpdds->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,NULL);
src = (unsigned short*)ddsd.lpSurface;
dest = dest + y*pitch + x;
BYTE destR,destG,destB,srcR,srcG,srcB;
for( int i = 0 ; i < height; ++i)
{
for( int j = 0; j < width; ++j)
{
destR = GetRValue565(dest[j]);
srcR = GetRValue565(src[j]);
destR = (destR * alpha + (32 - alpha) * srcR) >> 5;
destG = GetGValue565(dest[j]);
srcG = GetGValue565(src[j]);
destG = (destG * alpha + (32 - alpha) * srcG) >> 5;
destB = GetBValue565(dest[j]);
srcB = GetBValue565(src[j]);
destB = (destB * alpha + (32 - alpha) * srcB) >> 5;
dest[j] = RGB16BIT565(destR, destG, destB);
}
dest += pitch;
src += width+1;
}
lpdds->Unlock(NULL);
drawingsurface->Unlock(NULL);
return 0;
}
LPVOID Bitmap::GetBitmapBuffer()
{
DDSURFACEDESC2 ddsd = { sizeof(ddsd)};
lpdds->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL);
return ddsd.lpSurface;
}
void Bitmap::ReleaseBuffer()
{
lpdds->Unlock(NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -