stw_ext_pixelformat.c revision 31aeac5bf91f3b1daacb1aa27505bfb25215da87
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"
45db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#include "util/u_memory.h"
4631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca#include "stw_device.h"
47906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell#include "stw_pixelformat.h"
4866059cd3c95bf5eba7922a4a09c2596514e5e956Keith Whitwell
4966059cd3c95bf5eba7922a4a09c2596514e5e956Keith Whitwell
50db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecastatic boolean
51d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonsecastw_query_attrib(
52db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int iPixelFormat,
53db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int iLayerPlane,
54db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int attrib,
55db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int *pvalue )
56db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{
57db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   uint count;
58db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   uint index;
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
68db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   index = (uint) iPixelFormat - 1;
69db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   if (index >= count)
70db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      return FALSE;
71db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
72e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   pfi = stw_pixelformat_get_info( index );
73db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
74db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   switch (attrib) {
75db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_DRAW_TO_WINDOW_ARB:
76e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.dwFlags & PFD_DRAW_TO_WINDOW ? TRUE : FALSE;
77db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      return TRUE;
78db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
79db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_DRAW_TO_BITMAP_ARB:
80e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.dwFlags & PFD_DRAW_TO_BITMAP ? TRUE : FALSE;
81db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      return TRUE;
82db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
83db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_NEED_PALETTE_ARB:
84e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.dwFlags & PFD_NEED_PALETTE ? TRUE : FALSE;
85db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      return TRUE;
86db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
87db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_NEED_SYSTEM_PALETTE_ARB:
88e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.dwFlags & PFD_NEED_SYSTEM_PALETTE ? TRUE : FALSE;
89db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      return TRUE;
90db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
91db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_SWAP_METHOD_ARB:
92e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.dwFlags & PFD_SWAP_COPY ? WGL_SWAP_COPY_ARB : WGL_SWAP_UNDEFINED_ARB;
93db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      return TRUE;
94db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
95db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_SWAP_LAYER_BUFFERS_ARB:
96db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      *pvalue = FALSE;
97db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      return TRUE;
98db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
99db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_NUMBER_OVERLAYS_ARB:
100db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      *pvalue = 0;
101db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      return TRUE;
102db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
103db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_NUMBER_UNDERLAYS_ARB:
104db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      *pvalue = 0;
105db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      return TRUE;
106db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   }
107db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
108db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   if (iLayerPlane != 0)
109db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      return FALSE;
110db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
111db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   switch (attrib) {
112db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_ACCELERATION_ARB:
113db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      *pvalue = WGL_FULL_ACCELERATION_ARB;
114db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
115db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
116db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_TRANSPARENT_ARB:
117db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      *pvalue = FALSE;
118db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
119db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
120db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_TRANSPARENT_RED_VALUE_ARB:
121db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_TRANSPARENT_GREEN_VALUE_ARB:
122db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_TRANSPARENT_BLUE_VALUE_ARB:
123db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_TRANSPARENT_ALPHA_VALUE_ARB:
124db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_TRANSPARENT_INDEX_VALUE_ARB:
125db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
126db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
127db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_SHARE_DEPTH_ARB:
128db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_SHARE_STENCIL_ARB:
129db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_SHARE_ACCUM_ARB:
130db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      *pvalue = TRUE;
131db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
132db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
133db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_SUPPORT_GDI_ARB:
134e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.dwFlags & PFD_SUPPORT_GDI ? TRUE : FALSE;
135db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
136db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
137db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_SUPPORT_OPENGL_ARB:
138e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.dwFlags & PFD_SUPPORT_OPENGL ? TRUE : FALSE;
139db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
140db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
141db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_DOUBLE_BUFFER_ARB:
142e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.dwFlags & PFD_DOUBLEBUFFER ? TRUE : FALSE;
143db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
144db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
145db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_STEREO_ARB:
146e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.dwFlags & PFD_STEREO ? TRUE : FALSE;
147db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
148db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
149db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_PIXEL_TYPE_ARB:
150e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      switch (pfi->pfd.iPixelType) {
151e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      case PFD_TYPE_RGBA:
152e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca         *pvalue = WGL_TYPE_RGBA_ARB;
153e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca         break;
154e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      case PFD_TYPE_COLORINDEX:
155e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca         *pvalue = WGL_TYPE_COLORINDEX_ARB;
156e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca         break;
157e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      default:
158e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca         return FALSE;
159e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      }
160db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
161db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
162db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_COLOR_BITS_ARB:
163e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cColorBits;
164db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
165db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
166db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_RED_BITS_ARB:
167e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cRedBits;
168db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
169db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
170db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_RED_SHIFT_ARB:
171e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cRedShift;
172db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
173db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
174db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_GREEN_BITS_ARB:
175e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cGreenBits;
176db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
177db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
178db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_GREEN_SHIFT_ARB:
179e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cGreenShift;
180db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
181db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
182db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_BLUE_BITS_ARB:
183e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cBlueBits;
184db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
185db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
186db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_BLUE_SHIFT_ARB:
187e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cBlueShift;
188db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
189db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
190db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_ALPHA_BITS_ARB:
191e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cAlphaBits;
192db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
193db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
194db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_ALPHA_SHIFT_ARB:
195e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cAlphaShift;
196db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
197db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
198db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_ACCUM_BITS_ARB:
199e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cAccumBits;
200e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      break;
201e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca
202db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_ACCUM_RED_BITS_ARB:
203e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cAccumRedBits;
204e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      break;
205e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca
206db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_ACCUM_GREEN_BITS_ARB:
207e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cAccumGreenBits;
208e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      break;
209e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca
210db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_ACCUM_BLUE_BITS_ARB:
211e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cAccumBlueBits;
212e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      break;
213e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca
214db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_ACCUM_ALPHA_BITS_ARB:
215e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cAccumAlphaBits;
216db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
217db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
218db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_DEPTH_BITS_ARB:
219e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cDepthBits;
220db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
221db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
222db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_STENCIL_BITS_ARB:
223e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cStencilBits;
224db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
225db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
226db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_AUX_BUFFERS_ARB:
227e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      *pvalue = pfi->pfd.cAuxBuffers;
228db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
229db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
230db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_SAMPLE_BUFFERS_ARB:
231192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu      *pvalue = 1;
232db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
233db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
234db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   case WGL_SAMPLES_ARB:
235192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu      *pvalue = pfi->stvis.samples;
236db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      break;
237db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
23831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
23931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   /* WGL_ARB_pbuffer */
24031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
24131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   case WGL_MAX_PBUFFER_WIDTH_ARB:
24231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   case WGL_MAX_PBUFFER_HEIGHT_ARB:
24331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      *pvalue = stw_dev->max_2d_length;
24431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      break;
24531aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
24631aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   case WGL_MAX_PBUFFER_PIXELS_ARB:
24731aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      *pvalue = stw_dev->max_2d_length * stw_dev->max_2d_length;
24831aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      break;
24931aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
25031aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca   case WGL_DRAW_TO_PBUFFER_ARB:
25131aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      *pvalue = 1;
25231aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca      break;
25331aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
25431aeac5bf91f3b1daacb1aa27505bfb25215da87José Fonseca
255db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   default:
256db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      return FALSE;
257db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   }
258db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
259db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   return TRUE;
260db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}
261db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
262db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecastruct attrib_match_info
263db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{
264db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int attribute;
265db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int weight;
266db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   BOOL exact;
267db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca};
268db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
2697e563200b88edd50e0bbd00ada27f3988146ee9cJosé Fonsecastatic const struct attrib_match_info attrib_match[] = {
270db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
271db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   /* WGL_ARB_pixel_format */
272db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_DRAW_TO_WINDOW_ARB,      0, TRUE },
273db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_DRAW_TO_BITMAP_ARB,      0, TRUE },
274db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_ACCELERATION_ARB,        0, TRUE },
275db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_NEED_PALETTE_ARB,        0, TRUE },
276db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_NEED_SYSTEM_PALETTE_ARB, 0, TRUE },
277db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_SWAP_LAYER_BUFFERS_ARB,  0, TRUE },
278db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_SWAP_METHOD_ARB,         0, TRUE },
279db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_NUMBER_OVERLAYS_ARB,     4, FALSE },
280db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_NUMBER_UNDERLAYS_ARB,    4, FALSE },
281db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   /*{ WGL_SHARE_DEPTH_ARB,         0, TRUE },*/     /* no overlays -- ignore */
282db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   /*{ WGL_SHARE_STENCIL_ARB,       0, TRUE },*/   /* no overlays -- ignore */
283db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   /*{ WGL_SHARE_ACCUM_ARB,         0, TRUE },*/     /* no overlays -- ignore */
284db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_SUPPORT_GDI_ARB,         0, TRUE },
285db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_SUPPORT_OPENGL_ARB,      0, TRUE },
286db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_DOUBLE_BUFFER_ARB,       0, TRUE },
287db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_STEREO_ARB,              0, TRUE },
288db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_PIXEL_TYPE_ARB,          0, TRUE },
289db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_COLOR_BITS_ARB,          1, FALSE },
290db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_RED_BITS_ARB,            1, FALSE },
291db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_GREEN_BITS_ARB,          1, FALSE },
292db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_BLUE_BITS_ARB,           1, FALSE },
293db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_ALPHA_BITS_ARB,          1, FALSE },
294db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_ACCUM_BITS_ARB,          1, FALSE },
295db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_ACCUM_RED_BITS_ARB,      1, FALSE },
296db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_ACCUM_GREEN_BITS_ARB,    1, FALSE },
297db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_ACCUM_BLUE_BITS_ARB,     1, FALSE },
298db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_ACCUM_ALPHA_BITS_ARB,    1, FALSE },
299db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_DEPTH_BITS_ARB,          1, FALSE },
300db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_STENCIL_BITS_ARB,        1, FALSE },
301db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_AUX_BUFFERS_ARB,         2, FALSE },
302db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
303db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   /* WGL_ARB_multisample */
304db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_SAMPLE_BUFFERS_ARB,      2, FALSE },
305db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   { WGL_SAMPLES_ARB,             2, FALSE }
306db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca};
307db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
30819068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonsecastruct stw_pixelformat_score
309db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{
310db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int points;
311db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   uint index;
312db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca};
313db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
314db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecastatic BOOL
315db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecascore_pixelformats(
31619068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonseca   struct stw_pixelformat_score *scores,
317db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   uint count,
318db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int attribute,
319db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int expected_value )
320db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{
321db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   uint i;
3227e563200b88edd50e0bbd00ada27f3988146ee9cJosé Fonseca   const struct attrib_match_info *ami = NULL;
323db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   uint index;
324db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
325db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   /* Find out if a given attribute should be considered for score calculation.
326db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca    */
327db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   for (i = 0; i < sizeof( attrib_match ) / sizeof( attrib_match[0] ); i++) {
328db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      if (attrib_match[i].attribute == attribute) {
329db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         ami = &attrib_match[i];
330db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         break;
331db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      }
332db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   }
333db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   if (ami == NULL)
334db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      return TRUE;
335db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
336db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   /* Iterate all pixelformats, query the requested attribute and calculate
337db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca    * score points.
338db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca    */
339db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   for (index = 0; index < count; index++) {
340db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      int actual_value;
341db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
342d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca      if (!stw_query_attrib( index + 1, 0, attribute, &actual_value ))
343db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         return FALSE;
344db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
345db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      if (ami->exact) {
346db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         /* For an exact match criteria, if the actual and expected values differ,
347db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca          * the score is set to 0 points, effectively removing the pixelformat
348db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca          * from a list of matching pixelformats.
349db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca          */
350db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         if (actual_value != expected_value)
351db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca            scores[index].points = 0;
352db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      }
353db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      else {
354db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         /* For a minimum match criteria, if the actual value is smaller than the expected
355db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca          * value, the pixelformat is rejected (score set to 0). However, if the actual
356db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca          * value is bigger, the pixelformat is given a penalty to favour pixelformats that
357db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca          * more closely match the expected values.
358db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca          */
359db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         if (actual_value < expected_value)
360db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca            scores[index].points = 0;
361db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         else if (actual_value > expected_value)
362db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca            scores[index].points -= (actual_value - expected_value) * ami->weight;
363db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      }
364db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   }
365db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
366db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   return TRUE;
367db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}
368db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
369db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecaWINGDIAPI BOOL APIENTRY
370db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecawglChoosePixelFormatARB(
371db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   HDC hdc,
372db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   const int *piAttribIList,
373db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   const FLOAT *pfAttribFList,
374db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   UINT nMaxFormats,
375db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int *piFormats,
376db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   UINT *nNumFormats )
377db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{
378db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   uint count;
37919068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonseca   struct stw_pixelformat_score *scores;
380db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   uint i;
381db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
382db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   *nNumFormats = 0;
383db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
384db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   /* Allocate and initialize pixelformat score table -- better matches
385db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca    * have higher scores. Start with a high score and take out penalty
386db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca    * points for a mismatch when the match does not have to be exact.
387db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca    * Set a score to 0 if there is a mismatch for an exact match criteria.
388db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca    */
38919068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonseca   count = stw_pixelformat_get_extended_count();
39019068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonseca   scores = (struct stw_pixelformat_score *) MALLOC( count * sizeof( struct stw_pixelformat_score ) );
391db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   if (scores == NULL)
392db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      return FALSE;
393db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   for (i = 0; i < count; i++) {
394db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      scores[i].points = 0x7fffffff;
395db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      scores[i].index = i;
396db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   }
397db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
398db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   /* Given the attribute list calculate a score for each pixelformat.
399db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca    */
400db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   if (piAttribIList != NULL) {
401db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      while (*piAttribIList != 0) {
402db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         if (!score_pixelformats( scores, count, piAttribIList[0], piAttribIList[1] )) {
403db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca            FREE( scores );
404db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca            return FALSE;
405db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         }
406db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         piAttribIList += 2;
407db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      }
408db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   }
409db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   if (pfAttribFList != NULL) {
410db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      while (*pfAttribFList != 0) {
411db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         if (!score_pixelformats( scores, count, (int) pfAttribFList[0], (int) pfAttribFList[1] )) {
412db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca            FREE( scores );
413db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca            return FALSE;
414db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         }
415db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         pfAttribFList += 2;
416db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      }
417db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   }
418db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
419db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   /* Bubble-sort the resulting scores. Pixelformats with higher scores go first.
420db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca    * TODO: Find out if there are any patent issues with it.
421db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca    */
422db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   if (count > 1) {
423db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      uint n = count;
424db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      boolean swapped;
425db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
426db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      do {
427db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         swapped = FALSE;
428db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         for (i = 1; i < n; i++) {
429db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca            if (scores[i - 1].points < scores[i].points) {
43019068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonseca               struct stw_pixelformat_score score = scores[i - 1];
431db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
432db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca               scores[i - 1] = scores[i];
433db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca               scores[i] = score;
434db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca               swapped = TRUE;
435db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca            }
436db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         }
437db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         n--;
438db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      }
439db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      while (swapped);
440db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   }
441db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
442db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   /* Return a list of pixelformats that are the best match.
443db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca    * Reject pixelformats with non-positive scores.
444db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca    */
445db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   for (i = 0; i < count; i++) {
446db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      if (scores[i].points > 0) {
447db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         if (*nNumFormats < nMaxFormats)
448db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca            piFormats[*nNumFormats] = scores[i].index + 1;
449db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         (*nNumFormats)++;
450db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      }
451db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   }
452db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
453db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   FREE( scores );
454db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   return TRUE;
455db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}
456db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
457db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecaWINGDIAPI BOOL APIENTRY
458db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecawglGetPixelFormatAttribfvARB(
459db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   HDC hdc,
460db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int iPixelFormat,
461db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int iLayerPlane,
462db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   UINT nAttributes,
463db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   const int *piAttributes,
464db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   FLOAT *pfValues )
465db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{
466db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   UINT i;
467db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
468db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   (void) hdc;
469db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
470db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   for (i = 0; i < nAttributes; i++) {
471db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      int value;
472db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
473d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca      if (!stw_query_attrib( iPixelFormat, iLayerPlane, piAttributes[i], &value ))
474db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         return FALSE;
475db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca      pfValues[i] = (FLOAT) value;
476db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   }
477db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
478db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   return TRUE;
479db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}
480db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
481db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecaWINGDIAPI BOOL APIENTRY
482db19578b52e7f3d6209568e2e0fa7a7107f42cd4José FonsecawglGetPixelFormatAttribivARB(
483db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   HDC hdc,
484db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int iPixelFormat,
485db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int iLayerPlane,
486db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   UINT nAttributes,
487db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   const int *piAttributes,
488db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   int *piValues )
489db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{
490db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   UINT i;
491db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
492db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   (void) hdc;
493db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
494db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   for (i = 0; i < nAttributes; i++) {
495d8ffccc80b5835ff458facbe84d0dd9cda754a30José Fonseca      if (!stw_query_attrib( iPixelFormat, iLayerPlane, piAttributes[i], &piValues[i] ))
496db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca         return FALSE;
497db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   }
498db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
499db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca   return TRUE;
500db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}
501