automake: use install-lib-links.mk across all classic mesa
[mesa.git] / src / mesa / drivers / x11 / xm_line.c
index c76de401c888cc330ba027aef5540b1fd012ec38..00307c71f72ffb15c3cf16050ad5ec7d2ea20e02 100644 (file)
@@ -1,10 +1,7 @@
-/* $Id: xm_line.c,v 1.14 2001/01/02 22:02:52 brianp Exp $ */
-
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
  *
- * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
  */
 
 
 
 
 #include "glxheader.h"
-#include "depth.h"
-#include "macros.h"
-#include "mmath.h"
-#include "mtypes.h"
+#include "main/macros.h"
+#include "main/mtypes.h"
 #include "xmesaP.h"
 
 /* Internal swrast includes:
  */
 #if 000
 /* XXX don't use this, it doesn't dither correctly */
-static void draw_points_ANY_pixmap( GLcontext *ctx, const SWvertex *vert )
+static void draw_points_ANY_pixmap( struct gl_context *ctx, const SWvertex *vert )
 {
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
    XMesaDrawable buffer = xmesa->xm_buffer->buffer;
    XMesaGC gc = xmesa->xm_buffer->gc;
 
-   if (xmesa->xm_visual->gl_visual->RGBAflag) {
+   if (xmesa->xm_visual->mesa_visual.RGBAflag) {
       register int x, y;
       const GLubyte *color = vert->color;
       unsigned long pixel = xmesa_color_to_pixel( xmesa,
@@ -72,8 +68,8 @@ static void draw_points_ANY_pixmap( GLcontext *ctx, const SWvertex *vert )
                                                  color[2], color[3],
                                                  xmesa->pixelformat);
       XMesaSetForeground( dpy, gc, pixel );
-      x =                         (GLint) vert->win[0];
-      y = FLIP( xmesa->xm_buffer, (GLint) vert->win[1] );
+      x = (GLint) vert->win[0];
+      y = YFLIP( xrb, (GLint) vert->win[1] );
       XMesaDrawPoint( dpy, buffer, gc, x, y);
    }
    else {
@@ -81,7 +77,7 @@ static void draw_points_ANY_pixmap( GLcontext *ctx, const SWvertex *vert )
       register int x, y;
       XMesaSetForeground( dpy, gc, vert->index );
       x =                         (GLint) vert->win[0];
-      y = FLIP( xmesa->xm_buffer, (GLint) vert->win[1] );
+      y = YFLIP( xrb, (GLint) vert->win[1] );
       XMesaDrawPoint( dpy, buffer, gc, x, y);
    }
 }
@@ -92,16 +88,16 @@ static void draw_points_ANY_pixmap( GLcontext *ctx, const SWvertex *vert )
  * our internal point functions, otherwise fall back to the standard
  * swrast functions.
  */
-void xmesa_choose_point( GLcontext *ctx )
+void xmesa_choose_point( struct gl_context *ctx )
 {
 #if 0
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
    if (ctx->RenderMode == GL_RENDER
        && ctx->Point.Size == 1.0F && !ctx->Point.SmoothFlag
        && swrast->_RasterMask == 0
-       && !ctx->Texture._ReallyEnabled
+       && !ctx->Texture._EnabledUnits
        && xmesa->xm_buffer->buffer != XIMAGE) {
       swrast->Point = draw_points_ANY_pixmap;
    }
@@ -120,288 +116,237 @@ void xmesa_choose_point( GLcontext *ctx )
 /**********************************************************************/
 
 
+#if CHAN_BITS == 8
+
+
+#define GET_XRB(XRB)  struct xmesa_renderbuffer *XRB = \
+   xmesa_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0])
+
+
 /*
  * Draw a flat-shaded, PF_TRUECOLOR line into an XImage.
  */
