Subversion Repositories shark

Rev

Rev 55 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
55 pj 1
/* $Id: drawpix.c,v 1.1 2003-02-28 11:42:00 pj Exp $ */
2
 
3
/*
4
 * Mesa 3-D graphics library
5
 * Version:  4.1
6
 *
7
 * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
8
 *
9
 * Permission is hereby granted, free of charge, to any person obtaining a
10
 * copy of this software and associated documentation files (the "Software"),
11
 * to deal in the Software without restriction, including without limitation
12
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13
 * and/or sell copies of the Software, and to permit persons to whom the
14
 * Software is furnished to do so, subject to the following conditions:
15
 *
16
 * The above copyright notice and this permission notice shall be included
17
 * in all copies or substantial portions of the Software.
18
 *
19
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
 */
26
 
27
#include "glheader.h"
28
#include "imports.h"
29
#include "colormac.h"
30
#include "context.h"
31
#include "drawpix.h"
32
#include "feedback.h"
33
#include "macros.h"
34
#include "mmath.h"
35
#include "state.h"
36
#include "mtypes.h"
37
 
38
 
39
/*
40
 * Execute glDrawPixels
41
 */
42
void
43
_mesa_DrawPixels( GLsizei width, GLsizei height,
44
                  GLenum format, GLenum type, const GLvoid *pixels )
45
{
46
   GET_CURRENT_CONTEXT(ctx);
47
   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
48
 
49
   if (width < 0 || height < 0) {
50
      _mesa_error( ctx, GL_INVALID_VALUE, "glDrawPixels(width or height < 0" );
51
      return;
52
   }
53
 
54
   if (ctx->RenderMode==GL_RENDER) {
55
      GLint x, y;
56
      if (!pixels || !ctx->Current.RasterPosValid) {
57
         return;
58
      }
59
 
60
      if (ctx->NewState) {
61
         _mesa_update_state(ctx);
62
      }
63
 
64
      /* Round, to satisfy conformance tests (matches SGI's OpenGL) */
65
      x = IROUND(ctx->Current.RasterPos[0]);
66
      y = IROUND(ctx->Current.RasterPos[1]);
67
 
68
      ctx->OcclusionResult = GL_TRUE;
69
      ctx->Driver.DrawPixels(ctx, x, y, width, height, format, type,
70
                             &ctx->Unpack, pixels);
71
   }
72
   else if (ctx->RenderMode==GL_FEEDBACK) {
73
      /* Feedback the current raster pos info */
74
      if (ctx->Current.RasterPosValid) {
75
         FLUSH_CURRENT( ctx, 0 );
76
         FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_DRAW_PIXEL_TOKEN );
77
         _mesa_feedback_vertex( ctx,
78
                                ctx->Current.RasterPos,
79
                                ctx->Current.RasterColor,
80
                                ctx->Current.RasterIndex,
81
                                ctx->Current.RasterTexCoords[0] );
82
      }
83
   }
84
   else if (ctx->RenderMode==GL_SELECT) {
85
      if (ctx->Current.RasterPosValid) {
86
         _mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
87
      }
88
   }
89
}
90
 
91
 
92
 
93
void
94
_mesa_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height,
95
                  GLenum format, GLenum type, GLvoid *pixels )
96
{
97
   GET_CURRENT_CONTEXT(ctx);
98
   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
99
 
100
   if (width < 0 || height < 0) {
101
      _mesa_error( ctx, GL_INVALID_VALUE,
102
                   "glReadPixels(width=%d height=%d)", width, height );
103
      return;
104
   }
105
 
106
   if (!pixels) {
107
      _mesa_error( ctx, GL_INVALID_VALUE, "glReadPixels(pixels)" );
108
      return;
109
   }
110
 
111
   if (ctx->NewState)
112
      _mesa_update_state(ctx);
113
 
114
   ctx->Driver.ReadPixels(ctx, x, y, width, height,
115
                          format, type, &ctx->Pack, pixels);
116
}
117
 
118
 
119
 
120
void
121
_mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height,
122
                  GLenum type )
123
{
124
   GET_CURRENT_CONTEXT(ctx);
125
   GLint destx, desty;
126
   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
127
 
128
   if (width < 0 || height < 0) {
129
      _mesa_error( ctx, GL_INVALID_VALUE, "glCopyPixels(width or height < 0)" );
130
      return;
131
   }
132
 
133
   if (ctx->NewState) {
134
      _mesa_update_state(ctx);
135
   }
136
 
137
   if (ctx->RenderMode==GL_RENDER) {
138
      /* Destination of copy: */
139
      if (!ctx->Current.RasterPosValid) {
140
         return;
141
      }
142
 
143
      /* Round, to satisfy conformance tests (matches SGI's OpenGL) */
144
      destx = IROUND(ctx->Current.RasterPos[0]);
145
      desty = IROUND(ctx->Current.RasterPos[1]);
146
 
147
      ctx->OcclusionResult = GL_TRUE;
148
 
149
      ctx->Driver.CopyPixels( ctx, srcx, srcy, width, height, destx, desty,
150
                              type );
151
   }
152
   else if (ctx->RenderMode == GL_FEEDBACK) {
153
      if (ctx->Current.RasterPosValid) {
154
         FLUSH_CURRENT( ctx, 0 );
155
         FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_COPY_PIXEL_TOKEN );
156
         _mesa_feedback_vertex( ctx,
157
                                ctx->Current.RasterPos,
158
                                ctx->Current.RasterColor,
159
                                ctx->Current.RasterIndex,
160
                                ctx->Current.RasterTexCoords[0] );
161
      }
162
   }
