home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Elite Hackers Toolkit
/
TheEliteHackersToolkitVolume1_1998.rar
/
HACKERS.BIN
/
appcraks
/
P5WGLIDE.ZIP
/
DIBSECTI.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1998-01-03
|
6KB
|
234 lines
#include <windows.h>
// Justin's nifty DIBSection class for Win32. Feel free to use this in your programs.
// Just email justin@nullsoft.com if you like 'em.
// (And I don't want any bug reports! If you have bugfixes, though, send em my way) :)
// Copr. 1997-1998, Justin Frankel/Nullsoft, Inc.
#include "DIBSection.h"
/*
** BASE CLASS
*/
void CDIBSection::m_DeInitialize()
{
if (m_hdc) {
::SelectObject(m_hdc, m_oldhbm);
::DeleteObject(m_hbm);
::DeleteDC(m_hdc);
}
m_hdc = 0;
m_hbm = 0;
}
void CDIBSection::SetRect(RECT *r)
{
m_DeInitialize();
m_Initialize(m_hwndParent,r);
}
void CDIBSection::Update()
{
HDC wndDC = ::GetDC(m_hwndParent);
m_PreRender(wndDC);
{
RECT r;
::GetWindowRect(m_hwndParent,&r);
::BitBlt(wndDC,0,0,GetWidth(),GetHeight(),m_hdc,0,0,SRCCOPY);
}
::ReleaseDC(m_hwndParent,wndDC);
}
void CDIBSection::Paint(HDC hdc)
{
m_PreRender(hdc);
::BitBlt(hdc,m_rect.left,m_rect.top,GetWidth(),GetHeight(),m_hdc,0,0,SRCCOPY);
}
/*
** 8BPP CLASS
*/
CDIBSection8::CDIBSection8(HWND hwnd,RECT *r,unsigned char *palette)
{
RECT r2;
if (palette) ::memcpy(m_pal,palette,sizeof(m_pal));
if (!r) ::GetClientRect(hwnd,&r2);
else r2 = *r;
m_Initialize(hwnd,&r2);
}
CDIBSection8::~CDIBSection8()
{
m_DeInitialize();
}
void CDIBSection8::m_DeInitialize()
{
if (m_hpal) ::DeleteObject(m_hpal);
m_hpal = 0;
CDIBSection::m_DeInitialize();
}
void CDIBSection8::m_Initialize(HWND hwndParent, RECT *r)
{
m_rect = *r;
int width = m_rect.right-m_rect.left;
int height = m_rect.bottom-m_rect.top;
if (width & 3) width += 3;
width &= ~3;
m_hwndParent = hwndParent;
m_SetupPalette();
m_bitmap.bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_bitmap.bmi.bmiHeader.biPlanes = 1;
m_bitmap.bmi.bmiHeader.biBitCount = 8;
m_bitmap.bmi.bmiHeader.biCompression = BI_RGB;
m_bitmap.bmi.bmiHeader.biSizeImage = 0;
m_bitmap.bmi.bmiHeader.biClrUsed = 0;
m_bitmap.bmi.bmiHeader.biClrImportant = 0;
m_bitmap.bmi.bmiHeader.biWidth = width;
m_bitmap.bmi.bmiHeader.biHeight = height;
m_bitmap.bmi.bmiHeader.biSizeImage = width*height;
m_hdc = ::CreateCompatibleDC(NULL);
m_hbm = ::CreateDIBSection(m_hdc,&m_bitmap.bmi,DIB_RGB_COLORS, &m_bitmap.data, NULL, 0);
m_oldhbm = (HBITMAP) ::SelectObject(m_hdc, m_hbm);
}
void CDIBSection8::m_SetupPalette()
{
int c;
unsigned char *pal = m_pal;
struct
{
LOGPALETTE logpal;
PALETTEENTRY palentries[255];
} palette;
palette.logpal.palVersion = 0x300;
palette.logpal.palNumEntries = 256;
for (c = 0; c < 256; c ++)
{
m_bitmap.bmi.bmiColors[c].rgbRed =
palette.logpal.palPalEntry[c].peRed = *pal++;
m_bitmap.bmi.bmiColors[c].rgbGreen =
palette.logpal.palPalEntry[c].peGreen = *pal++;
m_bitmap.bmi.bmiColors[c].rgbBlue =
palette.logpal.palPalEntry[c].peBlue = *pal++;
m_bitmap.bmi.bmiColors[c].rgbReserved = 0;
palette.logpal.palPalEntry[c].peFlags = 0;
}
if (m_hpal) ::DeleteObject(m_hpal);
m_hpal = ::CreatePalette((LOGPALETTE *)&palette.logpal);
HDC dc = ::GetDC(NULL);
::SelectPalette(dc,m_hpal,FALSE);
::RealizePalette(dc);
::UpdateColors(dc);
::ReleaseDC(NULL,dc);
}
void CDIBSection8::SetPalette(unsigned char *pal)
{
HWND hwnd = m_hwndParent;
RECT r = m_rect;
::memcpy(m_pal,pal,sizeof(m_pal));
m_SetupPalette();
::DeleteObject(SelectObject(m_hdc, m_oldhbm));
m_hbm = ::CreateDIBSection(m_hdc,&m_bitmap.bmi,DIB_RGB_COLORS, &m_bitmap.data, NULL, 0);
::SelectObject(m_hdc, m_hbm);
}
void CDIBSection8::m_PreRender(HDC hdc)
{
::SelectPalette(hdc,m_hpal,FALSE);
::RealizePalette(hdc);
}
/*
** 16BPP VERSION
*/
CDIBSection16::CDIBSection16(HWND hwnd,RECT *r)
{
RECT r2;
if (!r) ::GetClientRect(hwnd,&r2);
else r2 = *r;
m_Initialize(hwnd,&r2);
}
CDIBSection16::~CDIBSection16()
{
m_DeInitialize();
}
void CDIBSection16::m_Initialize(HWND hwndParent, RECT *r)
{
m_rect = *r;
int width = m_rect.right-m_rect.left;
int height = m_rect.bottom-m_rect.top;
if (width & 3) width += 3;
width &= ~3;
m_hwndParent = hwndParent;
m_bitmap.bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_bitmap.bmi.bmiHeader.biPlanes = 1;
m_bitmap.bmi.bmiHeader.biBitCount = 16;
m_bitmap.bmi.bmiHeader.biCompression = BI_BITFIELDS;
m_bitmap.bmi.bmiHeader.biSizeImage = 0;
m_bitmap.bmi.bmiHeader.biClrUsed = 0;
m_bitmap.bmi.bmiHeader.biClrImportant = 0;
m_bitmap.bmi.bmiHeader.biWidth = width;
m_bitmap.bmi.bmiHeader.biHeight = -height;
m_bitmap.bmi.bmiHeader.biSizeImage = 0;
unsigned int *a = (unsigned int *) m_bitmap.bmi.bmiColors;
a[0] = 0xF800;
a[1] = 0x7E0;
a[2] = 0x1f;
m_hdc = ::CreateCompatibleDC(NULL);
m_hbm = ::CreateDIBSection(m_hdc,&m_bitmap.bmi,DIB_RGB_COLORS, &m_bitmap.data, NULL, 0);
m_oldhbm = (HBITMAP) ::SelectObject(m_hdc, m_hbm);
m_SetupPalette();
}
void CDIBSection16::m_SetupPalette()
{
int c;
struct
{
LOGPALETTE logpal;
PALETTEENTRY palentries[255];
} palette;
palette.logpal.palVersion = 0x300;
palette.logpal.palNumEntries = 256;
for (c = 0; c < 256; c ++)
{
palette.logpal.palPalEntry[c].peRed = c;
palette.logpal.palPalEntry[c].peGreen = c;
palette.logpal.palPalEntry[c].peBlue = c;
palette.logpal.palPalEntry[c].peFlags = 0;
}
if (m_hpal) ::DeleteObject(m_hpal);
m_hpal = ::CreatePalette((LOGPALETTE *)&palette.logpal);
HDC dc = ::GetDC(NULL);
::SelectPalette(dc,m_hpal,FALSE);
::RealizePalette(dc);
::UpdateColors(dc);
::ReleaseDC(NULL,dc);
}
void CDIBSection16::m_DeInitialize()
{
if (m_hpal) ::DeleteObject(m_hpal);
m_hpal = 0;
CDIBSection::m_DeInitialize();
}
void CDIBSection16::m_PreRender(HDC hdc)
{
::SelectPalette(hdc,m_hpal,FALSE);
::RealizePalette(hdc);
}