InitOpenGL.cpp
上传用户:lin85885
上传日期:2013-04-27
资源大小:796k
文件大小:3k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "InitOpenGL.h"
  3. static HPALETTE  ghpalOld, ghPalette;
  4. static unsigned char threeto8[8] = {
  5.     0, 0111>>1, 0222>>1, 0333>>1, 0444>>1, 0555>>1, 0666>>1, 0377
  6. };
  7. static unsigned char twoto8[4] = {
  8.     0, 0x55, 0xaa, 0xff
  9. };
  10. static unsigned char oneto8[2] = {
  11.     0, 255
  12. };
  13. static int defaultOverride[13] = {
  14.     0, 3, 24, 27, 64, 67, 88, 173, 181, 236, 247, 164, 91
  15. };
  16. static PALETTEENTRY defaultPalEntry[20] = {
  17.     { 0,   0,   0,    0 },
  18.     { 0x80,0,   0,    0 },
  19.     { 0,   0x80,0,    0 },
  20.     { 0x80,0x80,0,    0 },
  21.     { 0,   0,   0x80, 0 },
  22.     { 0x80,0,   0x80, 0 },
  23.     { 0,   0x80,0x80, 0 },
  24.     { 0xC0,0xC0,0xC0, 0 },
  25.     { 192, 220, 192,  0 },
  26.     { 166, 202, 240,  0 },
  27.     { 255, 251, 240,  0 },
  28.     { 160, 160, 164,  0 },
  29.     { 0x80,0x80,0x80, 0 },
  30.     { 0xFF,0,   0,    0 },
  31.     { 0,   0xFF,0,    0 },
  32.     { 0xFF,0xFF,0,    0 },
  33.     { 0,   0,   0xFF, 0 },
  34.     { 0xFF,0,   0xFF, 0 },
  35.     { 0,   0xFF,0xFF, 0 },
  36.     { 0xFF,0xFF,0xFF, 0 }
  37. };
  38. char ComponentFromIndex(int i, UINT nbits, UINT shift)
  39. {
  40.     unsigned char val;
  41.     val = (unsigned char) (i >> shift);
  42.     switch (nbits) {
  43.     case 1:
  44.         val &= 0x1;
  45.         return oneto8[val];
  46.     case 2:
  47.         val &= 0x3;
  48.         return twoto8[val];
  49.     case 3:
  50.         val &= 0x7;
  51.         return threeto8[val];
  52.     default:
  53.         return 0;
  54.     }
  55. }
  56. void CreateRGBPalette(HDC hDC)
  57. {
  58.     PIXELFORMATDESCRIPTOR pfd;
  59.     LOGPALETTE *pPal;
  60.     int n, i;
  61.     n = GetPixelFormat(hDC);
  62.     DescribePixelFormat(hDC, n, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
  63.     if (pfd.dwFlags & PFD_NEED_PALETTE) {
  64.         n = 1 << pfd.cColorBits;
  65.         pPal = (PLOGPALETTE)LocalAlloc(LMEM_FIXED, sizeof(LOGPALETTE) +
  66.                 n * sizeof(PALETTEENTRY));
  67.         pPal->palVersion = 0x300;
  68.         pPal->palNumEntries = n;
  69.         for(i=0; i<n; i++) {
  70.             pPal->palPalEntry[i].peRed =
  71.                     ComponentFromIndex(i, pfd.cRedBits, pfd.cRedShift);
  72.             pPal->palPalEntry[i].peGreen =
  73.                     ComponentFromIndex(i, pfd.cGreenBits, pfd.cGreenShift);
  74.             pPal->palPalEntry[i].peBlue =
  75.                     ComponentFromIndex(i, pfd.cBlueBits, pfd.cBlueShift);
  76.             pPal->palPalEntry[i].peFlags = 0;
  77.         }
  78.         // fix up the palette to include the default GDI palette 
  79.         if ((pfd.cColorBits == 8)                           &&
  80.             (pfd.cRedBits   == 3) && (pfd.cRedShift   == 0) &&
  81.             (pfd.cGreenBits == 3) && (pfd.cGreenShift == 3) &&
  82.             (pfd.cBlueBits  == 2) && (pfd.cBlueShift  == 6)
  83.            ) {
  84.             for (i = 1 ; i <= 12 ; i++)
  85.                 pPal->palPalEntry[defaultOverride[i]] = defaultPalEntry[i];
  86.         }
  87.         ghPalette = CreatePalette(pPal);
  88.         LocalFree(pPal);
  89.         ghpalOld = SelectPalette(hDC, ghPalette, FALSE);
  90.         n = RealizePalette(hDC);
  91.     }
  92. }