-static void flat_TRUECOLOR_line( GLcontext *ctx,
-                                 const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-   XMesaImage *img = xmesa->xm_buffer->backimage;
-   unsigned long pixel;
+#define NAME flat_TRUECOLOR_line
+#define SETUP_CODE                                     \
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);            \
+   GET_XRB(xrb);                                       \
+   const GLubyte *color = vert1->color;                        \
+   unsigned long pixel;                                        \
    PACK_TRUECOLOR( pixel, color[0], color[1], color[2] );
-
-#define INTERP_XY 1
 #define CLIP_HACK 1
-#define PLOT(X,Y) XMesaPutPixel( img, X, FLIP(xmesa->xm_buffer, Y), pixel );
-
+#define PLOT(X,Y) XMesaPutPixel(xrb->ximage, X, YFLIP(xrb, Y), pixel );
 #include "swrast/s_linetemp.h"
-}
 
 
 
 /*
  * Draw a flat-shaded, PF_8A8B8G8R line into an XImage.
  */
-static void flat_8A8B8G8R_line( GLcontext *ctx,
-                                const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-   GLuint pixel = PACK_8B8G8R( color[0], color[1], color[2] );
-
+#define NAME flat_8A8B8G8R_line
+#define SETUP_CODE                                             \
+   GET_XRB(xrb);                                               \
+   const GLubyte *color = vert1->color;                                \
+   GLuint pixel = PACK_8A8B8G8R(color[0], color[1], color[2], color[3]);
 #define PIXEL_TYPE GLuint
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
+#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
+#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
 #define CLIP_HACK 1
 #define PLOT(X,Y) *pixelPtr = pixel;
+#include "swrast/s_linetemp.h"
+
 
+
+/*
+ * Draw a flat-shaded, PF_8A8R8G8B line into an XImage.
+ */
+#define NAME flat_8A8R8G8B_line
+#define SETUP_CODE                                             \
+   GET_XRB(xrb);                                               \
+   const GLubyte *color = vert1->color;                                \
+   GLuint pixel = PACK_8A8R8G8B(color[0], color[1], color[2], color[3]);
+#define PIXEL_TYPE GLuint
+#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
+#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
+#define CLIP_HACK 1
+#define PLOT(X,Y) *pixelPtr = pixel;
 #include "swrast/s_linetemp.h"
-}
+
 
 
 /*
  * Draw a flat-shaded, PF_8R8G8B line into an XImage.
  */
-static void flat_8R8G8B_line( GLcontext *ctx,
-                              const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
+#define NAME flat_8R8G8B_line
+#define SETUP_CODE                                             \
+   GET_XRB(xrb);                                               \
+   const GLubyte *color = vert1->color;                                \
    GLuint pixel = PACK_8R8G8B( color[0], color[1], color[2] );
-
 #define PIXEL_TYPE GLuint
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
+#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
+#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
 #define CLIP_HACK 1
 #define PLOT(X,Y) *pixelPtr = pixel;
-
 #include "swrast/s_linetemp.h"
-}
+
 
 
 /*
  * Draw a flat-shaded, PF_8R8G8B24 line into an XImage.
  */
-static void flat_8R8G8B24_line( GLcontext *ctx,
-                              const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-
+#define NAME flat_8R8G8B24_line
+#define SETUP_CODE                                             \
+   GET_XRB(xrb);                                               \
+   const GLubyte *color = vert1->color;
 #define PIXEL_TYPE bgr_t
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y)
+#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
+#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y)
 #define CLIP_HACK 1
 #define PLOT(X,Y) {                    \
       pixelPtr->r = color[RCOMP];      \
       pixelPtr->g = color[GCOMP];      \
       pixelPtr->b = color[BCOMP];      \
 }
-
 #include "swrast/s_linetemp.h"
-}
+
 
 
 /*
  * Draw a flat-shaded, PF_5R6G5B line into an XImage.
  */
