1db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca/************************************************************************** 2db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * 3db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * All Rights Reserved. 5db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * 6db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 7db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * copy of this software and associated documentation files (the 8db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * "Software"), to deal in the Software without restriction, including 9db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 10db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 11db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * permit persons to whom the Software is furnished to do so, subject to 12db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * the following conditions: 13db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * 14db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * The above copyright notice and this permission notice (including the 15db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * next paragraph) shall be included in all copies or substantial portions 16db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * of the Software. 17db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * 18db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * 26db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca **************************************************************************/ 27db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 28d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca/** 29d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca * @file 30d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca * 31d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca * WGL_ARB_pixel_format extension implementation. 32d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca * 33d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca * @sa http://www.opengl.org/registry/specs/ARB/wgl_pixel_format.txt 34d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca */ 35d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca 36d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca 37db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#include <windows.h> 38db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 39d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca#define WGL_WGLEXT_PROTOTYPES 40d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca 41d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca#include <GL/gl.h> 42d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca#include <GL/wglext.h> 43d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca 44db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#include "pipe/p_compiler.h" 459646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca#include "util/u_format.h" 46db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#include "util/u_memory.h" 4731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca#include "stw_device.h" 48906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell#include "stw_pixelformat.h" 4966059cd3c95bf5eba7922a4a09c2596514e5e956Keith Whitwell 5066059cd3c95bf5eba7922a4a09c2596514e5e956Keith Whitwell 51db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecastatic boolean 52d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonsecastw_query_attrib( 53db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int iPixelFormat, 54db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int iLayerPlane, 55db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int attrib, 56db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int *pvalue ) 57db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 58db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint count; 59e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca const struct stw_pixelformat_info *pfi; 60db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 6119068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonseca count = stw_pixelformat_get_extended_count(); 62db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 63db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (attrib == WGL_NUMBER_PIXEL_FORMATS_ARB) { 64db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = (int) count; 65db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 66db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 67db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 680cf554fa9b31dbac1890f496974392001e2df825José Fonseca pfi = stw_pixelformat_get_info( iPixelFormat ); 690cf554fa9b31dbac1890f496974392001e2df825José Fonseca if (!pfi) { 70db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 710cf554fa9b31dbac1890f496974392001e2df825José Fonseca } 72db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 73db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca switch (attrib) { 74db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_DRAW_TO_WINDOW_ARB: 75e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.dwFlags & PFD_DRAW_TO_WINDOW ? TRUE : FALSE; 76db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 77db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 78db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_DRAW_TO_BITMAP_ARB: 79e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.dwFlags & PFD_DRAW_TO_BITMAP ? TRUE : FALSE; 80db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 81db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 82db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_NEED_PALETTE_ARB: 83e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.dwFlags & PFD_NEED_PALETTE ? TRUE : FALSE; 84db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 85db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 86db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_NEED_SYSTEM_PALETTE_ARB: 87e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.dwFlags & PFD_NEED_SYSTEM_PALETTE ? TRUE : FALSE; 88db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 89db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 90db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SWAP_METHOD_ARB: 91e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.dwFlags & PFD_SWAP_COPY ? WGL_SWAP_COPY_ARB : WGL_SWAP_UNDEFINED_ARB; 92db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 93db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 94db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SWAP_LAYER_BUFFERS_ARB: 95db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = FALSE; 96db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 97db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 98db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_NUMBER_OVERLAYS_ARB: 99db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = 0; 100db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 101db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 102db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_NUMBER_UNDERLAYS_ARB: 103db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = 0; 104db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 105db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 106db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 107db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (iLayerPlane != 0) 108db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 109db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 110db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca switch (attrib) { 111db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ACCELERATION_ARB: 112db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = WGL_FULL_ACCELERATION_ARB; 113db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 114db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 115db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_TRANSPARENT_ARB: 116db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = FALSE; 117db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 118db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 119db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_TRANSPARENT_RED_VALUE_ARB: 120db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_TRANSPARENT_GREEN_VALUE_ARB: 121db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_TRANSPARENT_BLUE_VALUE_ARB: 122db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_TRANSPARENT_ALPHA_VALUE_ARB: 123db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_TRANSPARENT_INDEX_VALUE_ARB: 124db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 125db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 126db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SHARE_DEPTH_ARB: 127db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SHARE_STENCIL_ARB: 128db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SHARE_ACCUM_ARB: 129db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = TRUE; 130db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 131db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 132db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SUPPORT_GDI_ARB: 133e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.dwFlags & PFD_SUPPORT_GDI ? TRUE : FALSE; 134db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 135db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 136db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SUPPORT_OPENGL_ARB: 137e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.dwFlags & PFD_SUPPORT_OPENGL ? TRUE : FALSE; 138db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 139db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 140db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_DOUBLE_BUFFER_ARB: 141e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.dwFlags & PFD_DOUBLEBUFFER ? TRUE : FALSE; 142db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 143db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 144db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_STEREO_ARB: 145e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.dwFlags & PFD_STEREO ? TRUE : FALSE; 146db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 147db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 148db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_PIXEL_TYPE_ARB: 149e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca switch (pfi->pfd.iPixelType) { 150e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca case PFD_TYPE_RGBA: 1519646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca if (util_format_is_float(pfi->stvis.color_format)) { 1529646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca *pvalue = WGL_TYPE_RGBA_FLOAT_ARB; 1539646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca } 1549646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca else { 1559646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca *pvalue = WGL_TYPE_RGBA_ARB; 1569646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca } 157e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca break; 158e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca case PFD_TYPE_COLORINDEX: 159e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = WGL_TYPE_COLORINDEX_ARB; 160e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca break; 161e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca default: 162e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca return FALSE; 163e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca } 164db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 165db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 166db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_COLOR_BITS_ARB: 167e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cColorBits; 168db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 169db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 170db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_RED_BITS_ARB: 171e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cRedBits; 172db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 173db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 174db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_RED_SHIFT_ARB: 175e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cRedShift; 176db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 177db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 178db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_GREEN_BITS_ARB: 179e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cGreenBits; 180db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 181db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 182db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_GREEN_SHIFT_ARB: 183e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cGreenShift; 184db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 185db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 186db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_BLUE_BITS_ARB: 187e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cBlueBits; 188db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 189db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 190db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_BLUE_SHIFT_ARB: 191e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cBlueShift; 192db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 193db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 194db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ALPHA_BITS_ARB: 195e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cAlphaBits; 196db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 197db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 198db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ALPHA_SHIFT_ARB: 199e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cAlphaShift; 200db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 201db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 202db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ACCUM_BITS_ARB: 203e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cAccumBits; 204e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca break; 205e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca 206db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ACCUM_RED_BITS_ARB: 207e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cAccumRedBits; 208e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca break; 209e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca 210db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ACCUM_GREEN_BITS_ARB: 211e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cAccumGreenBits; 212e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca break; 213e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca 214db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ACCUM_BLUE_BITS_ARB: 215e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cAccumBlueBits; 216e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca break; 217e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca 218db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ACCUM_ALPHA_BITS_ARB: 219e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cAccumAlphaBits; 220db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 221db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 222db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_DEPTH_BITS_ARB: 223e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cDepthBits; 224db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 225db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 226db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_STENCIL_BITS_ARB: 227e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cStencilBits; 228db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 229db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 230db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_AUX_BUFFERS_ARB: 231e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca *pvalue = pfi->pfd.cAuxBuffers; 232db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 233db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 234db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SAMPLE_BUFFERS_ARB: 235192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu *pvalue = 1; 236db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 237db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 238db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SAMPLES_ARB: 239192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu *pvalue = pfi->stvis.samples; 240db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 241db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 24231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 24331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca /* WGL_ARB_pbuffer */ 24431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 24531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca case WGL_MAX_PBUFFER_WIDTH_ARB: 24631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca case WGL_MAX_PBUFFER_HEIGHT_ARB: 24731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca *pvalue = stw_dev->max_2d_length; 24831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca break; 24931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 25031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca case WGL_MAX_PBUFFER_PIXELS_ARB: 25131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca *pvalue = stw_dev->max_2d_length * stw_dev->max_2d_length; 25231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca break; 25331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 25431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca case WGL_DRAW_TO_PBUFFER_ARB: 25531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca *pvalue = 1; 25631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca break; 25731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 25831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca 259db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca default: 260db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 261db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 262db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 263db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 264db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca} 265db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 266db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecastruct attrib_match_info 267db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 268db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int attribute; 269db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int weight; 270db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca BOOL exact; 271db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}; 272db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 2737e563200b88edd50e0bbd00ada27f3988146ee9cJosé Fonsecastatic const struct attrib_match_info attrib_match[] = { 274db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 275db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* WGL_ARB_pixel_format */ 276db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_DRAW_TO_WINDOW_ARB, 0, TRUE }, 277db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_DRAW_TO_BITMAP_ARB, 0, TRUE }, 278db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ACCELERATION_ARB, 0, TRUE }, 279db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_NEED_PALETTE_ARB, 0, TRUE }, 280db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_NEED_SYSTEM_PALETTE_ARB, 0, TRUE }, 281db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_SWAP_LAYER_BUFFERS_ARB, 0, TRUE }, 282db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_SWAP_METHOD_ARB, 0, TRUE }, 283db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_NUMBER_OVERLAYS_ARB, 4, FALSE }, 284db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_NUMBER_UNDERLAYS_ARB, 4, FALSE }, 285db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /*{ WGL_SHARE_DEPTH_ARB, 0, TRUE },*/ /* no overlays -- ignore */ 286db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /*{ WGL_SHARE_STENCIL_ARB, 0, TRUE },*/ /* no overlays -- ignore */ 287db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /*{ WGL_SHARE_ACCUM_ARB, 0, TRUE },*/ /* no overlays -- ignore */ 288db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_SUPPORT_GDI_ARB, 0, TRUE }, 289db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_SUPPORT_OPENGL_ARB, 0, TRUE }, 290db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_DOUBLE_BUFFER_ARB, 0, TRUE }, 291db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_STEREO_ARB, 0, TRUE }, 292db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_PIXEL_TYPE_ARB, 0, TRUE }, 293db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_COLOR_BITS_ARB, 1, FALSE }, 294db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_RED_BITS_ARB, 1, FALSE }, 295db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_GREEN_BITS_ARB, 1, FALSE }, 296db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_BLUE_BITS_ARB, 1, FALSE }, 297db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ALPHA_BITS_ARB, 1, FALSE }, 298db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ACCUM_BITS_ARB, 1, FALSE }, 299db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ACCUM_RED_BITS_ARB, 1, FALSE }, 300db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ACCUM_GREEN_BITS_ARB, 1, FALSE }, 301db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ACCUM_BLUE_BITS_ARB, 1, FALSE }, 302db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ACCUM_ALPHA_BITS_ARB, 1, FALSE }, 303db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_DEPTH_BITS_ARB, 1, FALSE }, 304db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_STENCIL_BITS_ARB, 1, FALSE }, 305db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_AUX_BUFFERS_ARB, 2, FALSE }, 306db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 307db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* WGL_ARB_multisample */ 308db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_SAMPLE_BUFFERS_ARB, 2, FALSE }, 309db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_SAMPLES_ARB, 2, FALSE } 310db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}; 311db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 31219068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonsecastruct stw_pixelformat_score 313db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 314db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int points; 315db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint index; 316db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}; 317db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 318db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecastatic BOOL 319db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecascore_pixelformats( 32019068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonseca struct stw_pixelformat_score *scores, 321db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint count, 322db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int attribute, 323db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int expected_value ) 324db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 325db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint i; 3267e563200b88edd50e0bbd00ada27f3988146ee9cJosé Fonseca const struct attrib_match_info *ami = NULL; 327db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint index; 328db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 329db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* Find out if a given attribute should be considered for score calculation. 330db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 331db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (i = 0; i < sizeof( attrib_match ) / sizeof( attrib_match[0] ); i++) { 332db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (attrib_match[i].attribute == attribute) { 333db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca ami = &attrib_match[i]; 334db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 335db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 336db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 337db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (ami == NULL) 338db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 339db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 340db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* Iterate all pixelformats, query the requested attribute and calculate 341db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * score points. 342db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 343db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (index = 0; index < count; index++) { 344db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int actual_value; 345db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 346d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca if (!stw_query_attrib( index + 1, 0, attribute, &actual_value )) 347db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 348db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 349db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (ami->exact) { 350db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* For an exact match criteria, if the actual and expected values differ, 351db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * the score is set to 0 points, effectively removing the pixelformat 352db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * from a list of matching pixelformats. 353db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 354db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (actual_value != expected_value) 355db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[index].points = 0; 356db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 357db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca else { 358db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* For a minimum match criteria, if the actual value is smaller than the expected 359db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * value, the pixelformat is rejected (score set to 0). However, if the actual 360db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * value is bigger, the pixelformat is given a penalty to favour pixelformats that 361db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * more closely match the expected values. 362db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 363db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (actual_value < expected_value) 364db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[index].points = 0; 365db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca else if (actual_value > expected_value) 366db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[index].points -= (actual_value - expected_value) * ami->weight; 367db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 368db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 369db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 370db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 371db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca} 372db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 373db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecaWINGDIAPI BOOL APIENTRY 374db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecawglChoosePixelFormatARB( 375db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca HDC hdc, 376db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca const int *piAttribIList, 377db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca const FLOAT *pfAttribFList, 378db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca UINT nMaxFormats, 379db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int *piFormats, 380db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca UINT *nNumFormats ) 381db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 382db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint count; 38319068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonseca struct stw_pixelformat_score *scores; 384db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint i; 385db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 386db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *nNumFormats = 0; 387db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 388db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* Allocate and initialize pixelformat score table -- better matches 389db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * have higher scores. Start with a high score and take out penalty 390db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * points for a mismatch when the match does not have to be exact. 391db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * Set a score to 0 if there is a mismatch for an exact match criteria. 392db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 39319068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonseca count = stw_pixelformat_get_extended_count(); 39419068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonseca scores = (struct stw_pixelformat_score *) MALLOC( count * sizeof( struct stw_pixelformat_score ) ); 395db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (scores == NULL) 396db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 397db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (i = 0; i < count; i++) { 398db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[i].points = 0x7fffffff; 399db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[i].index = i; 400db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 401db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 402db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* Given the attribute list calculate a score for each pixelformat. 403db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 404db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (piAttribIList != NULL) { 405db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca while (*piAttribIList != 0) { 406db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (!score_pixelformats( scores, count, piAttribIList[0], piAttribIList[1] )) { 407db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca FREE( scores ); 408db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 409db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 410db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca piAttribIList += 2; 411db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 412db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 413db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (pfAttribFList != NULL) { 414db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca while (*pfAttribFList != 0) { 415db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (!score_pixelformats( scores, count, (int) pfAttribFList[0], (int) pfAttribFList[1] )) { 416db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca FREE( scores ); 417db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 418db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 419db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca pfAttribFList += 2; 420db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 421db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 422db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 423db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* Bubble-sort the resulting scores. Pixelformats with higher scores go first. 424db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * TODO: Find out if there are any patent issues with it. 425db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 426db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (count > 1) { 427db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint n = count; 428db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca boolean swapped; 429db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 430db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca do { 431db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca swapped = FALSE; 432db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (i = 1; i < n; i++) { 433db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (scores[i - 1].points < scores[i].points) { 43419068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonseca struct stw_pixelformat_score score = scores[i - 1]; 435db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 436db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[i - 1] = scores[i]; 437db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[i] = score; 438db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca swapped = TRUE; 439db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 440db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 441db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca n--; 442db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 443db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca while (swapped); 444db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 445db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 446db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* Return a list of pixelformats that are the best match. 447db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * Reject pixelformats with non-positive scores. 448db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 449db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (i = 0; i < count; i++) { 450db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (scores[i].points > 0) { 451db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (*nNumFormats < nMaxFormats) 452db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca piFormats[*nNumFormats] = scores[i].index + 1; 453db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca (*nNumFormats)++; 454db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 455db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 456db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 457db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca FREE( scores ); 458db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 459db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca} 460db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 461db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecaWINGDIAPI BOOL APIENTRY 462db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecawglGetPixelFormatAttribfvARB( 463db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca HDC hdc, 464db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int iPixelFormat, 465db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int iLayerPlane, 466db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca UINT nAttributes, 467db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca const int *piAttributes, 468db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca FLOAT *pfValues ) 469db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 470db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca UINT i; 471db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 472db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca (void) hdc; 473db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 474db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (i = 0; i < nAttributes; i++) { 475db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int value; 476db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 477d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca if (!stw_query_attrib( iPixelFormat, iLayerPlane, piAttributes[i], &value )) 478db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 479db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca pfValues[i] = (FLOAT) value; 480db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 481db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 482db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 483db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca} 484db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 485db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecaWINGDIAPI BOOL APIENTRY 486db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecawglGetPixelFormatAttribivARB( 487db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca HDC hdc, 488db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int iPixelFormat, 489db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int iLayerPlane, 490db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca UINT nAttributes, 491db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca const int *piAttributes, 492db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int *piValues ) 493db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 494db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca UINT i; 495db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 496db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca (void) hdc; 497db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 498db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (i = 0; i < nAttributes; i++) { 499d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca if (!stw_query_attrib( iPixelFormat, iLayerPlane, piAttributes[i], &piValues[i] )) 500db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 501db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 502db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 503db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 504db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca} 505