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