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