Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

135 lines
3.3 KiB

#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;
}