-static void flat_5R6G5B_line( GLcontext *ctx,
-                              const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
+#define NAME flat_5R6G5B_line
+#define SETUP_CODE                                             \
+   GET_XRB(xrb);                                               \
+   const GLubyte *color = vert1->color;                                \
    GLushort pixel = PACK_5R6G5B( color[0], color[1], color[2] );
-
 #define PIXEL_TYPE GLushort
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
+#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
+#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
 #define CLIP_HACK 1
 #define PLOT(X,Y) *pixelPtr = pixel;
-
 #include "swrast/s_linetemp.h"
-}
+
 
 
 /*
  * Draw a flat-shaded, PF_DITHER_5R6G5B line into an XImage.
  */
-static void flat_DITHER_5R6G5B_line( GLcontext *ctx,
-                                     const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-
+#define NAME flat_DITHER_5R6G5B_line
+#define SETUP_CODE                                             \
+   GET_XRB(xrb);                                               \
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);                    \
+   const GLubyte *color = vert1->color;
 #define PIXEL_TYPE GLushort
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
+#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
+#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
 #define CLIP_HACK 1
 #define PLOT(X,Y) PACK_TRUEDITHER( *pixelPtr, X, Y, color[0], color[1], color[2] );
-
-#include "swrast/s_linetemp.h"
-}
-
-
-
-/*
- * Draw a flat-shaded, PF_DITHER 8-bit line into an XImage.
- */
-static void flat_DITHER8_line( GLcontext *ctx,
-                               const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-   GLint r = color[0], g = color[1], b = color[2];
-   DITHER_SETUP;
-
-#define INTERP_XY 1
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
-#define CLIP_HACK 1
-#define PLOT(X,Y) *pixelPtr = DITHER(X,Y,r,g,b);
-
 #include "swrast/s_linetemp.h"
-}
-
-
-/*
- * Draw a flat-shaded, PF_LOOKUP 8-bit line into an XImage.
- */
-static void flat_LOOKUP8_line( GLcontext *ctx,
-                               const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-   GLubyte pixel;
-   LOOKUP_SETUP;
-   pixel = (GLubyte) LOOKUP( color[0], color[1], color[2] );
-
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
-#define CLIP_HACK 1
-#define PLOT(X,Y) *pixelPtr = pixel;
-
-#include "swrast/s_linetemp.h"
-}
-
-
-/*
- * Draw a flat-shaded, PF_HPCR line into an XImage.
- */
-static void flat_HPCR_line( GLcontext *ctx,
-                            const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-   GLint r = color[0], g = color[1], b = color[2];
-
-#define INTERP_XY 1
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
-#define CLIP_HACK 1
-#define PLOT(X,Y) *pixelPtr = (GLubyte) DITHER_HPCR(X,Y,r,g,b);
-
-#include "swrast/s_linetemp.h"
-}
 
 
 
 /*
  * Draw a flat-shaded, Z-less, PF_TRUECOLOR line into an XImage.
  */
-static void flat_TRUECOLOR_z_line( GLcontext *ctx,
-                                   const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-   XMesaImage *img = xmesa->xm_buffer->backimage;
-   unsigned long pixel;
+#define NAME flat_TRUECOLOR_z_line
+#define SETUP_CODE                                             \
+   GET_XRB(xrb);                                               \
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);                    \
+   const GLubyte *color = vert1->color;                                \
+   unsigned long pixel;                                                \
    PACK_TRUECOLOR( pixel, color[0], color[1], color[2] );
-
-#define INTERP_XY 1
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
 #define CLIP_HACK 1
 #define PLOT(X,Y)                                                      \
        if (Z < *zPtr) {                                                \
           *zPtr = Z;                                                   \
-           XMesaPutPixel( img, X, FLIP(xmesa->xm_buffer, Y), pixel );  \
+           XMesaPutPixel(xrb->ximage, X, YFLIP(xrb, Y), pixel);                \
        }
-
 #include "swrast/s_linetemp.h"
-}
+
 
 
 /*
  * Draw a flat-shaded, Z-less, PF_8A8B8G8R line into an XImage.
  */
