stw_ext_pixelformat.c revision 906230d16e8950004cb5e1deed14c78f7d9f2817
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 28db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#include <windows.h> 29db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 30db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#include "pipe/p_compiler.h" 31db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#include "util/u_memory.h" 32906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell#include "stw_public.h" 33906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell#include "stw_pixelformat.h" 3466059cd3c95bf5eba7922a4a09c2596514e5e956Keith Whitwell#include "stw_arbpixelformat.h" 35db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 36db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 37db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_DRAW_TO_WINDOW_ARB 0x2001 38db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_DRAW_TO_BITMAP_ARB 0x2002 39db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_ACCELERATION_ARB 0x2003 40db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_NEED_PALETTE_ARB 0x2004 41db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 42db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 43db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_SWAP_METHOD_ARB 0x2007 44db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_NUMBER_OVERLAYS_ARB 0x2008 45db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 46db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_TRANSPARENT_ARB 0x200A 47db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 48db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 49db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 50db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A 51db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B 52db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_SHARE_DEPTH_ARB 0x200C 53db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_SHARE_STENCIL_ARB 0x200D 54db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_SHARE_ACCUM_ARB 0x200E 55db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_SUPPORT_GDI_ARB 0x200F 56db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_SUPPORT_OPENGL_ARB 0x2010 57db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_DOUBLE_BUFFER_ARB 0x2011 58db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_STEREO_ARB 0x2012 59db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_PIXEL_TYPE_ARB 0x2013 60db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_COLOR_BITS_ARB 0x2014 61db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_RED_BITS_ARB 0x2015 62db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_RED_SHIFT_ARB 0x2016 63db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_GREEN_BITS_ARB 0x2017 64db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_GREEN_SHIFT_ARB 0x2018 65db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_BLUE_BITS_ARB 0x2019 66db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_BLUE_SHIFT_ARB 0x201A 67db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_ALPHA_BITS_ARB 0x201B 68db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_ALPHA_SHIFT_ARB 0x201C 69db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_ACCUM_BITS_ARB 0x201D 70db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_ACCUM_RED_BITS_ARB 0x201E 71db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_ACCUM_GREEN_BITS_ARB 0x201F 72db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 73db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 74db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_DEPTH_BITS_ARB 0x2022 75db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_STENCIL_BITS_ARB 0x2023 76db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_AUX_BUFFERS_ARB 0x2024 77db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 78db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_NO_ACCELERATION_ARB 0x2025 79db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_GENERIC_ACCELERATION_ARB 0x2026 80db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_FULL_ACCELERATION_ARB 0x2027 81db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 82db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_SWAP_EXCHANGE_ARB 0x2028 83db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_SWAP_COPY_ARB 0x2029 84db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_SWAP_UNDEFINED_ARB 0x202A 85db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 86db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_TYPE_RGBA_ARB 0x202B 87db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#define WGL_TYPE_COLORINDEX_ARB 0x202C 88db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 8966059cd3c95bf5eba7922a4a09c2596514e5e956Keith Whitwell/* From arb_multisample: 9066059cd3c95bf5eba7922a4a09c2596514e5e956Keith Whitwell */ 9166059cd3c95bf5eba7922a4a09c2596514e5e956Keith Whitwell#define WGL_SAMPLE_BUFFERS_ARB 0x2041 9266059cd3c95bf5eba7922a4a09c2596514e5e956Keith Whitwell#define WGL_SAMPLES_ARB 0x2042 9366059cd3c95bf5eba7922a4a09c2596514e5e956Keith Whitwell 9466059cd3c95bf5eba7922a4a09c2596514e5e956Keith Whitwell 95db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecastatic boolean 96db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecaquery_attrib( 97db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int iPixelFormat, 98db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int iLayerPlane, 99db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int attrib, 100db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int *pvalue ) 101db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 102db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint count; 103db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint index; 104db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca const struct pixelformat_info *pf; 105db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 106db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca count = pixelformat_get_extended_count(); 107db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 108db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (attrib == WGL_NUMBER_PIXEL_FORMATS_ARB) { 109db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = (int) count; 110db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 111db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 112db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 113db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca index = (uint) iPixelFormat - 1; 114db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (index >= count) 115db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 116db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 117db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca pf = pixelformat_get_info( index ); 118db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 119db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca switch (attrib) { 120db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_DRAW_TO_WINDOW_ARB: 121db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = TRUE; 122db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 123db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 124db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_DRAW_TO_BITMAP_ARB: 125db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = FALSE; 126db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 127db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 128db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_NEED_PALETTE_ARB: 129db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = FALSE; 130db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 131db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 132db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_NEED_SYSTEM_PALETTE_ARB: 133db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = FALSE; 134db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 135db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 136db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SWAP_METHOD_ARB: 137db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (pf->flags & PF_FLAG_DOUBLEBUFFER) 138db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = WGL_SWAP_COPY_ARB; 139db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca else 140db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = WGL_SWAP_UNDEFINED_ARB; 141db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 142db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 143db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SWAP_LAYER_BUFFERS_ARB: 144db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = FALSE; 145db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 146db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 147db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_NUMBER_OVERLAYS_ARB: 148db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = 0; 149db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 150db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 151db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_NUMBER_UNDERLAYS_ARB: 152db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = 0; 153db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 154db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 155db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 156db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (iLayerPlane != 0) 157db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 158db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 159db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca switch (attrib) { 160db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ACCELERATION_ARB: 161db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = WGL_FULL_ACCELERATION_ARB; 162db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 163db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 164db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_TRANSPARENT_ARB: 165db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = FALSE; 166db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 167db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 168db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_TRANSPARENT_RED_VALUE_ARB: 169db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_TRANSPARENT_GREEN_VALUE_ARB: 170db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_TRANSPARENT_BLUE_VALUE_ARB: 171db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_TRANSPARENT_ALPHA_VALUE_ARB: 172db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_TRANSPARENT_INDEX_VALUE_ARB: 173db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 174db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 175db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SHARE_DEPTH_ARB: 176db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SHARE_STENCIL_ARB: 177db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SHARE_ACCUM_ARB: 178db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = TRUE; 179db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 180db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 181db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SUPPORT_GDI_ARB: 182db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = FALSE; 183db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 184db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 185db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SUPPORT_OPENGL_ARB: 186db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = TRUE; 187db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 188db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 189db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_DOUBLE_BUFFER_ARB: 190db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (pf->flags & PF_FLAG_DOUBLEBUFFER) 191db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = TRUE; 192db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca else 193db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = FALSE; 194db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 195db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 196db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_STEREO_ARB: 197db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = FALSE; 198db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 199db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 200db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_PIXEL_TYPE_ARB: 201db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = WGL_TYPE_RGBA_ARB; 202db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 203db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 204db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_COLOR_BITS_ARB: 205db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = (int) (pf->color.redbits + pf->color.greenbits + pf->color.bluebits); 206db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 207db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 208db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_RED_BITS_ARB: 209db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = (int) pf->color.redbits; 210db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 211db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 212db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_RED_SHIFT_ARB: 213db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = (int) pf->color.redshift; 214db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 215db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 216db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_GREEN_BITS_ARB: 217db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = (int) pf->color.greenbits; 218db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 219db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 220db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_GREEN_SHIFT_ARB: 221db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = (int) pf->color.greenshift; 222db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 223db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 224db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_BLUE_BITS_ARB: 225db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = (int) pf->color.bluebits; 226db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 227db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 228db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_BLUE_SHIFT_ARB: 229db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = (int) pf->color.blueshift; 230db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 231db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 232db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ALPHA_BITS_ARB: 233db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = (int) pf->alpha.alphabits; 234db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 235db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 236db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ALPHA_SHIFT_ARB: 237db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = (int) pf->alpha.alphashift; 238db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 239db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 240db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ACCUM_BITS_ARB: 241db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ACCUM_RED_BITS_ARB: 242db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ACCUM_GREEN_BITS_ARB: 243db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ACCUM_BLUE_BITS_ARB: 244db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_ACCUM_ALPHA_BITS_ARB: 245db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = 0; 246db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 247db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 248db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_DEPTH_BITS_ARB: 249db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = (int) pf->depth.depthbits; 250db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 251db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 252db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_STENCIL_BITS_ARB: 253db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = (int) pf->depth.stencilbits; 254db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 255db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 256db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_AUX_BUFFERS_ARB: 257db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = 0; 258db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 259db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 260db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SAMPLE_BUFFERS_ARB: 261db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (pf->flags & PF_FLAG_MULTISAMPLED) 26266059cd3c95bf5eba7922a4a09c2596514e5e956Keith Whitwell *pvalue = stw_query_sample_buffers(); 263db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca else 264db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = 0; 265db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 266db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 267db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca case WGL_SAMPLES_ARB: 268db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (pf->flags & PF_FLAG_MULTISAMPLED) 26966059cd3c95bf5eba7922a4a09c2596514e5e956Keith Whitwell *pvalue = stw_query_samples(); 270db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca else 271db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *pvalue = 0; 272db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 273db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 274db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca default: 275db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 276db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 277db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 278db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 279db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca} 280db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 281db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecastruct attrib_match_info 282db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 283db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int attribute; 284db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int weight; 285db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca BOOL exact; 286db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}; 287db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 288db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecastatic struct attrib_match_info attrib_match[] = { 289db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 290db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* WGL_ARB_pixel_format */ 291db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_DRAW_TO_WINDOW_ARB, 0, TRUE }, 292db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_DRAW_TO_BITMAP_ARB, 0, TRUE }, 293db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ACCELERATION_ARB, 0, TRUE }, 294db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_NEED_PALETTE_ARB, 0, TRUE }, 295db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_NEED_SYSTEM_PALETTE_ARB, 0, TRUE }, 296db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_SWAP_LAYER_BUFFERS_ARB, 0, TRUE }, 297db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_SWAP_METHOD_ARB, 0, TRUE }, 298db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_NUMBER_OVERLAYS_ARB, 4, FALSE }, 299db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_NUMBER_UNDERLAYS_ARB, 4, FALSE }, 300db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /*{ WGL_SHARE_DEPTH_ARB, 0, TRUE },*/ /* no overlays -- ignore */ 301db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /*{ WGL_SHARE_STENCIL_ARB, 0, TRUE },*/ /* no overlays -- ignore */ 302db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /*{ WGL_SHARE_ACCUM_ARB, 0, TRUE },*/ /* no overlays -- ignore */ 303db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_SUPPORT_GDI_ARB, 0, TRUE }, 304db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_SUPPORT_OPENGL_ARB, 0, TRUE }, 305db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_DOUBLE_BUFFER_ARB, 0, TRUE }, 306db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_STEREO_ARB, 0, TRUE }, 307db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_PIXEL_TYPE_ARB, 0, TRUE }, 308db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_COLOR_BITS_ARB, 1, FALSE }, 309db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_RED_BITS_ARB, 1, FALSE }, 310db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_GREEN_BITS_ARB, 1, FALSE }, 311db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_BLUE_BITS_ARB, 1, FALSE }, 312db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ALPHA_BITS_ARB, 1, FALSE }, 313db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ACCUM_BITS_ARB, 1, FALSE }, 314db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ACCUM_RED_BITS_ARB, 1, FALSE }, 315db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ACCUM_GREEN_BITS_ARB, 1, FALSE }, 316db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ACCUM_BLUE_BITS_ARB, 1, FALSE }, 317db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_ACCUM_ALPHA_BITS_ARB, 1, FALSE }, 318db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_DEPTH_BITS_ARB, 1, FALSE }, 319db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_STENCIL_BITS_ARB, 1, FALSE }, 320db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_AUX_BUFFERS_ARB, 2, FALSE }, 321db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 322db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* WGL_ARB_multisample */ 323db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_SAMPLE_BUFFERS_ARB, 2, FALSE }, 324db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca { WGL_SAMPLES_ARB, 2, FALSE } 325db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}; 326db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 327db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecastruct pixelformat_score 328db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 329db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int points; 330db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint index; 331db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}; 332db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 333db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecastatic BOOL 334db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecascore_pixelformats( 335db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca struct pixelformat_score *scores, 336db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint count, 337db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int attribute, 338db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int expected_value ) 339db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 340db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint i; 341db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca struct attrib_match_info *ami = NULL; 342db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint index; 343db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 344db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* Find out if a given attribute should be considered for score calculation. 345db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 346db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (i = 0; i < sizeof( attrib_match ) / sizeof( attrib_match[0] ); i++) { 347db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (attrib_match[i].attribute == attribute) { 348db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca ami = &attrib_match[i]; 349db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca break; 350db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 351db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 352db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (ami == NULL) 353db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 354db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 355db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* Iterate all pixelformats, query the requested attribute and calculate 356db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * score points. 357db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 358db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (index = 0; index < count; index++) { 359db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int actual_value; 360db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 361db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (!query_attrib( index + 1, 0, attribute, &actual_value )) 362db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 363db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 364db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (ami->exact) { 365db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* For an exact match criteria, if the actual and expected values differ, 366db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * the score is set to 0 points, effectively removing the pixelformat 367db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * from a list of matching pixelformats. 368db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 369db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (actual_value != expected_value) 370db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[index].points = 0; 371db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 372db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca else { 373db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* For a minimum match criteria, if the actual value is smaller than the expected 374db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * value, the pixelformat is rejected (score set to 0). However, if the actual 375db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * value is bigger, the pixelformat is given a penalty to favour pixelformats that 376db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * more closely match the expected values. 377db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 378db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (actual_value < expected_value) 379db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[index].points = 0; 380db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca else if (actual_value > expected_value) 381db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[index].points -= (actual_value - expected_value) * ami->weight; 382db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 383db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 384db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 385db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 386db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca} 387db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 388db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecaWINGDIAPI BOOL APIENTRY 389db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecawglChoosePixelFormatARB( 390db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca HDC hdc, 391db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca const int *piAttribIList, 392db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca const FLOAT *pfAttribFList, 393db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca UINT nMaxFormats, 394db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int *piFormats, 395db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca UINT *nNumFormats ) 396db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 397db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint count; 398db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca struct pixelformat_score *scores; 399db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint i; 400db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 401db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *nNumFormats = 0; 402db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 403db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* Allocate and initialize pixelformat score table -- better matches 404db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * have higher scores. Start with a high score and take out penalty 405db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * points for a mismatch when the match does not have to be exact. 406db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * Set a score to 0 if there is a mismatch for an exact match criteria. 407db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 408db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca count = pixelformat_get_extended_count(); 409db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores = (struct pixelformat_score *) MALLOC( count * sizeof( struct pixelformat_score ) ); 410db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (scores == NULL) 411db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 412db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (i = 0; i < count; i++) { 413db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[i].points = 0x7fffffff; 414db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[i].index = i; 415db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 416db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 417db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* Given the attribute list calculate a score for each pixelformat. 418db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 419db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (piAttribIList != NULL) { 420db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca while (*piAttribIList != 0) { 421db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (!score_pixelformats( scores, count, piAttribIList[0], piAttribIList[1] )) { 422db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca FREE( scores ); 423db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 424db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 425db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca piAttribIList += 2; 426db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 427db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 428db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (pfAttribFList != NULL) { 429db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca while (*pfAttribFList != 0) { 430db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (!score_pixelformats( scores, count, (int) pfAttribFList[0], (int) pfAttribFList[1] )) { 431db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca FREE( scores ); 432db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 433db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 434db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca pfAttribFList += 2; 435db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 436db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 437db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 438db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* Bubble-sort the resulting scores. Pixelformats with higher scores go first. 439db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * TODO: Find out if there are any patent issues with it. 440db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 441db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (count > 1) { 442db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca uint n = count; 443db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca boolean swapped; 444db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 445db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca do { 446db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca swapped = FALSE; 447db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (i = 1; i < n; i++) { 448db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (scores[i - 1].points < scores[i].points) { 449db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca struct pixelformat_score score = scores[i - 1]; 450db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 451db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[i - 1] = scores[i]; 452db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca scores[i] = score; 453db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca swapped = TRUE; 454db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 455db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 456db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca n--; 457db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 458db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca while (swapped); 459db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 460db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 461db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca /* Return a list of pixelformats that are the best match. 462db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * Reject pixelformats with non-positive scores. 463db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca */ 464db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (i = 0; i < count; i++) { 465db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (scores[i].points > 0) { 466db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (*nNumFormats < nMaxFormats) 467db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca piFormats[*nNumFormats] = scores[i].index + 1; 468db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca (*nNumFormats)++; 469db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 470db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 471db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 472db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca FREE( scores ); 473db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 474db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca} 475db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 476db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecaWINGDIAPI BOOL APIENTRY 477db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecawglGetPixelFormatAttribfvARB( 478db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca HDC hdc, 479db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int iPixelFormat, 480db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int iLayerPlane, 481db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca UINT nAttributes, 482db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca const int *piAttributes, 483db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca FLOAT *pfValues ) 484db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 485db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca UINT i; 486db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 487db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca (void) hdc; 488db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 489db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (i = 0; i < nAttributes; i++) { 490db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int value; 491db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 492db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (!query_attrib( iPixelFormat, iLayerPlane, piAttributes[i], &value )) 493db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 494db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca pfValues[i] = (FLOAT) value; 495db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 496db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 497db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 498db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca} 499db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 500db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecaWINGDIAPI BOOL APIENTRY 501db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecawglGetPixelFormatAttribivARB( 502db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca HDC hdc, 503db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int iPixelFormat, 504db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int iLayerPlane, 505db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca UINT nAttributes, 506db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca const int *piAttributes, 507db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca int *piValues ) 508db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{ 509db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca UINT i; 510db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 511db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca (void) hdc; 512db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 513db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca for (i = 0; i < nAttributes; i++) { 514db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca if (!query_attrib( iPixelFormat, iLayerPlane, piAttributes[i], &piValues[i] )) 515db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return FALSE; 516db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca } 517db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca 518db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca return TRUE; 519db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca} 520