Files
Graphics-Rasterizer/Bitmap.cpp
2021-12-11 13:18:04 +00:00

112 lines
2.0 KiB
C++

#include "Bitmap.h"
Bitmap::Bitmap()
{
}
Bitmap::~Bitmap()
{
// Ensure we clean up any existing bitmap
DeleteBitmap();
}
// Create a new bitmap of the specified width and height, deleting any existing bitmap
//
// Returns value of false if bitmap cannot be created.
bool Bitmap::Create(HWND hWnd, unsigned int width, unsigned int height)
{
bool status = false;
HDC hDc;
// Delete any existing bitmap
DeleteBitmap();
// Create a device context compatible with the window device context
hDc = ::GetDC(hWnd);
_width = width;
_height = height;
_hMemDC = CreateCompatibleDC(hDc);
if (_hMemDC != 0)
{
// Create a bitmap compatible with the window
_hBitmap = CreateCompatibleBitmap(hDc, _width, _height);
if (_hBitmap != 0)
{
// Select the bitmap into the new device context, saving any old bitmap handle
_hOldBitmap = static_cast<HBITMAP>(SelectObject(_hMemDC, _hBitmap));
status = true;
}
}
// Release the device context for the window
ReleaseDC(hWnd, hDc);
return status;
}
// Return device context of bitmap
HDC Bitmap::GetDC() const
{
return _hMemDC;
}
// Return width of bitmap
unsigned int Bitmap::GetWidth() const
{
return _width;
}
// Return height of bitmap
unsigned int Bitmap::GetHeight() const
{
return _height;
}
// Delete any existing bitmap
void Bitmap::DeleteBitmap()
{
// Select any default bitmap that existed for the device context
if (_hOldBitmap != 0 && _hMemDC != 0)
{
SelectObject(_hMemDC, _hOldBitmap);
_hOldBitmap = 0;
}
// Delete any existing bitmap
if (_hBitmap != 0)
{
DeleteObject(_hBitmap);
_hBitmap = 0;
}
// Delete any existing bitmap device context
if (_hMemDC != 0)
{
DeleteDC(_hMemDC);
_hMemDC = 0;
}
}
// Clear bitmap using the specified brush
void Bitmap::Clear(HBRUSH hBrush) const
{
RECT rect;
rect.left = 0;
rect.right = _width;
rect.top = 0;
rect.bottom = _height;
FillRect(_hMemDC, &rect, hBrush);
}
// Clear bitmap using the specified colour
void Bitmap::Clear(COLORREF colour) const
{
HBRUSH brush = CreateSolidBrush(colour);
Clear(brush);
DeleteObject(brush);
}