|
|
// Copyright (C) Microsoft Corporation 1993-1997
#include "header.h"
#include "cpaldc.h"
CPalDC::CPalDC(HBITMAP hbmpSel, HPALETTE hpalSel) { ClearMemory(this, sizeof(CPalDC));
m_hdc = CreateCompatibleDC(NULL); ASSERT(m_hdc);
if (hpalSel) SelectPal(hpalSel);
m_hpal = hpalSel; m_hbmp = hbmpSel; if (m_hbmp) {
// Can fail if hbmp is selected into another DC
VERIFY((m_hbmpOld = (HBITMAP) SelectObject(m_hdc, m_hbmp))); } }
CPalDC::CPalDC(int type) { ClearMemory(this, sizeof(CPalDC)); switch (type) { case SCREEN_DC: m_hdc = CreateDC("DISPLAY", NULL, NULL, NULL); break;
case SCREEN_IC: m_hdc = CreateIC("DISPLAY", NULL, NULL, NULL); break;
default: ASSERT(type == SCREEN_DC); break; }
ASSERT(m_hdc); }
CPalDC::~CPalDC(void) { if (!m_hdc) return; if (m_hpalOld) SelectPalette(m_hdc, m_hpal, FALSE); if (m_hbmpOld) SelectObject(m_hdc, m_hbmpOld); DeleteDC(m_hdc); }
void CPalDC::SelectPal(HPALETTE hpalSel) { if (hpalSel) { if (m_hpalOld) // m_hpalOld is set once, and only once
SelectPalette(m_hdc, m_hpal, FALSE); else m_hpalOld = SelectPalette(m_hdc, m_hpal, FALSE);
RealizePalette(m_hdc); } else if (m_hpalOld) { SelectPalette(m_hdc, m_hpalOld, FALSE); m_hpalOld = NULL; } }
HPALETTE CPalDC::CreateBIPalette(HBITMAP hbmp) { PBITMAPINFO pbmi = (PBITMAPINFO) lcCalloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256); PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER) pbmi;
BITMAP bmp; GetObject(hbmp, sizeof(BITMAP), &bmp);
pbih->biPlanes = bmp.bmPlanes; pbih->biBitCount = bmp.bmBitsPixel; pbih->biWidth = bmp.bmWidth; pbih->biHeight = bmp.bmHeight; pbih->biSize = sizeof(BITMAPINFOHEADER); pbih->biCompression = BI_RGB;
if (!GetDIBits(m_hdc, hbmp, 0, 1, NULL, pbmi, DIB_RGB_COLORS)) return NULL;
HPALETTE hpal = ::CreateBIPalette(pbih); lcFree(pbmi); return hpal; }
// REVIEW: only works with 256-color bitmaps
#define PALVERSION 0x300
HPALETTE CreateBIPalette(PBITMAPINFOHEADER pbihd) { // Allocate for the logical palette structure
LOGPALETTE* pPal = (LOGPALETTE*) lcMalloc(sizeof(LOGPALETTE) + 256 * sizeof(PALETTEENTRY));
pPal->palNumEntries = 256; pPal->palVersion = PALVERSION;
/*
* Fill in the palette entries from the DIB color table and * create a logical color palette. */
RGBQUAD* pRgb = (RGBQUAD*)(((PBYTE) pbihd) + pbihd->biSize);
for (int i = 0; i < (int) 256; i++){ pPal->palPalEntry[i].peRed = pRgb[i].rgbRed; pPal->palPalEntry[i].peGreen = pRgb[i].rgbGreen; pPal->palPalEntry[i].peBlue = pRgb[i].rgbBlue; pPal->palPalEntry[i].peFlags = (BYTE) 0; } HPALETTE hpal = CreatePalette(pPal); lcFree(pPal);
return hpal; }
|