nim_duilib/ui_components/cef_control/util/memory_dc.cpp
jiajia_deng 4933d1f2bc Remove dependency on shared
Signed-off-by: jiajia_deng <2894220@gmail.com>
2019-09-20 16:27:58 +08:00

124 lines
2.2 KiB
C++

#include "stdafx.h"
#include "memory_dc.h"
MemoryDC::MemoryDC()
{
bitmap_ = NULL;
old_bitmap_ = NULL;
mem_dc_ = NULL;
memset(&bitmap_info_, 0, sizeof(bitmap_info_));
bitmap_size_.cx = bitmap_size_.cy = 0;
valid_ = false;
}
MemoryDC::~MemoryDC()
{
DeleteDC();
}
void MemoryDC::DeleteDC()
{
if (old_bitmap_ != NULL)
{
::SelectObject(mem_dc_, old_bitmap_);
old_bitmap_ = NULL;
}
if (bitmap_ != NULL)
{
::DeleteObject(bitmap_);
bitmap_ = NULL;
}
if (mem_dc_ != NULL)
{
::DeleteDC(mem_dc_);
mem_dc_ = NULL;
}
memset(&bitmap_info_, 0, sizeof(bitmap_info_));
valid_ = false;
}
bool MemoryDC::Init(HDC src_dc, int width, int height, const LPVOID pBits/*=NULL*/)
{
DeleteDC();
LPVOID pBmpBits = NULL;
bool bRet = CreateMemoryDC(src_dc, width, height, &pBmpBits);
if (bRet)
{
bitmap_size_.cx = width;
bitmap_size_.cy = height;
int stride = bitmap_size_.cx * 4;
if (pBits)
{
memcpy(pBmpBits, pBits, stride*bitmap_size_.cy);
}
else
{
memset(pBmpBits, 0, stride*bitmap_size_.cy);
}
}
return bRet;
}
bool MemoryDC::CreateMemoryDC(HDC src_dc, int width, int height, void** pBits)
{
if (mem_dc_ != NULL || src_dc == NULL || width == 0 || height == 0)
return false;
mem_dc_ = ::CreateCompatibleDC(src_dc);
BITMAPINFO bmi;
::ZeroMemory(&bmi, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = -height;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = width * height * 4;
bitmap_ = ::CreateDIBSection(src_dc, &bmi, DIB_RGB_COLORS, pBits, NULL, 0);
old_bitmap_ = (HBITMAP)::SelectObject(mem_dc_, bitmap_);
::GetObject(bitmap_, sizeof(bitmap_info_), &bitmap_info_);
valid_ = true;
return true;
}
BYTE* MemoryDC::GetBits()
{
ASSERT(valid_);
BYTE *pPiexl = LPBYTE(bitmap_info_.bmBits);
ASSERT(pPiexl != NULL);
return pPiexl;
}
int MemoryDC::GetWidth()
{
return bitmap_size_.cx;
}
int MemoryDC::GetHeight()
{
return bitmap_size_.cy;
}
HBITMAP MemoryDC::GetBitmap()
{
ASSERT(bitmap_ != NULL && valid_);
return bitmap_;
}
HDC MemoryDC::GetDC()
{
ASSERT(mem_dc_ != NULL);
return mem_dc_;
}
bool MemoryDC::IsValid()
{
return valid_ && mem_dc_ != NULL && bitmap_ != NULL;
}