136 lines
3.3 KiB
C++
136 lines
3.3 KiB
C++
|
#include <stdio.h>
|
||
|
#include <windows.h>
|
||
|
#include <GL/gl.h>
|
||
|
#include "stonehen.h"
|
||
|
#include "setpixel.h"
|
||
|
|
||
|
HPALETTE ghpalOld, ghPalette = (HPALETTE) 0;
|
||
|
|
||
|
unsigned char threeto8[8] = {
|
||
|
0, 0111>>1, 0222>>1, 0333>>1, 0444>>1, 0555>>1, 0666>>1, 0377
|
||
|
};
|
||
|
|
||
|
unsigned char twoto8[4] = {
|
||
|
0, 0x55, 0xaa, 0xff
|
||
|
};
|
||
|
|
||
|
unsigned char oneto8[2] = {
|
||
|
0, 255
|
||
|
};
|
||
|
|
||
|
unsigned char
|
||
|
ComponentFromIndex(UCHAR i, UINT nbits, UINT shift)
|
||
|
{
|
||
|
unsigned char val;
|
||
|
|
||
|
val = i >> shift;
|
||
|
switch (nbits) {
|
||
|
|
||
|
case 1:
|
||
|
val &= 0x1;
|
||
|
return oneto8[val];
|
||
|
|
||
|
case 2:
|
||
|
val &= 0x3;
|
||
|
return twoto8[val];
|
||
|
|
||
|
case 3:
|
||
|
val &= 0x7;
|
||
|
return threeto8[val];
|
||
|
|
||
|
default:
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CreateRGBPalette(HDC hdc)
|
||
|
{
|
||
|
PIXELFORMATDESCRIPTOR pfd, *ppfd;
|
||
|
LOGPALETTE *pPal;
|
||
|
int n, i;
|
||
|
|
||
|
ppfd = &pfd;
|
||
|
n = GetPixelFormat(hdc);
|
||
|
DescribePixelFormat(hdc, n, sizeof(PIXELFORMATDESCRIPTOR), ppfd);
|
||
|
|
||
|
if (ppfd->dwFlags & PFD_NEED_PALETTE) {
|
||
|
n = 1 << ppfd->cColorBits;
|
||
|
pPal = (PLOGPALETTE)LocalAlloc(LMEM_FIXED, sizeof(LOGPALETTE) +
|
||
|
n * sizeof(PALETTEENTRY));
|
||
|
pPal->palVersion = 0x300;
|
||
|
pPal->palNumEntries = n;
|
||
|
for (i=0; i<n; i++) {
|
||
|
pPal->palPalEntry[i].peRed =
|
||
|
ComponentFromIndex(i, ppfd->cRedBits, ppfd->cRedShift);
|
||
|
pPal->palPalEntry[i].peGreen =
|
||
|
ComponentFromIndex(i, ppfd->cGreenBits, ppfd->cGreenShift);
|
||
|
pPal->palPalEntry[i].peBlue =
|
||
|
ComponentFromIndex(i, ppfd->cBlueBits, ppfd->cBlueShift);
|
||
|
pPal->palPalEntry[i].peFlags = 0;
|
||
|
}
|
||
|
ghPalette = CreatePalette(pPal);
|
||
|
LocalFree(pPal);
|
||
|
|
||
|
ghpalOld = SelectPalette(hdc, ghPalette, FALSE);
|
||
|
n = RealizePalette(hdc);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL bSetupPixelFormat(HDC hdc)
|
||
|
{
|
||
|
PIXELFORMATDESCRIPTOR pfd, *ppfd;
|
||
|
int pixelformat;
|
||
|
|
||
|
ppfd = &pfd;
|
||
|
|
||
|
ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
|
||
|
ppfd->nVersion = 1;
|
||
|
ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
|
||
|
ppfd->dwLayerMask = PFD_MAIN_PLANE;
|
||
|
|
||
|
ppfd->iPixelType = PFD_TYPE_RGBA;
|
||
|
ppfd->cColorBits = 24;
|
||
|
|
||
|
ppfd->cDepthBits = 16; //GLX_DEPTH_SIZE
|
||
|
|
||
|
|
||
|
ppfd->cRedBits = 8; //GLX_RED_SIZE
|
||
|
ppfd->cRedShift = 0;
|
||
|
ppfd->cGreenBits = 8; //GLX_GREEN_SIZE
|
||
|
ppfd->cGreenShift = 8;
|
||
|
ppfd->cBlueBits = 8; //GLX_BLUE_SIZE
|
||
|
ppfd->cBlueShift = 16;
|
||
|
ppfd->cAlphaBits = 0;
|
||
|
ppfd->cAlphaShift = 0;
|
||
|
ppfd->cAccumBits = 0; //ACCUM NOT SUPPORTED
|
||
|
ppfd->cAccumRedBits = 0; //GLX_ACCUM_RED_SIZE
|
||
|
ppfd->cAccumGreenBits = 0; //GLX_ACCUM_GREEN_SIZE
|
||
|
ppfd->cAccumBlueBits = 0; //GLX_ACCUM_BLUE_SIZE
|
||
|
ppfd->cAccumAlphaBits = 0; //GLX_ACCUM_ALPHA_SIZE
|
||
|
|
||
|
ppfd->cStencilBits = 24; //GLX_STENCIL_SIZE
|
||
|
ppfd->cAuxBuffers = 0;
|
||
|
ppfd->bReserved = 0;
|
||
|
ppfd->dwVisibleMask =
|
||
|
ppfd->dwDamageMask = 0;
|
||
|
|
||
|
pixelformat = ChoosePixelFormat(hdc, ppfd);
|
||
|
|
||
|
if ( (pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0 )
|
||
|
{
|
||
|
MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
|
||
|
{
|
||
|
MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
CreateRGBPalette(hdc);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|