2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 * Modified version of swrast/s_spantemp.h for front-buffer rendering. The
28 * no-mask paths use a scratch row to avoid repeated calls to the loader.
30 * For the mask paths we always use an array of 4 elements of RB_TYPE. This is
31 * to satisfy the xorg loader requirement of an image pitch of 32 bits and
32 * should be ok for other loaders also.
36 #ifndef _SWRAST_SPANTEMP_ONCE
37 #define _SWRAST_SPANTEMP_ONCE
40 PUT_PIXEL( GLcontext
*glCtx
, GLint x
, GLint y
, GLubyte
*p
)
42 __DRIcontext
*ctx
= swrast_context(glCtx
);
43 __DRIdrawable
*draw
= swrast_drawable(glCtx
->DrawBuffer
);
45 __DRIscreen
*screen
= ctx
->driScreenPriv
;
47 screen
->swrast_loader
->putImage(draw
, __DRI_SWRAST_IMAGE_OP_DRAW
,
48 x
, y
, 1, 1, (char *)p
,
54 GET_PIXEL( GLcontext
*glCtx
, GLint x
, GLint y
, GLubyte
*p
)
56 __DRIcontext
*ctx
= swrast_context(glCtx
);
57 __DRIdrawable
*read
= swrast_drawable(glCtx
->ReadBuffer
);
59 __DRIscreen
*screen
= ctx
->driScreenPriv
;
61 screen
->swrast_loader
->getImage(read
, x
, y
, 1, 1, (char *)p
,
66 PUT_ROW( GLcontext
*glCtx
, GLint x
, GLint y
, GLuint n
, char *row
)
68 __DRIcontext
*ctx
= swrast_context(glCtx
);
69 __DRIdrawable
*draw
= swrast_drawable(glCtx
->DrawBuffer
);
71 __DRIscreen
*screen
= ctx
->driScreenPriv
;
73 screen
->swrast_loader
->putImage(draw
, __DRI_SWRAST_IMAGE_OP_DRAW
,
79 GET_ROW( GLcontext
*glCtx
, GLint x
, GLint y
, GLuint n
, char *row
)
81 __DRIcontext
*ctx
= swrast_context(glCtx
);
82 __DRIdrawable
*read
= swrast_drawable(glCtx
->ReadBuffer
);
84 __DRIscreen
*screen
= ctx
->driScreenPriv
;
86 screen
->swrast_loader
->getImage(read
, x
, y
, n
, 1, row
,
90 #endif /* _SWRAST_SPANTEMP_ONCE */
94 * Templates for the span/pixel-array write/read functions called via
95 * the gl_renderbuffer's GetRow, GetValues, PutRow, PutMonoRow, PutValues
96 * and PutMonoValues functions.
98 * Define the following macros before including this file:
99 * NAME(BASE) to generate the function name (i.e. add prefix or suffix)
100 * RB_TYPE the renderbuffer DataType
101 * CI_MODE if set, color index mode, else RGBA
102 * SPAN_VARS to declare any local variables
103 * INIT_PIXEL_PTR(P, X, Y) to initialize a pointer to a pixel
104 * INC_PIXEL_PTR(P) to increment a pixel pointer by one pixel
105 * STORE_PIXEL(DST, X, Y, VALUE) to store pixel values in buffer
106 * FETCH_PIXEL(DST, SRC) to fetch pixel values from buffer
108 * Note that in the STORE_PIXEL macros, we also pass in the (X,Y) coordinates
109 * for the pixels to be stored. This is useful when dithering and probably
117 #define RB_COMPONENTS 1
118 #elif !defined(RB_COMPONENTS)
119 #define RB_COMPONENTS 4
124 NAME(get_row
)( GLcontext
*ctx
, struct gl_renderbuffer
*rb
,
125 GLuint count
, GLint x
, GLint y
, void *values
)
131 RB_TYPE
*dest
= (RB_TYPE
*) values
;
133 RB_TYPE (*dest
)[RB_COMPONENTS
] = (RB_TYPE (*)[RB_COMPONENTS
]) values
;
136 char *row
= swrast_drawable(ctx
->ReadBuffer
)->row
;
137 INIT_PIXEL_PTR(pixel
, x
, y
);
138 GET_ROW( ctx
, x
, YFLIP(xrb
, y
), count
, row
);
139 for (i
= 0; i
< count
; i
++) {
140 FETCH_PIXEL(dest
[i
], pixel
);
141 INC_PIXEL_PTR(pixel
);
148 NAME(get_values
)( GLcontext
*ctx
, struct gl_renderbuffer
*rb
,
149 GLuint count
, const GLint x
[], const GLint y
[], void *values
)
155 RB_TYPE
*dest
= (RB_TYPE
*) values
;
157 RB_TYPE (*dest
)[RB_COMPONENTS
] = (RB_TYPE (*)[RB_COMPONENTS
]) values
;
160 for (i
= 0; i
< count
; i
++) {
162 GET_PIXEL(ctx
, x
[i
], YFLIP(xrb
, y
[i
]), pixel
);
163 FETCH_PIXEL(dest
[i
], pixel
);
170 NAME(put_row
)( GLcontext
*ctx
, struct gl_renderbuffer
*rb
,
171 GLuint count
, GLint x
, GLint y
,
172 const void *values
, const GLubyte mask
[] )
177 const RB_TYPE (*src
)[RB_COMPONENTS
] = (const RB_TYPE (*)[RB_COMPONENTS
]) values
;
180 for (i
= 0; i
< count
; i
++) {
183 STORE_PIXEL(pixel
, x
+ i
, y
, src
[i
]);
184 PUT_PIXEL(ctx
, x
+ i
, YFLIP(xrb
, y
), pixel
);
189 char *row
= swrast_drawable(ctx
->DrawBuffer
)->row
;
190 INIT_PIXEL_PTR(pixel
, x
, y
);
191 for (i
= 0; i
< count
; i
++) {
192 STORE_PIXEL(pixel
, x
+ i
, y
, src
[i
]);
193 INC_PIXEL_PTR(pixel
);
195 PUT_ROW( ctx
, x
, YFLIP(xrb
, y
), count
, row
);
201 #if !defined(CI_MODE)
203 NAME(put_row_rgb
)( GLcontext
*ctx
, struct gl_renderbuffer
*rb
,
204 GLuint count
, GLint x
, GLint y
,
205 const void *values
, const GLubyte mask
[] )
210 const RB_TYPE (*src
)[3] = (const RB_TYPE (*)[3]) values
;
213 for (i
= 0; i
< count
; i
++) {
216 #ifdef STORE_PIXEL_RGB
217 STORE_PIXEL_RGB(pixel
, x
+ i
, y
, src
[i
]);
219 STORE_PIXEL(pixel
, x
+ i
, y
, src
[i
]);
221 PUT_PIXEL(ctx
, x
+ i
, YFLIP(xrb
, y
), pixel
);
226 char *row
= swrast_drawable(ctx
->DrawBuffer
)->row
;
227 INIT_PIXEL_PTR(pixel
, x
, y
);
228 for (i
= 0; i
< count
; i
++) {
229 #ifdef STORE_PIXEL_RGB
230 STORE_PIXEL_RGB(pixel
, x
+ i
, y
, src
[i
]);
232 STORE_PIXEL(pixel
, x
+ i
, y
, src
[i
]);
234 INC_PIXEL_PTR(pixel
);
236 PUT_ROW( ctx
, x
, YFLIP(xrb
, y
), count
, row
);
244 NAME(put_mono_row
)( GLcontext
*ctx
, struct gl_renderbuffer
*rb
,
245 GLuint count
, GLint x
, GLint y
,
246 const void *value
, const GLubyte mask
[] )
251 const RB_TYPE
*src
= (const RB_TYPE
*) value
;
254 for (i
= 0; i
< count
; i
++) {
257 STORE_PIXEL(pixel
, x
+ i
, y
, src
);
258 PUT_PIXEL(ctx
, x
+ i
, YFLIP(xrb
, y
), pixel
);
263 char *row
= swrast_drawable(ctx
->DrawBuffer
)->row
;
264 INIT_PIXEL_PTR(pixel
, x
, y
);
265 for (i
= 0; i
< count
; i
++) {
266 STORE_PIXEL(pixel
, x
+ i
, y
, src
);
267 INC_PIXEL_PTR(pixel
);
269 PUT_ROW( ctx
, x
, YFLIP(xrb
, y
), count
, row
);
276 NAME(put_values
)( GLcontext
*ctx
, struct gl_renderbuffer
*rb
,
277 GLuint count
, const GLint x
[], const GLint y
[],
278 const void *values
, const GLubyte mask
[] )
283 const RB_TYPE (*src
)[RB_COMPONENTS
] = (const RB_TYPE (*)[RB_COMPONENTS
]) values
;
286 for (i
= 0; i
< count
; i
++) {
289 STORE_PIXEL(pixel
, x
[i
], y
[i
], src
[i
]);
290 PUT_PIXEL(ctx
, x
[i
], YFLIP(xrb
, y
[i
]), pixel
);
298 NAME(put_mono_values
)( GLcontext
*ctx
, struct gl_renderbuffer
*rb
,
299 GLuint count
, const GLint x
[], const GLint y
[],
300 const void *value
, const GLubyte mask
[] )
305 const RB_TYPE
*src
= (const RB_TYPE
*) value
;
308 for (i
= 0; i
< count
; i
++) {
311 STORE_PIXEL(pixel
, x
[i
], y
[i
], src
);
312 PUT_PIXEL(ctx
, x
[i
], YFLIP(xrb
, y
[i
]), pixel
);
324 #undef INIT_PIXEL_PTR
327 #undef STORE_PIXEL_RGB