// CGL-Pal.cpp : OpenGL palette support // // This is a part of the Active Template Library. // Copyright (C) 1996-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Active Template Library Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Active Template Library product. #include #include "util.h" #include "cgl.h" ///////////////////////////////////////////////////////////////////////////// // // RGBA Palette support code // unsigned char CGL::m_threeto8[8] = { 0, 0111>>1, 0222>>1, 0333>>1, 0444>>1, 0555>>1, 0666>>1, 0377 }; unsigned char CGL::m_twoto8[4] = { 0, 0x55, 0xaa, 0xff }; unsigned char CGL::m_oneto8[2] = { 0, 255 }; int CGL::m_defaultOverride[13] = { 0, 3, 24, 27, 64, 67, 88, 173, 181, 236, 247, 164, 91 }; PALETTEENTRY CGL::m_defaultPalEntry[20] = { { 0, 0, 0, 0 }, //0 { 0x80,0, 0, 0 }, { 0, 0x80,0, 0 }, { 0x80,0x80,0, 0 }, { 0, 0, 0x80, 0 }, { 0x80,0, 0x80, 0 }, { 0, 0x80,0x80, 0 }, { 0xC0,0xC0,0xC0, 0 }, //7 { 192, 220, 192, 0 }, //8 { 166, 202, 240, 0 }, { 255, 251, 240, 0 }, { 160, 160, 164, 0 }, //11 { 0x80,0x80,0x80, 0 }, //12 { 0xFF,0, 0, 0 }, { 0, 0xFF,0, 0 }, { 0xFF,0xFF,0, 0 }, { 0, 0, 0xFF, 0 }, { 0xFF,0, 0xFF, 0 }, { 0, 0xFF,0xFF, 0 }, { 0xFF,0xFF,0xFF, 0 } //19 }; ///////////////////////////////////////////////////////////////////////////// // Color Component From Index unsigned char CGL::ComponentFromIndex(int i, UINT nbits, UINT shift) { unsigned char val = (unsigned char) (i >> shift); switch (nbits) { case 1: val &= 0x1; return m_oneto8[val]; case 2: val &= 0x3; return m_twoto8[val]; case 3: val &= 0x7; return m_threeto8[val]; default: return 0; } } ///////////////////////////////////////////////////////////////////////////// // CreateRGBPalette BOOL CGL::CreatePalette() { // Check to see if we need a palette PIXELFORMATDESCRIPTOR pfd; int n = ::GetPixelFormat(m_hdc); ::DescribePixelFormat(m_hdc, n, sizeof(PIXELFORMATDESCRIPTOR), &pfd); // Palette needed for color index mode. BOOL bColorIndex = (pfd.iPixelType & PFD_TYPE_COLORINDEX); if (bColorIndex) { // Color index mode not supported. return FALSE; } // Palette needed for 8bpp DIBs. PFD_NEED_PALETTE is not set. BOOL b8bppDIB = (pfd.cColorBits == 8); if ( (pfd.dwFlags & PFD_NEED_PALETTE) || (b8bppDIB) || (bColorIndex)) { TRACE0("Creating palette\r\n"); // allocate a log pal and fill it with the color table info int iPalSize = sizeof(LOGPALETTE) + 256 * sizeof(PALETTEENTRY); LOGPALETTE* pPal = (LOGPALETTE*) malloc(iPalSize); memset(pPal, 0, iPalSize); if (!pPal) return FALSE; pPal->palVersion = 0x300; // Windows 3.0 pPal->palNumEntries = 256; // table size // Create RGB Palette ASSERT( pfd.cColorBits == 8); n = 1 << pfd.cColorBits; for (int i=0; ipalPalEntry[i].peRed = ComponentFromIndex(i, pfd.cRedBits, pfd.cRedShift); pPal->palPalEntry[i].peGreen = ComponentFromIndex(i, pfd.cGreenBits, pfd.cGreenShift); pPal->palPalEntry[i].peBlue = ComponentFromIndex(i, pfd.cBlueBits, pfd.cBlueShift); pPal->palPalEntry[i].peFlags = 0; } // Fix up color table with system colors. if ((pfd.cColorBits == 8) && (pfd.cRedBits == 3) && (pfd.cRedShift == 0) && (pfd.cGreenBits == 3) && (pfd.cGreenShift == 3) && (pfd.cBlueBits == 2) && (pfd.cBlueShift == 6) ) { for (int j = 1; j <= 12; j++) { pPal->palPalEntry[m_defaultOverride[j]] = m_defaultPalEntry[j]; } } // Delete any existing GDI palette if (m_hPal) ::DeleteObject(m_hPal); m_hPal = ::CreatePalette(pPal); free (pPal); if (m_hPal == NULL) return FALSE; // Select and Realize Palette return TRUE; } else return FALSE; }