-static void flat_8A8B8G8R_z_line( GLcontext *ctx,
-                                  const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-   GLuint pixel = PACK_8B8G8R( color[0], color[1], color[2] );
-
+#define NAME flat_8A8B8G8R_z_line
+#define SETUP_CODE                                             \
+   GET_XRB(xrb);                                               \
+   const GLubyte *color = vert1->color;                                \
+   GLuint pixel = PACK_8A8B8G8R(color[0], color[1], color[2], color[3]);
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
 #define PIXEL_TYPE GLuint
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
+#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
+#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X,Y)
 #define CLIP_HACK 1
 #define PLOT(X,Y)              \
        if (Z < *zPtr) {        \
           *zPtr = Z;           \
           *pixelPtr = pixel;   \
        }
+#include "swrast/s_linetemp.h"
+
+
 
+/*
+ * Draw a flat-shaded, Z-less, PF_8A8R8G8B line into an XImage.
+ */
+#define NAME flat_8A8R8G8B_z_line
+#define SETUP_CODE                                             \
+   GET_XRB(xrb);                                               \
+   const GLubyte *color = vert1->color;                                \
+   GLuint pixel = PACK_8A8R8G8B(color[0], color[1], color[2], color[3]);
+#define INTERP_Z 1
+#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
+#define PIXEL_TYPE GLuint
+#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
+#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X,Y)
+#define CLIP_HACK 1
+#define PLOT(X,Y)              \
+       if (Z < *zPtr) {        \
+          *zPtr = Z;           \
+          *pixelPtr = pixel;   \
+       }
 #include "swrast/s_linetemp.h"
-}
+
 
 
 /*
  * Draw a flat-shaded, Z-less, PF_8R8G8B line into an XImage.
  */
-static void flat_8R8G8B_z_line( GLcontext *ctx,
-                                const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
+#define NAME flat_8R8G8B_z_line
+#define SETUP_CODE                                             \
+   GET_XRB(xrb);                                               \
+   const GLubyte *color = vert1->color;                                \
    GLuint pixel = PACK_8R8G8B( color[0], color[1], color[2] );
-
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
 #define PIXEL_TYPE GLuint
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
+#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
+#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X,Y)
 #define CLIP_HACK 1
 #define PLOT(X,Y)              \
        if (Z < *zPtr) {        \
           *zPtr = Z;           \
           *pixelPtr = pixel;   \
        }
-
 #include "swrast/s_linetemp.h"
-}
+
 
 
 /*
  * Draw a flat-shaded, Z-less, PF_8R8G8B24 line into an XImage.
  */
-static void flat_8R8G8B24_z_line( GLcontext *ctx,
-                                    const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-
+#define NAME flat_8R8G8B24_z_line
+#define SETUP_CODE                                             \
+   GET_XRB(xrb);                                               \
+   const GLubyte *color = vert1->color;
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
 #define PIXEL_TYPE bgr_t
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y)
+#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
+#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X,Y)
 #define CLIP_HACK 1
 #define PLOT(X,Y)                      \
        if (Z < *zPtr) {                \
@@ -410,26 +355,23 @@ static void flat_8R8G8B24_z_line( GLcontext *ctx,
            pixelPtr->g = color[GCOMP]; \
            pixelPtr->b = color[BCOMP]; \
        }
-
 #include "swrast/s_linetemp.h"
-}
+
 
 
 /*
  * Draw a flat-shaded, Z-less, PF_5R6G5B line into an XImage.
  */
