windows-nt/Source/XPSP1/NT/shell/themes/uxtheme/bmpcache.cpp
2020-09-26 16:20:57 +08:00

82 lines
2.3 KiB
C++

//---------------------------------------------------------------------------
// BmpCache.cpp - single bitmap/hdc cache object for uxtheme
//---------------------------------------------------------------------------
#include "stdafx.h"
#include "BmpCache.h"
//---------------------------------------------------------------------------
CBitmapCache::CBitmapCache()
{
_hBitmap = NULL;
_iWidth = 0;
_iHeight = 0;
InitializeCriticalSection(&_csBitmapCache);
}
//---------------------------------------------------------------------------
CBitmapCache::~CBitmapCache()
{
if (_hBitmap)
{
DeleteObject(_hBitmap);
}
DeleteCriticalSection(&_csBitmapCache);
}
//---------------------------------------------------------------------------
HBITMAP CBitmapCache::AcquireBitmap(HDC hdc, int iWidth, int iHeight)
{
EnterCriticalSection(&_csBitmapCache);
if ((iWidth > _iWidth) || (iHeight > _iHeight) || (! _hBitmap))
{
if (_hBitmap)
{
DeleteObject(_hBitmap);
_hBitmap = NULL;
_iWidth = 0;
_iHeight = 0;
}
//---- create new bitmap & hdc ----
struct {
BITMAPINFOHEADER bmih;
ULONG masks[3];
} bmi;
bmi.bmih.biSize = sizeof(bmi.bmih);
bmi.bmih.biWidth = iWidth;
bmi.bmih.biHeight = iHeight;
bmi.bmih.biPlanes = 1;
bmi.bmih.biBitCount = 32;
bmi.bmih.biCompression = BI_BITFIELDS;
bmi.bmih.biSizeImage = 0;
bmi.bmih.biXPelsPerMeter = 0;
bmi.bmih.biYPelsPerMeter = 0;
bmi.bmih.biClrUsed = 3;
bmi.bmih.biClrImportant = 0;
bmi.masks[0] = 0xff0000; // red
bmi.masks[1] = 0x00ff00; // green
bmi.masks[2] = 0x0000ff; // blue
_hBitmap = CreateDIBitmap(hdc, &bmi.bmih, CBM_CREATEDIB , NULL, (BITMAPINFO*)&bmi.bmih,
DIB_RGB_COLORS);
if (_hBitmap)
{
_iWidth = iWidth;
_iHeight = iHeight;
}
}
return _hBitmap;
}
//---------------------------------------------------------------------------
void CBitmapCache::ReturnBitmap()
{
LeaveCriticalSection(&_csBitmapCache);
}
//---------------------------------------------------------------------------