LONG APIENTRY DrvDescribePixelFormat( HDC hdc, INT iPixelFormat, ULONG cjpfd, PIXELFORMATDESCRIPTOR *ppfd ) { uint count; const struct stw_pixelformat_info *pfi; (void) hdc; if (!stw_dev) return 0; count = stw_pixelformat_get_count(); if (ppfd == NULL) return count; if (cjpfd != sizeof( PIXELFORMATDESCRIPTOR )) return 0; pfi = stw_pixelformat_get_info( iPixelFormat ); if (!pfi) { return 0; } memcpy(ppfd, &pfi->pfd, sizeof( PIXELFORMATDESCRIPTOR )); return count; }
/* Only used by the wgl code, but have it here to avoid exporting the * pixelformat.h functionality. */ int stw_pixelformat_choose( HDC hdc, CONST PIXELFORMATDESCRIPTOR *ppfd ) { uint count; uint index; uint bestindex; uint bestdelta; (void) hdc; count = stw_pixelformat_get_count(); bestindex = count; bestdelta = ~0U; for (index = 0; index < count; index++) { uint delta = 0; const struct stw_pixelformat_info *pfi = stw_pixelformat_get_info( index ); if (!(ppfd->dwFlags & PFD_DOUBLEBUFFER_DONTCARE) && !!(ppfd->dwFlags & PFD_DOUBLEBUFFER) != !!(pfi->pfd.dwFlags & PFD_DOUBLEBUFFER)) continue; /* FIXME: Take in account individual channel bits */ if (ppfd->cColorBits != pfi->pfd.cColorBits) delta += 8; if (ppfd->cDepthBits != pfi->pfd.cDepthBits) delta += 4; if (ppfd->cStencilBits != pfi->pfd.cStencilBits) delta += 2; if (ppfd->cAlphaBits != pfi->pfd.cAlphaBits) delta++; if (delta < bestdelta) { bestindex = index; bestdelta = delta; if (bestdelta == 0) break; } } if (bestindex == count) return 0; return bestindex + 1; }
BOOL APIENTRY DrvSetPixelFormat(HDC hdc, LONG iPixelFormat) { uint count; uint index; struct stw_framebuffer *fb; if (!stw_dev) return FALSE; index = (uint) iPixelFormat - 1; count = stw_pixelformat_get_count(); if (index >= count) return FALSE; fb = stw_framebuffer_from_hdc_locked(hdc); if (fb) { /* * SetPixelFormat must be called only once. However ignore * pbuffers, for which the framebuffer object is created first. */ boolean bPbuffer = fb->bPbuffer; stw_framebuffer_unlock( fb ); return bPbuffer; } fb = stw_framebuffer_create(hdc, iPixelFormat); if (!fb) { return FALSE; } stw_framebuffer_unlock( fb ); /* Some applications mistakenly use the undocumented wglSetPixelFormat * function instead of SetPixelFormat, so we call SetPixelFormat here to * avoid opengl32.dll's wglCreateContext to fail */ if (GetPixelFormat(hdc) == 0) { BOOL bRet = SetPixelFormat(hdc, iPixelFormat, NULL); if (!bRet) { debug_printf("SetPixelFormat failed\n"); } } return TRUE; }