-static void flat_5R6G5B_z_line( GLcontext *ctx,
-                                const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
+#define NAME flat_5R6G5B_z_line
+#define SETUP_CODE                                             \
+   GET_XRB(xrb);                                               \
+   const GLubyte *color = vert1->color;                                \
    GLushort pixel = PACK_5R6G5B( color[0], color[1], color[2] );
-
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
 #define PIXEL_TYPE GLushort
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
+#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
+#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X,Y)
 #define CLIP_HACK 1
 #define PLOT(X,Y)              \
        if (Z < *zPtr) {        \
@@ -437,23 +379,22 @@ static void flat_5R6G5B_z_line( GLcontext *ctx,
           *pixelPtr = pixel;   \
        }
 #include "swrast/s_linetemp.h"
-}
+
 
 
 /*
  * Draw a flat-shaded, Z-less, PF_DITHER_5R6G5B line into an XImage.
  */
-static void flat_DITHER_5R6G5B_z_line( GLcontext *ctx,
-                                       const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-
+#define NAME flat_DITHER_5R6G5B_z_line
+#define SETUP_CODE                                     \
+   GET_XRB(xrb);                                               \
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);            \
+   const GLubyte *color = vert1->color;
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
 #define PIXEL_TYPE GLushort
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
+#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
+#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X,Y)
 #define CLIP_HACK 1
 #define PLOT(X,Y)              \
        if (Z < *zPtr) {        \
@@ -461,209 +402,139 @@ static void flat_DITHER_5R6G5B_z_line( GLcontext *ctx,
           PACK_TRUEDITHER(*pixelPtr, X, Y, color[0], color[1], color[2]); \
        }
 #include "swrast/s_linetemp.h"
-}
-
-
-/*
- * Draw a flat-shaded, Z-less, PF_DITHER 8-bit line into an XImage.
- */
-static void flat_DITHER8_z_line( GLcontext *ctx,
-                                 const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-   GLint r = color[0], g = color[1], b = color[2];
-   DITHER_SETUP;
 
-#define INTERP_XY 1
-#define INTERP_Z 1
-#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
-#define CLIP_HACK 1
-#define PLOT(X,Y)                                              \
-       if (Z < *zPtr) {                                        \
-          *zPtr = Z;                                           \
-          *pixelPtr = (GLubyte) DITHER( X, Y, r, g, b);        \
-       }
-#include "swrast/s_linetemp.h"
-}
 
 
-/*
- * Draw a flat-shaded, Z-less, PF_LOOKUP 8-bit line into an XImage.
+/**
+ * Draw fast, XOR line with XDrawLine in front color buffer.
+ * WARNING: this isn't fully OpenGL conformant because different pixels
+ * will be hit versus using the other line functions.
+ * Don't use the code in X server GLcore module since we need a wrapper
+ * for the XSetLineAttributes() function call.
  */
-static void flat_LOOKUP8_z_line( GLcontext *ctx,
-                                 const SWvertex *vert0, const SWvertex *vert1 )
+static void
+xor_line(struct gl_context *ctx, const SWvertex *vert0, const SWvertex *vert1)
 {
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-   GLubyte pixel;
-   LOOKUP_SETUP;
-   pixel = (GLubyte) LOOKUP( color[0], color[1], color[2] );
-
-#define INTERP_Z 1
-#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
-#define CLIP_HACK 1
-#define PLOT(X,Y)              \
-       if (Z < *zPtr) {        \
-          *zPtr = Z;           \
-          *pixelPtr = pixel;   \
-       }
-
-#include "swrast/s_linetemp.h"
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   XMesaDisplay *dpy = xmesa->xm_visual->display;
+   XMesaGC gc = xmesa->xm_buffer->gc;
+   GET_XRB(xrb);
+   unsigned long pixel = xmesa_color_to_pixel(ctx,
+                                              vert1->color[0], vert1->color[1],
+                                              vert1->color[2], vert1->color[3],
+                                              xmesa->pixelformat);
+   int x0 =            (GLint) vert0->attrib[VARYING_SLOT_POS][0];
+   int y0 = YFLIP(xrb, (GLint) vert0->attrib[VARYING_SLOT_POS][1]);
+   int x1 =            (GLint) vert1->attrib[VARYING_SLOT_POS][0];
+   int y1 = YFLIP(xrb, (GLint) vert1->attrib[VARYING_SLOT_POS][1]);
+   XMesaSetForeground(dpy, gc, pixel);
+   XMesaSetFunction(dpy, gc, GXxor);
+   XSetLineAttributes(dpy, gc, (int) ctx->Line.Width,
+                      LineSolid, CapButt, JoinMiter);
+   XDrawLine(dpy, xrb->pixmap, gc, x0, y0, x1, y1);
+   XMesaSetFunction(dpy, gc, GXcopy);  /* this gc is used elsewhere */
 }
 
 
-/*
- * Draw a flat-shaded, Z-less, PF_HPCR line into an XImage.
- */
-static void flat_HPCR_z_line( GLcontext *ctx,
-                              const SWvertex *vert0, const SWvertex *vert1 )
-{
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-   const GLubyte *color = vert0->color;
-   GLint r = color[0], g = color[1], b = color[2];
-
-#define INTERP_XY 1
-#define INTERP_Z 1
-#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
-#define CLIP_HACK 1
-#define PLOT(X,Y)                                              \
-       if (Z < *zPtr) {                                        \
-          *zPtr = Z;                                           \
-          *pixelPtr = (GLubyte) DITHER_HPCR( X, Y, r, g, b);   \
-       }
-
-#include "swrast/s_linetemp.h"
-}
+#endif /* CHAN_BITS == 8 */
 
 
-static swrast_line_func get_line_func( GLcontext *ctx )
+/**
+ * Return pointer to line drawing function, or NULL if we should use a
+ * swrast fallback.
+ */
+static swrast_line_func
+get_line_func(struct gl_context *ctx)
 {
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
+#if CHAN_BITS == 8
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
-   int depth = GET_VISUAL_DEPTH(xmesa->xm_visual);
-
-   (void) DitherValues;  /* silence unused var warning */
-   (void) kernel1;  /* silence unused var warning */
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const struct xmesa_renderbuffer *xrb;
 
+   if ((ctx->DrawBuffer->_ColorDrawBufferIndexes[0] != BUFFER_BIT_FRONT_LEFT) &&
+       (ctx->DrawBuffer->_ColorDrawBufferIndexes[0] != BUFFER_BIT_BACK_LEFT))
+      return (swrast_line_func) NULL;
    if (ctx->RenderMode != GL_RENDER)      return (swrast_line_func) NULL;
    if (ctx->Line.SmoothFlag)              return (swrast_line_func) NULL;
-   if (ctx->Texture._ReallyEnabled)       return (swrast_line_func) NULL;
+   if (ctx->Texture._EnabledUnits)        return (swrast_line_func) NULL;
    if (ctx->Light.ShadeModel != GL_FLAT)  return (swrast_line_func) NULL;
    if (ctx->Line.StippleFlag)             return (swrast_line_func) NULL;
+   if (swrast->_RasterMask & MULTI_DRAW_BIT) return (swrast_line_func) NULL;
 
-   if (xmesa->xm_buffer->buffer==XIMAGE
+   xrb = xmesa_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0]);
+
+   if (xrb->ximage
        && swrast->_RasterMask==DEPTH_BIT
        && ctx->Depth.Func==GL_LESS
        && ctx->Depth.Mask==GL_TRUE
-       && ctx->Visual.DepthBits == DEFAULT_SOFTWARE_DEPTH_BITS
+       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
        && ctx->Line.Width==1.0F) {
       switch (xmesa->pixelformat) {
-         case PF_TRUECOLOR:
+         case PF_Truecolor:
             return flat_TRUECOLOR_z_line;
          case PF_8A8B8G8R:
             return flat_8A8B8G8R_z_line;
+         case PF_8A8R8G8B:
+            return flat_8A8R8G8B_z_line;
          case PF_8R8G8B:
             return flat_8R8G8B_z_line;
          case PF_8R8G8B24:
             return flat_8R8G8B24_z_line;
          case PF_5R6G5B:
             return flat_5R6G5B_z_line;
-         case PF_DITHER_5R6G5B:
+         case PF_Dither_5R6G5B:
             return flat_DITHER_5R6G5B_z_line;
-         case PF_DITHER:
-            return (depth==8) ? flat_DITHER8_z_line : (swrast_line_func) NULL;
-         case PF_LOOKUP:
-            return (depth==8) ? flat_LOOKUP8_z_line : (swrast_line_func) NULL;
-         case PF_HPCR:
-            return flat_HPCR_z_line;
          default:
             return (swrast_line_func)NULL;
       }
    }
-   if (xmesa->xm_buffer->buffer==XIMAGE
+   if (xrb->ximage
        && swrast->_RasterMask==0
        && ctx->Line.Width==1.0F) {
       switch (xmesa->pixelformat) {
-         case PF_TRUECOLOR:
+         case PF_Truecolor:
             return flat_TRUECOLOR_line;
          case PF_8A8B8G8R:
             return flat_8A8B8G8R_line;
+         case PF_8A8R8G8B:
+            return flat_8A8R8G8B_line;
          case PF_8R8G8B:
             return flat_8R8G8B_line;
          case PF_8R8G8B24:
             return flat_8R8G8B24_line;
          case PF_5R6G5B:
             return flat_5R6G5B_line;
-         case PF_DITHER_5R6G5B:
+         case PF_Dither_5R6G5B:
             return flat_DITHER_5R6G5B_line;
-         case PF_DITHER:
-            return (depth==8) ? flat_DITHER8_line : (swrast_line_func) NULL;
-         case PF_LOOKUP:
-            return (depth==8) ? flat_LOOKUP8_line : (swrast_line_func) NULL;
-         case PF_HPCR:
-            return flat_HPCR_line;
         default:
            return (swrast_line_func)NULL;
       }
    }
 
+   if (ctx->DrawBuffer->_NumColorDrawBuffers == 1
+       && ctx->DrawBuffer->_ColorDrawBufferIndexes[0] == BUFFER_FRONT_LEFT
+       && swrast->_RasterMask == LOGIC_OP_BIT
+       && ctx->Color.LogicOp == GL_XOR
+       && !ctx->Line.StippleFlag
+       && !ctx->Line.SmoothFlag) {
+      return xor_line;
+   }
+
+#endif /* CHAN_BITS == 8 */
    return (swrast_line_func) NULL;
 }
 
-/* Override for the swrast line-selection function.  Try to use one
+
+/**
+ * Override for the swrast line-selection function.  Try to use one
  * of our internal line functions, otherwise fall back to the
  * standard swrast functions.
  */
-void xmesa_choose_line( GLcontext *ctx )
+void
+xmesa_choose_line(struct gl_context *ctx)
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
    if (!(swrast->Line = get_line_func( ctx )))
       _swrast_choose_line( ctx );
 }