163
   else if (ctx->RenderMode == GL_SELECT) {
164
      _mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
165
   }
166
}
167
 
168
 
169
 
170
void
171
_mesa_Bitmap( GLsizei width, GLsizei height,
172
              GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove,
173
              const GLubyte *bitmap )
174
{
175
   GET_CURRENT_CONTEXT(ctx);
176
   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
177
 
178
   if (width < 0 || height < 0) {
179
      _mesa_error( ctx, GL_INVALID_VALUE, "glBitmap(width or height < 0)" );
180
      return;
181
   }
182
 
183
   if (ctx->Current.RasterPosValid == GL_FALSE) {
184
      return;    /* do nothing */
185
   }
186
 
187
   if (ctx->RenderMode==GL_RENDER) {
188
      if (bitmap) {
189
         /* Truncate, to satisfy conformance tests (matches SGI's OpenGL). */
190
         GLint x = IFLOOR(ctx->Current.RasterPos[0] - xorig);
191
         GLint y = IFLOOR(ctx->Current.RasterPos[1] - yorig);
192
 
193
         if (ctx->NewState) {
194
            _mesa_update_state(ctx);
195
         }
196
 
197
         ctx->OcclusionResult = GL_TRUE;
198
         ctx->Driver.Bitmap( ctx, x, y, width, height, &ctx->Unpack, bitmap );
199
      }
200
   }
201
   else if (ctx->RenderMode==GL_FEEDBACK) {
202
      if (ctx->Current.RasterPosValid) {
203
         FLUSH_CURRENT(ctx, 0);
204
         FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_BITMAP_TOKEN );
205
         _mesa_feedback_vertex( ctx,
206
                                ctx->Current.RasterPos,
207
                                ctx->Current.RasterColor,
208
                                ctx->Current.RasterIndex,
209
                                ctx->Current.RasterTexCoords[0] );
210
      }
211
   }
212
   else if (ctx->RenderMode==GL_SELECT) {
213
      /* Bitmaps don't generate selection hits.  See appendix B of 1.1 spec. */
214
   }
215
 
216
   /* update raster position */
217
   ctx->Current.RasterPos[0] += xmove;
218
   ctx->Current.RasterPos[1] += ymove;
219
}
220
 
221
 
222
 
223
#if 0  /* experimental */
224
/*
225
 * Execute glDrawDepthPixelsMESA().  This function accepts both a color
226
 * image and depth (Z) image.  Rasterization produces fragments with
227
 * color and Z taken from these images.  This function is intended for
228
 * Z-compositing.  Normally, this operation requires two glDrawPixels
229
 * calls with stencil testing.
230
 */
231
void
232
_mesa_DrawDepthPixelsMESA( GLsizei width, GLsizei height,
233
                           GLenum colorFormat, GLenum colorType,
234
                           const GLvoid *colors,
235
                           GLenum depthType, const GLvoid *depths )
236
{
237
   GET_CURRENT_CONTEXT(ctx);
238
   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
239
 
240
   if (width < 0 || height < 0) {
241
      _mesa_error( ctx, GL_INVALID_VALUE,
242
                   "glDrawDepthPixelsMESA(width or height < 0" );
243
      return;
244
   }
245
 
246
   if (ctx->RenderMode==GL_RENDER) {
247
      GLint x, y;
248
      if (!colors || !depths || !ctx->Current.RasterPosValid) {
249
         return;
250
      }
251
 
252
      if (ctx->NewState) {
253
         _mesa_update_state(ctx);
254
      }
255
 
256
      /* Round, to satisfy conformance tests (matches SGI's OpenGL) */
257
      x = IROUND(ctx->Current.RasterPos[0]);
258
      y = IROUND(ctx->Current.RasterPos[1]);
259
 
260
      ctx->OcclusionResult = GL_TRUE;
261
      ctx->Driver.DrawDepthPixelsMESA(ctx, x, y, width, height,
262
                                      colorFormat, colorType, colors,
263
                                      depthType, depths, &ctx->Unpack);
264
   }
265
   else if (ctx->RenderMode==GL_FEEDBACK) {
266
      /* Feedback the current raster pos info */
267
      if (ctx->Current.RasterPosValid) {
268
         FLUSH_CURRENT( ctx, 0 );
269
         FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_DRAW_PIXEL_TOKEN );
270
         _mesa_feedback_vertex( ctx,
271
                                ctx->Current.RasterPos,
272
                                ctx->Current.RasterColor,
273
                                ctx->Current.RasterIndex,
274
                                ctx->Current.RasterTexCoords[0] );
275
      }
276
   }
277
   else if (ctx->RenderMode==GL_SELECT) {
278
      if (ctx->Current.RasterPosValid) {
279
         _mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
280
      }
281
   }
282
}
283
 
284
#endif