rastpos.c revision 848b8605
1848b8605Smrg/*
2848b8605Smrg * Mesa 3-D graphics library
3848b8605Smrg *
4848b8605Smrg * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
5848b8605Smrg *
6848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
7848b8605Smrg * copy of this software and associated documentation files (the "Software"),
8848b8605Smrg * to deal in the Software without restriction, including without limitation
9848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the
11848b8605Smrg * Software is furnished to do so, subject to the following conditions:
12848b8605Smrg *
13848b8605Smrg * The above copyright notice and this permission notice shall be included
14848b8605Smrg * in all copies or substantial portions of the Software.
15848b8605Smrg *
16848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20848b8605Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21848b8605Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22848b8605Smrg * OTHER DEALINGS IN THE SOFTWARE.
23848b8605Smrg */
24848b8605Smrg
25848b8605Smrg
26848b8605Smrg/**
27848b8605Smrg * \file rastpos.c
28848b8605Smrg * Raster position operations.
29848b8605Smrg */
30848b8605Smrg
31848b8605Smrg#include "glheader.h"
32848b8605Smrg#include "context.h"
33848b8605Smrg#include "feedback.h"
34848b8605Smrg#include "macros.h"
35848b8605Smrg#include "mtypes.h"
36848b8605Smrg#include "rastpos.h"
37848b8605Smrg#include "state.h"
38848b8605Smrg#include "main/dispatch.h"
39848b8605Smrg
40848b8605Smrg
41848b8605Smrg/**
42848b8605Smrg * Helper function for all the RasterPos functions.
43848b8605Smrg */
44848b8605Smrgstatic void
45848b8605Smrgrasterpos(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
46848b8605Smrg{
47848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
48848b8605Smrg   GLfloat p[4];
49848b8605Smrg
50848b8605Smrg   p[0] = x;
51848b8605Smrg   p[1] = y;
52848b8605Smrg   p[2] = z;
53848b8605Smrg   p[3] = w;
54848b8605Smrg
55848b8605Smrg   FLUSH_VERTICES(ctx, 0);
56848b8605Smrg   FLUSH_CURRENT(ctx, 0);
57848b8605Smrg
58848b8605Smrg   if (ctx->NewState)
59848b8605Smrg      _mesa_update_state( ctx );
60848b8605Smrg
61848b8605Smrg   ctx->Driver.RasterPos(ctx, p);
62848b8605Smrg}
63848b8605Smrg
64848b8605Smrg
65848b8605Smrgvoid GLAPIENTRY
66848b8605Smrg_mesa_RasterPos2d(GLdouble x, GLdouble y)
67848b8605Smrg{
68848b8605Smrg   rasterpos((GLfloat)x, (GLfloat)y, (GLfloat)0.0, (GLfloat)1.0);
69848b8605Smrg}
70848b8605Smrg
71848b8605Smrgvoid GLAPIENTRY
72848b8605Smrg_mesa_RasterPos2f(GLfloat x, GLfloat y)
73848b8605Smrg{
74848b8605Smrg   rasterpos(x, y, 0.0F, 1.0F);
75848b8605Smrg}
76848b8605Smrg
77848b8605Smrgvoid GLAPIENTRY
78848b8605Smrg_mesa_RasterPos2i(GLint x, GLint y)
79848b8605Smrg{
80848b8605Smrg   rasterpos((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
81848b8605Smrg}
82848b8605Smrg
83848b8605Smrgvoid GLAPIENTRY
84848b8605Smrg_mesa_RasterPos2s(GLshort x, GLshort y)
85848b8605Smrg{
86848b8605Smrg   rasterpos(x, y, 0.0F, 1.0F);
87848b8605Smrg}
88848b8605Smrg
89848b8605Smrgvoid GLAPIENTRY
90848b8605Smrg_mesa_RasterPos3d(GLdouble x, GLdouble y, GLdouble z)
91848b8605Smrg{
92848b8605Smrg   rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
93848b8605Smrg}
94848b8605Smrg
95848b8605Smrgvoid GLAPIENTRY
96848b8605Smrg_mesa_RasterPos3f(GLfloat x, GLfloat y, GLfloat z)
97848b8605Smrg{
98848b8605Smrg   rasterpos(x, y, z, 1.0F);
99848b8605Smrg}
100848b8605Smrg
101848b8605Smrgvoid GLAPIENTRY
102848b8605Smrg_mesa_RasterPos3i(GLint x, GLint y, GLint z)
103848b8605Smrg{
104848b8605Smrg   rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
105848b8605Smrg}
106848b8605Smrg
107848b8605Smrgvoid GLAPIENTRY
108848b8605Smrg_mesa_RasterPos3s(GLshort x, GLshort y, GLshort z)
109848b8605Smrg{
110848b8605Smrg   rasterpos(x, y, z, 1.0F);
111848b8605Smrg}
112848b8605Smrg
113848b8605Smrgvoid GLAPIENTRY
114848b8605Smrg_mesa_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
115848b8605Smrg{
116848b8605Smrg   rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
117848b8605Smrg}
118848b8605Smrg
119848b8605Smrgvoid GLAPIENTRY
120848b8605Smrg_mesa_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
121848b8605Smrg{
122848b8605Smrg   rasterpos(x, y, z, w);
123848b8605Smrg}
124848b8605Smrg
125848b8605Smrgvoid GLAPIENTRY
126848b8605Smrg_mesa_RasterPos4i(GLint x, GLint y, GLint z, GLint w)
127848b8605Smrg{
128848b8605Smrg   rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
129848b8605Smrg}
130848b8605Smrg
131848b8605Smrgvoid GLAPIENTRY
132848b8605Smrg_mesa_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
133848b8605Smrg{
134848b8605Smrg   rasterpos(x, y, z, w);
135848b8605Smrg}
136848b8605Smrg
137848b8605Smrgvoid GLAPIENTRY
138848b8605Smrg_mesa_RasterPos2dv(const GLdouble *v)
139848b8605Smrg{
140848b8605Smrg   rasterpos((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
141848b8605Smrg}
142848b8605Smrg
143848b8605Smrgvoid GLAPIENTRY
144848b8605Smrg_mesa_RasterPos2fv(const GLfloat *v)
145848b8605Smrg{
146848b8605Smrg   rasterpos(v[0], v[1], 0.0F, 1.0F);
147848b8605Smrg}
148848b8605Smrg
149848b8605Smrgvoid GLAPIENTRY
150848b8605Smrg_mesa_RasterPos2iv(const GLint *v)
151848b8605Smrg{
152848b8605Smrg   rasterpos((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
153848b8605Smrg}
154848b8605Smrg
155848b8605Smrgvoid GLAPIENTRY
156848b8605Smrg_mesa_RasterPos2sv(const GLshort *v)
157848b8605Smrg{
158848b8605Smrg   rasterpos(v[0], v[1], 0.0F, 1.0F);
159848b8605Smrg}
160848b8605Smrg
161848b8605Smrgvoid GLAPIENTRY
162848b8605Smrg_mesa_RasterPos3dv(const GLdouble *v)
163848b8605Smrg{
164848b8605Smrg   rasterpos((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
165848b8605Smrg}
166848b8605Smrg
167848b8605Smrgvoid GLAPIENTRY
168848b8605Smrg_mesa_RasterPos3fv(const GLfloat *v)
169848b8605Smrg{
170848b8605Smrg   rasterpos(v[0], v[1], v[2], 1.0F);
171848b8605Smrg}
172848b8605Smrg
173848b8605Smrgvoid GLAPIENTRY
174848b8605Smrg_mesa_RasterPos3iv(const GLint *v)
175848b8605Smrg{
176848b8605Smrg   rasterpos((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
177848b8605Smrg}
178848b8605Smrg
179848b8605Smrgvoid GLAPIENTRY
180848b8605Smrg_mesa_RasterPos3sv(const GLshort *v)
181848b8605Smrg{
182848b8605Smrg   rasterpos(v[0], v[1], v[2], 1.0F);
183848b8605Smrg}
184848b8605Smrg
185848b8605Smrgvoid GLAPIENTRY
186848b8605Smrg_mesa_RasterPos4dv(const GLdouble *v)
187848b8605Smrg{
188848b8605Smrg   rasterpos((GLfloat) v[0], (GLfloat) v[1],
189848b8605Smrg		     (GLfloat) v[2], (GLfloat) v[3]);
190848b8605Smrg}
191848b8605Smrg
192848b8605Smrgvoid GLAPIENTRY
193848b8605Smrg_mesa_RasterPos4fv(const GLfloat *v)
194848b8605Smrg{
195848b8605Smrg   rasterpos(v[0], v[1], v[2], v[3]);
196848b8605Smrg}
197848b8605Smrg
198848b8605Smrgvoid GLAPIENTRY
199848b8605Smrg_mesa_RasterPos4iv(const GLint *v)
200848b8605Smrg{
201848b8605Smrg   rasterpos((GLfloat) v[0], (GLfloat) v[1],
202848b8605Smrg		     (GLfloat) v[2], (GLfloat) v[3]);
203848b8605Smrg}
204848b8605Smrg
205848b8605Smrgvoid GLAPIENTRY
206848b8605Smrg_mesa_RasterPos4sv(const GLshort *v)
207848b8605Smrg{
208848b8605Smrg   rasterpos(v[0], v[1], v[2], v[3]);
209848b8605Smrg}
210848b8605Smrg
211848b8605Smrg
212848b8605Smrg/**********************************************************************/
213848b8605Smrg/***           GL_ARB_window_pos / GL_MESA_window_pos               ***/
214848b8605Smrg/**********************************************************************/
215848b8605Smrg
216848b8605Smrg
217848b8605Smrg/**
218848b8605Smrg * All glWindowPosMESA and glWindowPosARB commands call this function to
219848b8605Smrg * update the current raster position.
220848b8605Smrg */
221848b8605Smrgstatic void
222848b8605Smrgwindow_pos3f(GLfloat x, GLfloat y, GLfloat z)
223848b8605Smrg{
224848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
225848b8605Smrg   GLfloat z2;
226848b8605Smrg
227848b8605Smrg   FLUSH_VERTICES(ctx, 0);
228848b8605Smrg   FLUSH_CURRENT(ctx, 0);
229848b8605Smrg
230848b8605Smrg   z2 = CLAMP(z, 0.0F, 1.0F)
231848b8605Smrg      * (ctx->ViewportArray[0].Far - ctx->ViewportArray[0].Near)
232848b8605Smrg      + ctx->ViewportArray[0].Near;
233848b8605Smrg
234848b8605Smrg   /* set raster position */
235848b8605Smrg   ctx->Current.RasterPos[0] = x;
236848b8605Smrg   ctx->Current.RasterPos[1] = y;
237848b8605Smrg   ctx->Current.RasterPos[2] = z2;
238848b8605Smrg   ctx->Current.RasterPos[3] = 1.0F;
239848b8605Smrg
240848b8605Smrg   ctx->Current.RasterPosValid = GL_TRUE;
241848b8605Smrg
242848b8605Smrg   if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT)
243848b8605Smrg      ctx->Current.RasterDistance = ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
244848b8605Smrg   else
245848b8605Smrg      ctx->Current.RasterDistance = 0.0;
246848b8605Smrg
247848b8605Smrg   /* raster color = current color or index */
248848b8605Smrg   ctx->Current.RasterColor[0]
249848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][0], 0.0F, 1.0F);
250848b8605Smrg   ctx->Current.RasterColor[1]
251848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][1], 0.0F, 1.0F);
252848b8605Smrg   ctx->Current.RasterColor[2]
253848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][2], 0.0F, 1.0F);
254848b8605Smrg   ctx->Current.RasterColor[3]
255848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3], 0.0F, 1.0F);
256848b8605Smrg   ctx->Current.RasterSecondaryColor[0]
257848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][0], 0.0F, 1.0F);
258848b8605Smrg   ctx->Current.RasterSecondaryColor[1]
259848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][1], 0.0F, 1.0F);
260848b8605Smrg   ctx->Current.RasterSecondaryColor[2]
261848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][2], 0.0F, 1.0F);
262848b8605Smrg   ctx->Current.RasterSecondaryColor[3]
263848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][3], 0.0F, 1.0F);
264848b8605Smrg
265848b8605Smrg   /* raster texcoord = current texcoord */
266848b8605Smrg   {
267848b8605Smrg      GLuint texSet;
268848b8605Smrg      for (texSet = 0; texSet < ctx->Const.MaxTextureCoordUnits; texSet++) {
269848b8605Smrg         assert(texSet < Elements(ctx->Current.RasterTexCoords));
270848b8605Smrg         COPY_4FV( ctx->Current.RasterTexCoords[texSet],
271848b8605Smrg                  ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texSet] );
272848b8605Smrg      }
273848b8605Smrg   }
274848b8605Smrg
275848b8605Smrg   if (ctx->RenderMode==GL_SELECT) {
276848b8605Smrg      _mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
277848b8605Smrg   }
278848b8605Smrg}
279848b8605Smrg
280848b8605Smrg
281848b8605Smrg/* This is just to support the GL_MESA_window_pos version */
282848b8605Smrgstatic void
283848b8605Smrgwindow_pos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
284848b8605Smrg{
285848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
286848b8605Smrg   window_pos3f(x, y, z);
287848b8605Smrg   ctx->Current.RasterPos[3] = w;
288848b8605Smrg}
289848b8605Smrg
290848b8605Smrg
291848b8605Smrgvoid GLAPIENTRY
292848b8605Smrg_mesa_WindowPos2d(GLdouble x, GLdouble y)
293848b8605Smrg{
294848b8605Smrg   window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
295848b8605Smrg}
296848b8605Smrg
297848b8605Smrgvoid GLAPIENTRY
298848b8605Smrg_mesa_WindowPos2f(GLfloat x, GLfloat y)
299848b8605Smrg{
300848b8605Smrg   window_pos4f(x, y, 0.0F, 1.0F);
301848b8605Smrg}
302848b8605Smrg
303848b8605Smrgvoid GLAPIENTRY
304848b8605Smrg_mesa_WindowPos2i(GLint x, GLint y)
305848b8605Smrg{
306848b8605Smrg   window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
307848b8605Smrg}
308848b8605Smrg
309848b8605Smrgvoid GLAPIENTRY
310848b8605Smrg_mesa_WindowPos2s(GLshort x, GLshort y)
311848b8605Smrg{
312848b8605Smrg   window_pos4f(x, y, 0.0F, 1.0F);
313848b8605Smrg}
314848b8605Smrg
315848b8605Smrgvoid GLAPIENTRY
316848b8605Smrg_mesa_WindowPos3d(GLdouble x, GLdouble y, GLdouble z)
317848b8605Smrg{
318848b8605Smrg   window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
319848b8605Smrg}
320848b8605Smrg
321848b8605Smrgvoid GLAPIENTRY
322848b8605Smrg_mesa_WindowPos3f(GLfloat x, GLfloat y, GLfloat z)
323848b8605Smrg{
324848b8605Smrg   window_pos4f(x, y, z, 1.0F);
325848b8605Smrg}
326848b8605Smrg
327848b8605Smrgvoid GLAPIENTRY
328848b8605Smrg_mesa_WindowPos3i(GLint x, GLint y, GLint z)
329848b8605Smrg{
330848b8605Smrg   window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
331848b8605Smrg}
332848b8605Smrg
333848b8605Smrgvoid GLAPIENTRY
334848b8605Smrg_mesa_WindowPos3s(GLshort x, GLshort y, GLshort z)
335848b8605Smrg{
336848b8605Smrg   window_pos4f(x, y, z, 1.0F);
337848b8605Smrg}
338848b8605Smrg
339848b8605Smrgvoid GLAPIENTRY
340848b8605Smrg_mesa_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
341848b8605Smrg{
342848b8605Smrg   window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
343848b8605Smrg}
344848b8605Smrg
345848b8605Smrgvoid GLAPIENTRY
346848b8605Smrg_mesa_WindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
347848b8605Smrg{
348848b8605Smrg   window_pos4f(x, y, z, w);
349848b8605Smrg}
350848b8605Smrg
351848b8605Smrgvoid GLAPIENTRY
352848b8605Smrg_mesa_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w)
353848b8605Smrg{
354848b8605Smrg   window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
355848b8605Smrg}
356848b8605Smrg
357848b8605Smrgvoid GLAPIENTRY
358848b8605Smrg_mesa_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w)
359848b8605Smrg{
360848b8605Smrg   window_pos4f(x, y, z, w);
361848b8605Smrg}
362848b8605Smrg
363848b8605Smrgvoid GLAPIENTRY
364848b8605Smrg_mesa_WindowPos2dv(const GLdouble *v)
365848b8605Smrg{
366848b8605Smrg   window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
367848b8605Smrg}
368848b8605Smrg
369848b8605Smrgvoid GLAPIENTRY
370848b8605Smrg_mesa_WindowPos2fv(const GLfloat *v)
371848b8605Smrg{
372848b8605Smrg   window_pos4f(v[0], v[1], 0.0F, 1.0F);
373848b8605Smrg}
374848b8605Smrg
375848b8605Smrgvoid GLAPIENTRY
376848b8605Smrg_mesa_WindowPos2iv(const GLint *v)
377848b8605Smrg{
378848b8605Smrg   window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
379848b8605Smrg}
380848b8605Smrg
381848b8605Smrgvoid GLAPIENTRY
382848b8605Smrg_mesa_WindowPos2sv(const GLshort *v)
383848b8605Smrg{
384848b8605Smrg   window_pos4f(v[0], v[1], 0.0F, 1.0F);
385848b8605Smrg}
386848b8605Smrg
387848b8605Smrgvoid GLAPIENTRY
388848b8605Smrg_mesa_WindowPos3dv(const GLdouble *v)
389848b8605Smrg{
390848b8605Smrg   window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
391848b8605Smrg}
392848b8605Smrg
393848b8605Smrgvoid GLAPIENTRY
394848b8605Smrg_mesa_WindowPos3fv(const GLfloat *v)
395848b8605Smrg{
396848b8605Smrg   window_pos4f(v[0], v[1], v[2], 1.0);
397848b8605Smrg}
398848b8605Smrg
399848b8605Smrgvoid GLAPIENTRY
400848b8605Smrg_mesa_WindowPos3iv(const GLint *v)
401848b8605Smrg{
402848b8605Smrg   window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
403848b8605Smrg}
404848b8605Smrg
405848b8605Smrgvoid GLAPIENTRY
406848b8605Smrg_mesa_WindowPos3sv(const GLshort *v)
407848b8605Smrg{
408848b8605Smrg   window_pos4f(v[0], v[1], v[2], 1.0F);
409848b8605Smrg}
410848b8605Smrg
411848b8605Smrgvoid GLAPIENTRY
412848b8605Smrg_mesa_WindowPos4dvMESA(const GLdouble *v)
413848b8605Smrg{
414848b8605Smrg   window_pos4f((GLfloat) v[0], (GLfloat) v[1],
415848b8605Smrg			 (GLfloat) v[2], (GLfloat) v[3]);
416848b8605Smrg}
417848b8605Smrg
418848b8605Smrgvoid GLAPIENTRY
419848b8605Smrg_mesa_WindowPos4fvMESA(const GLfloat *v)
420848b8605Smrg{
421848b8605Smrg   window_pos4f(v[0], v[1], v[2], v[3]);
422848b8605Smrg}
423848b8605Smrg
424848b8605Smrgvoid GLAPIENTRY
425848b8605Smrg_mesa_WindowPos4ivMESA(const GLint *v)
426848b8605Smrg{
427848b8605Smrg   window_pos4f((GLfloat) v[0], (GLfloat) v[1],
428848b8605Smrg			 (GLfloat) v[2], (GLfloat) v[3]);
429848b8605Smrg}
430848b8605Smrg
431848b8605Smrgvoid GLAPIENTRY
432848b8605Smrg_mesa_WindowPos4svMESA(const GLshort *v)
433848b8605Smrg{
434848b8605Smrg   window_pos4f(v[0], v[1], v[2], v[3]);
435848b8605Smrg}
436848b8605Smrg
437848b8605Smrg
438848b8605Smrg#if 0
439848b8605Smrg
440848b8605Smrg/*
441848b8605Smrg * OpenGL implementation of glWindowPos*MESA()
442848b8605Smrg */
443848b8605Smrgvoid glWindowPos4fMESA( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
444848b8605Smrg{
445848b8605Smrg   GLfloat fx, fy;
446848b8605Smrg
447848b8605Smrg   /* Push current matrix mode and viewport attributes */
448848b8605Smrg   glPushAttrib( GL_TRANSFORM_BIT | GL_VIEWPORT_BIT );
449848b8605Smrg
450848b8605Smrg   /* Setup projection parameters */
451848b8605Smrg   glMatrixMode( GL_PROJECTION );
452848b8605Smrg   glPushMatrix();
453848b8605Smrg   glLoadIdentity();
454848b8605Smrg   glMatrixMode( GL_MODELVIEW );
455848b8605Smrg   glPushMatrix();
456848b8605Smrg   glLoadIdentity();
457848b8605Smrg
458848b8605Smrg   glDepthRange( z, z );
459848b8605Smrg   glViewport( (int) x - 1, (int) y - 1, 2, 2 );
460848b8605Smrg
461848b8605Smrg   /* set the raster (window) position */
462848b8605Smrg   fx = x - (int) x;
463848b8605Smrg   fy = y - (int) y;
464848b8605Smrg   glRasterPos4f( fx, fy, 0.0, w );
465848b8605Smrg
466848b8605Smrg   /* restore matrices, viewport and matrix mode */
467848b8605Smrg   glPopMatrix();
468848b8605Smrg   glMatrixMode( GL_PROJECTION );
469848b8605Smrg   glPopMatrix();
470848b8605Smrg
471848b8605Smrg   glPopAttrib();
472848b8605Smrg}
473848b8605Smrg
474848b8605Smrg#endif
475848b8605Smrg
476848b8605Smrg
477848b8605Smrg/**********************************************************************/
478848b8605Smrg/** \name Initialization                                              */
479848b8605Smrg/**********************************************************************/
480848b8605Smrg/*@{*/
481848b8605Smrg
482848b8605Smrg/**
483848b8605Smrg * Initialize the context current raster position information.
484848b8605Smrg *
485848b8605Smrg * \param ctx GL context.
486848b8605Smrg *
487848b8605Smrg * Initialize the current raster position information in
488848b8605Smrg * __struct gl_contextRec::Current, and adds the extension entry points to the
489848b8605Smrg * dispatcher.
490848b8605Smrg */
491848b8605Smrgvoid _mesa_init_rastpos( struct gl_context * ctx )
492848b8605Smrg{
493848b8605Smrg   int i;
494848b8605Smrg
495848b8605Smrg   ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
496848b8605Smrg   ctx->Current.RasterDistance = 0.0;
497848b8605Smrg   ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
498848b8605Smrg   ASSIGN_4V( ctx->Current.RasterSecondaryColor, 0.0, 0.0, 0.0, 1.0 );
499848b8605Smrg   for (i = 0; i < Elements(ctx->Current.RasterTexCoords); i++)
500848b8605Smrg      ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
501848b8605Smrg   ctx->Current.RasterPosValid = GL_TRUE;
502848b8605Smrg}
503848b8605Smrg
504848b8605Smrg/*@}*/
505