Major check-in of changes for GL_EXT_framebuffer_object extension.
[mesa.git] / src / mesa / drivers / x11 / xm_line.c
1 /*
2 * Mesa 3-D graphics library
3 * Version: 6.3
4 *
5 * Copyright (C) 1999-2004 Brian Paul All Rights Reserved.
6 *
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:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
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.
23 */
24
25
26 /*
27 * This file contains "accelerated" point, line, and triangle functions.
28 * It should be fairly easy to write new special-purpose point, line or
29 * triangle functions and hook them into this module.
30 */
31
32
33 #include "glxheader.h"
34 #include "depth.h"
35 #include "macros.h"
36 #include "mtypes.h"
37 #include "xmesaP.h"
38
39 /* Internal swrast includes:
40 */
41 #include "swrast/s_depth.h"
42 #include "swrast/s_points.h"
43 #include "swrast/s_lines.h"
44 #include "swrast/s_context.h"
45
46
47 /**********************************************************************/
48 /*** Point rendering ***/
49 /**********************************************************************/
50
51
52 /*
53 * Render an array of points into a pixmap, any pixel format.
54 */
55 #if 000
56 /* XXX don't use this, it doesn't dither correctly */
57 static void draw_points_ANY_pixmap( GLcontext *ctx, const SWvertex *vert )
58 {
59 XMesaContext xmesa = XMESA_CONTEXT(ctx);
60 XMesaDisplay *dpy = xmesa->xm_visual->display;
61 XMesaDrawable buffer = xmesa->xm_buffer->buffer;
62 XMesaGC gc = xmesa->xm_buffer->gc;
63
64 if (xmesa->xm_visual->mesa_visual.RGBAflag) {
65 register int x, y;
66 const GLubyte *color = vert->color;
67 unsigned long pixel = xmesa_color_to_pixel( xmesa,
68 color[0], color[1],
69 color[2], color[3],
70 xmesa->pixelformat);
71 XMesaSetForeground( dpy, gc, pixel );
72 x = (GLint) vert->win[0];
73 y = YFLIP( xrb, (GLint) vert->win[1] );
74 XMesaDrawPoint( dpy, buffer, gc, x, y);
75 }
76 else {
77 /* Color index mode */
78 register int x, y;
79 XMesaSetForeground( dpy, gc, vert->index );
80 x = (GLint) vert->win[0];
81 y = YFLIP( xrb, (GLint) vert->win[1] );
82 XMesaDrawPoint( dpy, buffer, gc, x, y);
83 }
84 }
85 #endif
86
87
88 /* Override the swrast point-selection function. Try to use one of
89 * our internal point functions, otherwise fall back to the standard
90 * swrast functions.
91 */
92 void xmesa_choose_point( GLcontext *ctx )
93 {
94 #if 0
95 XMesaContext xmesa = XMESA_CONTEXT(ctx);
96 SWcontext *swrast = SWRAST_CONTEXT(ctx);
97
98 if (ctx->RenderMode == GL_RENDER
99 && ctx->Point.Size == 1.0F && !ctx->Point.SmoothFlag
100 && swrast->_RasterMask == 0
101 && !ctx->Texture._EnabledUnits
102 && xmesa->xm_buffer->buffer != XIMAGE) {
103 swrast->Point = draw_points_ANY_pixmap;
104 }
105 else {
106 _swrast_choose_point( ctx );
107 }
108 #else
109 _swrast_choose_point( ctx );
110 #endif
111 }
112
113
114
115 /**********************************************************************/
116 /*** Line rendering ***/
117 /**********************************************************************/
118
119
120 #define GET_XRB(XRB) struct xmesa_renderbuffer *XRB = \
121 (struct xmesa_renderbuffer *) ctx->DrawBuffer->_ColorDrawBuffers[0][0]
122
123
124 /*
125 * Draw a flat-shaded, PF_TRUECOLOR line into an XImage.
126 */
127 #define NAME flat_TRUECOLOR_line
128 #define SETUP_CODE \
129 XMesaContext xmesa = XMESA_CONTEXT(ctx); \
130 GET_XRB(xrb); \
131 const GLubyte *color = vert1->color; \
132 unsigned long pixel; \
133 PACK_TRUECOLOR( pixel, color[0], color[1], color[2] );
134 #define CLIP_HACK 1
135 #define PLOT(X,Y) XMesaPutPixel(xrb->ximage, X, YFLIP(xrb, Y), pixel );
136 #include "swrast/s_linetemp.h"
137
138
139
140 /*
141 * Draw a flat-shaded, PF_8A8B8G8R line into an XImage.
142 */
143 #define NAME flat_8A8B8G8R_line
144 #define SETUP_CODE \
145 GET_XRB(xrb); \
146 const GLubyte *color = vert1->color; \
147 GLuint pixel = PACK_8B8G8R( color[0], color[1], color[2] );
148 #define PIXEL_TYPE GLuint
149 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
150 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
151 #define CLIP_HACK 1
152 #define PLOT(X,Y) *pixelPtr = pixel;
153 #include "swrast/s_linetemp.h"
154
155
156
157 /*
158 * Draw a flat-shaded, PF_8A8R8G8B line into an XImage.
159 */
160 #define NAME flat_8A8R8G8B_line
161 #define SETUP_CODE \
162 GET_XRB(xrb); \
163 const GLubyte *color = vert1->color; \
164 GLuint pixel = PACK_8R8G8B( color[0], color[1], color[2] );
165 #define PIXEL_TYPE GLuint
166 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
167 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
168 #define CLIP_HACK 1
169 #define PLOT(X,Y) *pixelPtr = pixel;
170 #include "swrast/s_linetemp.h"
171
172
173
174 /*
175 * Draw a flat-shaded, PF_8R8G8B line into an XImage.
176 */
177 #define NAME flat_8R8G8B_line
178 #define SETUP_CODE \
179 GET_XRB(xrb); \
180 const GLubyte *color = vert1->color; \
181 GLuint pixel = PACK_8R8G8B( color[0], color[1], color[2] );
182 #define PIXEL_TYPE GLuint
183 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
184 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
185 #define CLIP_HACK 1
186 #define PLOT(X,Y) *pixelPtr = pixel;
187 #include "swrast/s_linetemp.h"
188
189
190
191 /*
192 * Draw a flat-shaded, PF_8R8G8B24 line into an XImage.
193 */
194 #define NAME flat_8R8G8B24_line
195 #define SETUP_CODE \
196 GET_XRB(xrb); \
197 const GLubyte *color = vert1->color;
198 #define PIXEL_TYPE bgr_t
199 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
200 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y)
201 #define CLIP_HACK 1
202 #define PLOT(X,Y) { \
203 pixelPtr->r = color[RCOMP]; \
204 pixelPtr->g = color[GCOMP]; \
205 pixelPtr->b = color[BCOMP]; \
206 }
207 #include "swrast/s_linetemp.h"
208
209
210
211 /*
212 * Draw a flat-shaded, PF_5R6G5B line into an XImage.
213 */
214 #define NAME flat_5R6G5B_line
215 #define SETUP_CODE \
216 GET_XRB(xrb); \
217 const GLubyte *color = vert1->color; \
218 GLushort pixel = PACK_5R6G5B( color[0], color[1], color[2] );
219 #define PIXEL_TYPE GLushort
220 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
221 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
222 #define CLIP_HACK 1
223 #define PLOT(X,Y) *pixelPtr = pixel;
224 #include "swrast/s_linetemp.h"
225
226
227
228 /*
229 * Draw a flat-shaded, PF_DITHER_5R6G5B line into an XImage.
230 */
231 #define NAME flat_DITHER_5R6G5B_line
232 #define SETUP_CODE \
233 GET_XRB(xrb); \
234 XMesaContext xmesa = XMESA_CONTEXT(ctx); \
235 const GLubyte *color = vert1->color;
236 #define PIXEL_TYPE GLushort
237 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
238 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
239 #define CLIP_HACK 1
240 #define PLOT(X,Y) PACK_TRUEDITHER( *pixelPtr, X, Y, color[0], color[1], color[2] );
241 #include "swrast/s_linetemp.h"
242
243
244
245
246 /*
247 * Draw a flat-shaded, PF_DITHER 8-bit line into an XImage.
248 */
249 #define NAME flat_DITHER8_line
250 #define SETUP_CODE \
251 GET_XRB(xrb); \
252 const GLubyte *color = vert1->color; \
253 GLint r = color[0], g = color[1], b = color[2]; \
254 DITHER_SETUP;
255 #define PIXEL_TYPE GLubyte
256 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
257 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y)
258 #define CLIP_HACK 1
259 #define PLOT(X,Y) *pixelPtr = DITHER(X,Y,r,g,b);
260 #include "swrast/s_linetemp.h"
261
262
263
264 /*
265 * Draw a flat-shaded, PF_LOOKUP 8-bit line into an XImage.
266 */
267 #define NAME flat_LOOKUP8_line
268 #define SETUP_CODE \
269 GET_XRB(xrb); \
270 const GLubyte *color = vert1->color; \
271 GLubyte pixel; \
272 LOOKUP_SETUP; \
273 pixel = (GLubyte) LOOKUP( color[0], color[1], color[2] );
274 #define PIXEL_TYPE GLubyte
275 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
276 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X,Y)
277 #define CLIP_HACK 1
278 #define PLOT(X,Y) *pixelPtr = pixel;
279 #include "swrast/s_linetemp.h"
280
281
282
283 /*
284 * Draw a flat-shaded, PF_HPCR line into an XImage.
285 */
286 #define NAME flat_HPCR_line
287 #define SETUP_CODE \
288 GET_XRB(xrb); \
289 XMesaContext xmesa = XMESA_CONTEXT(ctx); \
290 const GLubyte *color = vert1->color; \
291 GLint r = color[0], g = color[1], b = color[2];
292 #define PIXEL_TYPE GLubyte
293 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
294 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X,Y)
295 #define CLIP_HACK 1
296 #define PLOT(X,Y) *pixelPtr = (GLubyte) DITHER_HPCR(X,Y,r,g,b);
297 #include "swrast/s_linetemp.h"
298
299
300
301
302 /*
303 * Draw a flat-shaded, Z-less, PF_TRUECOLOR line into an XImage.
304 */
305 #define NAME flat_TRUECOLOR_z_line
306 #define SETUP_CODE \
307 GET_XRB(xrb); \
308 XMesaContext xmesa = XMESA_CONTEXT(ctx); \
309 const GLubyte *color = vert1->color; \
310 unsigned long pixel; \
311 PACK_TRUECOLOR( pixel, color[0], color[1], color[2] );
312 #define INTERP_Z 1
313 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
314 #define CLIP_HACK 1
315 #define PLOT(X,Y) \
316 if (Z < *zPtr) { \
317 *zPtr = Z; \
318 XMesaPutPixel(xrb->ximage, X, YFLIP(xrb, Y), pixel); \
319 }
320 #include "swrast/s_linetemp.h"
321
322
323
324 /*
325 * Draw a flat-shaded, Z-less, PF_8A8B8G8R line into an XImage.
326 */
327 #define NAME flat_8A8B8G8R_z_line
328 #define SETUP_CODE \
329 GET_XRB(xrb); \
330 const GLubyte *color = vert1->color; \
331 GLuint pixel = PACK_8B8G8R( color[0], color[1], color[2] );
332 #define INTERP_Z 1
333 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
334 #define PIXEL_TYPE GLuint
335 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
336 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X,Y)
337 #define CLIP_HACK 1
338 #define PLOT(X,Y) \
339 if (Z < *zPtr) { \
340 *zPtr = Z; \
341 *pixelPtr = pixel; \
342 }
343 #include "swrast/s_linetemp.h"
344
345
346
347 /*
348 * Draw a flat-shaded, Z-less, PF_8A8R8G8B line into an XImage.
349 */
350 #define NAME flat_8A8R8G8B_z_line
351 #define SETUP_CODE \
352 GET_XRB(xrb); \
353 const GLubyte *color = vert1->color; \
354 GLuint pixel = PACK_8R8G8B( color[0], color[1], color[2] );
355 #define INTERP_Z 1
356 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
357 #define PIXEL_TYPE GLuint
358 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
359 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X,Y)
360 #define CLIP_HACK 1
361 #define PLOT(X,Y) \
362 if (Z < *zPtr) { \
363 *zPtr = Z; \
364 *pixelPtr = pixel; \
365 }
366 #include "swrast/s_linetemp.h"
367
368
369
370 /*
371 * Draw a flat-shaded, Z-less, PF_8R8G8B line into an XImage.
372 */
373 #define NAME flat_8R8G8B_z_line
374 #define SETUP_CODE \
375 GET_XRB(xrb); \
376 const GLubyte *color = vert1->color; \
377 GLuint pixel = PACK_8R8G8B( color[0], color[1], color[2] );
378 #define INTERP_Z 1
379 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
380 #define PIXEL_TYPE GLuint
381 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
382 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X,Y)
383 #define CLIP_HACK 1
384 #define PLOT(X,Y) \
385 if (Z < *zPtr) { \
386 *zPtr = Z; \
387 *pixelPtr = pixel; \
388 }
389 #include "swrast/s_linetemp.h"
390
391
392
393 /*
394 * Draw a flat-shaded, Z-less, PF_8R8G8B24 line into an XImage.
395 */
396 #define NAME flat_8R8G8B24_z_line
397 #define SETUP_CODE \
398 GET_XRB(xrb); \
399 const GLubyte *color = vert1->color;
400 #define INTERP_Z 1
401 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
402 #define PIXEL_TYPE bgr_t
403 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
404 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X,Y)
405 #define CLIP_HACK 1
406 #define PLOT(X,Y) \
407 if (Z < *zPtr) { \
408 *zPtr = Z; \
409 pixelPtr->r = color[RCOMP]; \
410 pixelPtr->g = color[GCOMP]; \
411 pixelPtr->b = color[BCOMP]; \
412 }
413 #include "swrast/s_linetemp.h"
414
415
416
417 /*
418 * Draw a flat-shaded, Z-less, PF_5R6G5B line into an XImage.
419 */
420 #define NAME flat_5R6G5B_z_line
421 #define SETUP_CODE \
422 GET_XRB(xrb); \
423 const GLubyte *color = vert1->color; \
424 GLushort pixel = PACK_5R6G5B( color[0], color[1], color[2] );
425 #define INTERP_Z 1
426 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
427 #define PIXEL_TYPE GLushort
428 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
429 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X,Y)
430 #define CLIP_HACK 1
431 #define PLOT(X,Y) \
432 if (Z < *zPtr) { \
433 *zPtr = Z; \
434 *pixelPtr = pixel; \
435 }
436 #include "swrast/s_linetemp.h"
437
438
439
440 /*
441 * Draw a flat-shaded, Z-less, PF_DITHER_5R6G5B line into an XImage.
442 */
443 #define NAME flat_DITHER_5R6G5B_z_line
444 #define SETUP_CODE \
445 GET_XRB(xrb); \
446 XMesaContext xmesa = XMESA_CONTEXT(ctx); \
447 const GLubyte *color = vert1->color;
448 #define INTERP_Z 1
449 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
450 #define PIXEL_TYPE GLushort
451 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
452 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X,Y)
453 #define CLIP_HACK 1
454 #define PLOT(X,Y) \
455 if (Z < *zPtr) { \
456 *zPtr = Z; \
457 PACK_TRUEDITHER(*pixelPtr, X, Y, color[0], color[1], color[2]); \
458 }
459 #include "swrast/s_linetemp.h"
460
461
462
463 /*
464 * Draw a flat-shaded, Z-less, PF_DITHER 8-bit line into an XImage.
465 */
466 #define NAME flat_DITHER8_z_line
467 #define SETUP_CODE \
468 GET_XRB(xrb); \
469 const GLubyte *color = vert1->color; \
470 GLint r = color[0], g = color[1], b = color[2]; \
471 DITHER_SETUP;
472 #define INTERP_Z 1
473 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
474 #define PIXEL_TYPE GLubyte
475 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
476 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X,Y)
477 #define CLIP_HACK 1
478 #define PLOT(X,Y) \
479 if (Z < *zPtr) { \
480 *zPtr = Z; \
481 *pixelPtr = (GLubyte) DITHER( X, Y, r, g, b); \
482 }
483 #include "swrast/s_linetemp.h"
484
485
486
487 /*
488 * Draw a flat-shaded, Z-less, PF_LOOKUP 8-bit line into an XImage.
489 */
490 #define NAME flat_LOOKUP8_z_line
491 #define SETUP_CODE \
492 GET_XRB(xrb); \
493 const GLubyte *color = vert1->color; \
494 GLubyte pixel; \
495 LOOKUP_SETUP; \
496 pixel = (GLubyte) LOOKUP( color[0], color[1], color[2] );
497 #define INTERP_Z 1
498 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
499 #define PIXEL_TYPE GLubyte
500 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
501 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X,Y)
502 #define CLIP_HACK 1
503 #define PLOT(X,Y) \
504 if (Z < *zPtr) { \
505 *zPtr = Z; \
506 *pixelPtr = pixel; \
507 }
508 #include "swrast/s_linetemp.h"
509
510
511
512 /*
513 * Draw a flat-shaded, Z-less, PF_HPCR line into an XImage.
514 */
515 #define NAME flat_HPCR_z_line
516 #define SETUP_CODE \
517 GET_XRB(xrb); \
518 XMesaContext xmesa = XMESA_CONTEXT(ctx); \
519 const GLubyte *color = vert1->color; \
520 GLint r = color[0], g = color[1], b = color[2];
521 #define INTERP_Z 1
522 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
523 #define PIXEL_TYPE GLubyte
524 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
525 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X,Y)
526 #define CLIP_HACK 1
527 #define PLOT(X,Y) \
528 if (Z < *zPtr) { \
529 *zPtr = Z; \
530 *pixelPtr = (GLubyte) DITHER_HPCR( X, Y, r, g, b); \
531 }
532 #include "swrast/s_linetemp.h"
533
534
535
536 static swrast_line_func get_line_func( GLcontext *ctx )
537 {
538 XMesaContext xmesa = XMESA_CONTEXT(ctx);
539 SWcontext *swrast = SWRAST_CONTEXT(ctx);
540 int depth = GET_VISUAL_DEPTH(xmesa->xm_visual);
541 struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *)
542 ctx->DrawBuffer->_ColorDrawBuffers[0][0];
543
544 if ((ctx->DrawBuffer->_ColorDrawBufferMask[0]
545 & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT)) == 0)
546 return (swrast_line_func) NULL;
547 if (ctx->RenderMode != GL_RENDER) return (swrast_line_func) NULL;
548 if (ctx->Line.SmoothFlag) return (swrast_line_func) NULL;
549 if (ctx->Texture._EnabledUnits) return (swrast_line_func) NULL;
550 if (ctx->Light.ShadeModel != GL_FLAT) return (swrast_line_func) NULL;
551 if (ctx->Line.StippleFlag) return (swrast_line_func) NULL;
552 if (swrast->_RasterMask & MULTI_DRAW_BIT) return (swrast_line_func) NULL;
553
554 if (xrb->ximage
555 && swrast->_RasterMask==DEPTH_BIT
556 && ctx->Depth.Func==GL_LESS
557 && ctx->Depth.Mask==GL_TRUE
558 && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
559 && ctx->Line.Width==1.0F) {
560 switch (xmesa->pixelformat) {
561 case PF_Truecolor:
562 return flat_TRUECOLOR_z_line;
563 case PF_8A8B8G8R:
564 return flat_8A8B8G8R_z_line;
565 case PF_8A8R8G8B:
566 return flat_8A8R8G8B_z_line;
567 case PF_8R8G8B:
568 return flat_8R8G8B_z_line;
569 case PF_8R8G8B24:
570 return flat_8R8G8B24_z_line;
571 case PF_5R6G5B:
572 return flat_5R6G5B_z_line;
573 case PF_Dither_5R6G5B:
574 return flat_DITHER_5R6G5B_z_line;
575 case PF_Dither:
576 return (depth==8) ? flat_DITHER8_z_line : (swrast_line_func) NULL;
577 case PF_Lookup:
578 return (depth==8) ? flat_LOOKUP8_z_line : (swrast_line_func) NULL;
579 case PF_HPCR:
580 return flat_HPCR_z_line;
581 default:
582 return (swrast_line_func)NULL;
583 }
584 }
585 if (xrb->ximage
586 && swrast->_RasterMask==0
587 && ctx->Line.Width==1.0F) {
588 switch (xmesa->pixelformat) {
589 case PF_Truecolor:
590 return flat_TRUECOLOR_line;
591 case PF_8A8B8G8R:
592 return flat_8A8B8G8R_line;
593 case PF_8A8R8G8B:
594 return flat_8A8R8G8B_line;
595 case PF_8R8G8B:
596 return flat_8R8G8B_line;
597 case PF_8R8G8B24:
598 return flat_8R8G8B24_line;
599 case PF_5R6G5B:
600 return flat_5R6G5B_line;
601 case PF_Dither_5R6G5B:
602 return flat_DITHER_5R6G5B_line;
603 case PF_Dither:
604 return (depth==8) ? flat_DITHER8_line : (swrast_line_func) NULL;
605 case PF_Lookup:
606 return (depth==8) ? flat_LOOKUP8_line : (swrast_line_func) NULL;
607 case PF_HPCR:
608 return flat_HPCR_line;
609 default:
610 return (swrast_line_func)NULL;
611 }
612 }
613
614 return (swrast_line_func) NULL;
615 }
616
617 /* Override for the swrast line-selection function. Try to use one
618 * of our internal line functions, otherwise fall back to the
619 * standard swrast functions.
620 */
621 void xmesa_choose_line( GLcontext *ctx )
622 {
623 SWcontext *swrast = SWRAST_CONTEXT(ctx);
624
625 if (!(swrast->Line = get_line_func( ctx )))
626 _swrast_choose_line( ctx );
627 }