-
-
-#define XMESA_NEW_POINT  (_NEW_POINT | \
-                          _NEW_RENDERMODE | \
-                          _SWRAST_NEW_RASTERMASK)
-
-#define XMESA_NEW_LINE   (_NEW_LINE | \
-                          _NEW_TEXTURE | \
-                          _NEW_LIGHT | \
-                          _NEW_DEPTH | \
-                          _NEW_RENDERMODE | \
-                          _SWRAST_NEW_RASTERMASK)
-
-#define XMESA_NEW_TRIANGLE (_NEW_POLYGON | \
-                            _NEW_TEXTURE | \
-                            _NEW_LIGHT | \
-                            _NEW_DEPTH | \
-                            _NEW_RENDERMODE | \
-                            _SWRAST_NEW_RASTERMASK)
-
-
-/* Extend the software rasterizer with our line/point/triangle
- * functions.
- */
-void xmesa_register_swrast_functions( GLcontext *ctx )
-{
-   SWcontext *swrast = SWRAST_CONTEXT( ctx );
-
-   swrast->choose_point = xmesa_choose_point;
-   swrast->choose_line = xmesa_choose_line;
-   swrast->choose_triangle = xmesa_choose_triangle;
-
-   swrast->invalidate_point |= XMESA_NEW_POINT;
-   swrast->invalidate_line |= XMESA_NEW_LINE;
-   swrast->invalidate_triangle |= XMESA_NEW_TRIANGLE;
-}