Merge branch '7.8' into master
[mesa.git] / src / mesa / drivers / dri / swrast / swrast_span.c
index 5e990368b2ed9f17624662d3b26977d410889254..c5681e34a916beeaf80e1df8ca1214b12fd8436e 100644 (file)
@@ -3,6 +3,7 @@
  * Version:  7.1
  *
  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
+ * Copyright 2008, 2010 George Sapountzis <gsapountzis@gmail.com>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-/*
- * Authors:
- *    George Sapountzis <gsap7@yahoo.gr>
- */
-
 #include "swrast_priv.h"
 
 #define YFLIP(_xrb, Y) ((_xrb)->Base.Height - (Y) - 1)
@@ -63,38 +59,42 @@ static const GLubyte kernel[16] = {
 
 /* 32-bit BGRA */
 #define STORE_PIXEL_A8R8G8B8(DST, X, Y, VALUE) \
-   DST[3] = VALUE[ACOMP]; \
-   DST[2] = VALUE[RCOMP]; \
-   DST[1] = VALUE[GCOMP]; \
-   DST[0] = VALUE[BCOMP]
+   *DST = VALUE[ACOMP] << 24 | VALUE[RCOMP] << 16 | VALUE[GCOMP] << 8 | VALUE[BCOMP]
 #define STORE_PIXEL_RGB_A8R8G8B8(DST, X, Y, VALUE) \
-   DST[3] = 0xff; \
-   DST[2] = VALUE[RCOMP]; \
-   DST[1] = VALUE[GCOMP]; \
-   DST[0] = VALUE[BCOMP]
+   *DST = 0xff << 24 | VALUE[RCOMP] << 16 | VALUE[GCOMP] << 8 | VALUE[BCOMP]
 #define FETCH_PIXEL_A8R8G8B8(DST, SRC) \
-   DST[ACOMP] = SRC[3]; \
-   DST[RCOMP] = SRC[2]; \
-   DST[GCOMP] = SRC[1]; \
-   DST[BCOMP] = SRC[0]
+   DST[ACOMP] = *SRC >> 24;            \
+   DST[RCOMP] = (*SRC >> 16) & 0xff;   \
+   DST[GCOMP] = (*SRC >> 8) & 0xff;    \
+   DST[BCOMP] = *SRC & 0xff
+
+
+/* 32-bit BGRX */
+#define STORE_PIXEL_X8R8G8B8(DST, X, Y, VALUE) \
+   *DST = 0xff << 24 | VALUE[RCOMP] << 16 | VALUE[GCOMP] << 8 | VALUE[BCOMP]
+#define STORE_PIXEL_RGB_X8R8G8B8(DST, X, Y, VALUE) \
+   *DST = 0xff << 24 | VALUE[RCOMP] << 16 | VALUE[GCOMP] << 8 | VALUE[BCOMP]
+#define FETCH_PIXEL_X8R8G8B8(DST, SRC) \
+   DST[ACOMP] = 0xff;                  \
+   DST[RCOMP] = (*SRC >> 16) & 0xff;   \
+   DST[GCOMP] = (*SRC >> 8) & 0xff;    \
+   DST[BCOMP] = *SRC & 0xff
 
 
 /* 16-bit BGR */
 #define STORE_PIXEL_R5G6B5(DST, X, Y, VALUE) \
    do { \
    int d = DITHER_COMP(X, Y) >> 6; \
-   GLushort *p = (GLushort *)DST; \
-   *p = ( ((DITHER_CLAMP((VALUE[RCOMP]) + d) & 0xf8) << 8) | \
-         ((DITHER_CLAMP((VALUE[GCOMP]) + d) & 0xfc) << 3) | \
-         ((DITHER_CLAMP((VALUE[BCOMP]) + d) & 0xf8) >> 3) ); \
+   *DST = ( ((DITHER_CLAMP((VALUE[RCOMP]) + d) & 0xf8) << 8) | \
+            ((DITHER_CLAMP((VALUE[GCOMP]) + d) & 0xfc) << 3) | \
+            ((DITHER_CLAMP((VALUE[BCOMP]) + d) & 0xf8) >> 3) ); \
    } while(0)
 #define FETCH_PIXEL_R5G6B5(DST, SRC) \
    do { \
-   GLushort p = *(GLushort *)SRC; \
    DST[ACOMP] = 0xff; \
-   DST[RCOMP] = ((p >> 8) & 0xf8) * 255 / 0xf8; \
-   DST[GCOMP] = ((p >> 3) & 0xfc) * 255 / 0xfc; \
-   DST[BCOMP] = ((p << 3) & 0xf8) * 255 / 0xf8; \
+   DST[RCOMP] = ((*SRC >> 8) & 0xf8) * 255 / 0xf8; \
+   DST[GCOMP] = ((*SRC >> 3) & 0xfc) * 255 / 0xfc; \
+   DST[BCOMP] = ((*SRC << 3) & 0xf8) * 255 / 0xf8; \
    } while(0)
 
 
@@ -127,8 +127,8 @@ static const GLubyte kernel[16] = {
 #define SPAN_VARS \
    struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);
 #define INIT_PIXEL_PTR(P, X, Y) \
-   GLubyte *P = (GLubyte *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch + (X) * 4;
-#define INC_PIXEL_PTR(P) P += 4
+   GLuint *P = (GLuint *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch / 4 + (X)
+#define INC_PIXEL_PTR(P) P++
 #define STORE_PIXEL(DST, X, Y, VALUE) \
    STORE_PIXEL_A8R8G8B8(DST, X, Y, VALUE)
 #define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
@@ -139,51 +139,52 @@ static const GLubyte kernel[16] = {
 #include "swrast/s_spantemp.h"
 
 
-/* 16-bit BGR */
-#define NAME(FUNC) FUNC##_R5G6B5
+/* 32-bit BGRX */
+#define NAME(FUNC) FUNC##_X8R8G8B8
 #define RB_TYPE GLubyte
 #define SPAN_VARS \
    struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);
 #define INIT_PIXEL_PTR(P, X, Y) \
-   GLubyte *P = (GLubyte *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch + (X) * 2;
-#define INC_PIXEL_PTR(P) P += 2
+   GLuint *P = (GLuint *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch / 4 + (X);
+#define INC_PIXEL_PTR(P) P++
 #define STORE_PIXEL(DST, X, Y, VALUE) \
-   STORE_PIXEL_R5G6B5(DST, X, Y, VALUE)
+   STORE_PIXEL_X8R8G8B8(DST, X, Y, VALUE)
+#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
+   STORE_PIXEL_RGB_X8R8G8B8(DST, X, Y, VALUE)
 #define FETCH_PIXEL(DST, SRC) \
-   FETCH_PIXEL_R5G6B5(DST, SRC)
+   FETCH_PIXEL_X8R8G8B8(DST, SRC)
 
 #include "swrast/s_spantemp.h"
 
 
-/* 8-bit BGR */
-#define NAME(FUNC) FUNC##_R3G3B2
+/* 16-bit BGR */
+#define NAME(FUNC) FUNC##_R5G6B5
 #define RB_TYPE GLubyte
 #define SPAN_VARS \
    struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);
 #define INIT_PIXEL_PTR(P, X, Y) \
-   GLubyte *P = (GLubyte *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch + (X) * 1;
-#define INC_PIXEL_PTR(P) P += 1
+   GLushort *P = (GLushort *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch / 2 + (X);
+#define INC_PIXEL_PTR(P) P++
 #define STORE_PIXEL(DST, X, Y, VALUE) \
-   STORE_PIXEL_R3G3B2(DST, X, Y, VALUE)
+   STORE_PIXEL_R5G6B5(DST, X, Y, VALUE)
 #define FETCH_PIXEL(DST, SRC) \
-   FETCH_PIXEL_R3G3B2(DST, SRC)
+   FETCH_PIXEL_R5G6B5(DST, SRC)
 
 #include "swrast/s_spantemp.h"
 
 
-/* 8-bit color index */
-#define NAME(FUNC) FUNC##_CI8
-#define CI_MODE
+/* 8-bit BGR */
+#define NAME(FUNC) FUNC##_R3G3B2
 #define RB_TYPE GLubyte
 #define SPAN_VARS \
    struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);
 #define INIT_PIXEL_PTR(P, X, Y) \
-   GLubyte *P = (GLubyte *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch + (X);
+   GLubyte *P = (GLubyte *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch + (X) * 1;
 #define INC_PIXEL_PTR(P) P += 1
 #define STORE_PIXEL(DST, X, Y, VALUE) \
-   *DST = VALUE[0]
+   STORE_PIXEL_R3G3B2(DST, X, Y, VALUE)
 #define FETCH_PIXEL(DST, SRC) \
-   DST = SRC[0]
+   FETCH_PIXEL_R3G3B2(DST, SRC)
 
 #include "swrast/s_spantemp.h"
 
@@ -198,8 +199,8 @@ static const GLubyte kernel[16] = {
 #define SPAN_VARS \
    struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);
 #define INIT_PIXEL_PTR(P, X, Y) \
-   GLubyte *P = (GLubyte *)row;
-#define INC_PIXEL_PTR(P) P += 4
+   GLuint *P = (GLuint *)row;
+#define INC_PIXEL_PTR(P) P++
 #define STORE_PIXEL(DST, X, Y, VALUE) \
    STORE_PIXEL_A8R8G8B8(DST, X, Y, VALUE)
 #define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
@@ -210,41 +211,42 @@ static const GLubyte kernel[16] = {
 #include "swrast_spantemp.h"
 
 
-/* 16-bit BGR */
-#define NAME(FUNC) FUNC##_R5G6B5_front
+/* 32-bit BGRX */
+#define NAME(FUNC) FUNC##_X8R8G8B8_front
 #define RB_TYPE GLubyte
 #define SPAN_VARS \
    struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);
 #define INIT_PIXEL_PTR(P, X, Y) \
-   GLubyte *P = (GLubyte *)row;
-#define INC_PIXEL_PTR(P) P += 2
+   GLuint *P = (GLuint *)row;
+#define INC_PIXEL_PTR(P) P++
 #define STORE_PIXEL(DST, X, Y, VALUE) \
-   STORE_PIXEL_R5G6B5(DST, X, Y, VALUE)
+   STORE_PIXEL_X8R8G8B8(DST, X, Y, VALUE)
+#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
+   STORE_PIXEL_RGB_X8R8G8B8(DST, X, Y, VALUE)
 #define FETCH_PIXEL(DST, SRC) \
-   FETCH_PIXEL_R5G6B5(DST, SRC)
+   FETCH_PIXEL_X8R8G8B8(DST, SRC)
 
 #include "swrast_spantemp.h"
 
 
-/* 8-bit BGR */
-#define NAME(FUNC) FUNC##_R3G3B2_front
+/* 16-bit BGR */
+#define NAME(FUNC) FUNC##_R5G6B5_front
 #define RB_TYPE GLubyte
 #define SPAN_VARS \
    struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);
 #define INIT_PIXEL_PTR(P, X, Y) \
-   GLubyte *P = (GLubyte *)row;
-#define INC_PIXEL_PTR(P) P += 1
+   GLushort *P = (GLushort *)row;
+#define INC_PIXEL_PTR(P) P += 2
 #define STORE_PIXEL(DST, X, Y, VALUE) \
-   STORE_PIXEL_R3G3B2(DST, X, Y, VALUE)
+   STORE_PIXEL_R5G6B5(DST, X, Y, VALUE)
 #define FETCH_PIXEL(DST, SRC) \
-   FETCH_PIXEL_R3G3B2(DST, SRC)
+   FETCH_PIXEL_R5G6B5(DST, SRC)
 
 #include "swrast_spantemp.h"
 
 
-/* 8-bit color index */
-#define NAME(FUNC) FUNC##_CI8_front
-#define CI_MODE
+/* 8-bit BGR */
+#define NAME(FUNC) FUNC##_R3G3B2_front
 #define RB_TYPE GLubyte
 #define SPAN_VARS \
    struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);
@@ -252,9 +254,9 @@ static const GLubyte kernel[16] = {
    GLubyte *P = (GLubyte *)row;
 #define INC_PIXEL_PTR(P) P += 1
 #define STORE_PIXEL(DST, X, Y, VALUE) \
-   *DST = VALUE[0]
+   STORE_PIXEL_R3G3B2(DST, X, Y, VALUE)
 #define FETCH_PIXEL(DST, SRC) \
-   DST = SRC[0]
+   FETCH_PIXEL_R3G3B2(DST, SRC)
 
 #include "swrast_spantemp.h"
 
@@ -279,6 +281,15 @@ swrast_set_span_funcs_back(struct swrast_renderbuffer *xrb,
        xrb->Base.PutValues = put_values_A8R8G8B8;
        xrb->Base.PutMonoValues = put_mono_values_A8R8G8B8;
        break;
+    case PF_X8R8G8B8:
+       xrb->Base.GetRow = get_row_X8R8G8B8;
+       xrb->Base.GetValues = get_values_X8R8G8B8;
+       xrb->Base.PutRow = put_row_X8R8G8B8;
+       xrb->Base.PutRowRGB = put_row_rgb_X8R8G8B8;
+       xrb->Base.PutMonoRow = put_mono_row_X8R8G8B8;
+       xrb->Base.PutValues = put_values_X8R8G8B8;
+       xrb->Base.PutMonoValues = put_mono_values_X8R8G8B8;
+       break;
     case PF_R5G6B5:
        xrb->Base.GetRow = get_row_R5G6B5;
        xrb->Base.GetValues = get_values_R5G6B5;
@@ -297,14 +308,6 @@ swrast_set_span_funcs_back(struct swrast_renderbuffer *xrb,
        xrb->Base.PutValues = put_values_R3G3B2;
        xrb->Base.PutMonoValues = put_mono_values_R3G3B2;
        break;
-    case PF_CI8:
-       xrb->Base.GetRow = get_row_CI8;
-       xrb->Base.GetValues = get_values_CI8;
-       xrb->Base.PutRow = put_row_CI8;
-       xrb->Base.PutMonoRow = put_mono_row_CI8;
-       xrb->Base.PutValues = put_values_CI8;
-       xrb->Base.PutMonoValues = put_mono_values_CI8;
-       break;
     default:
        assert(0);
        return;
@@ -334,6 +337,15 @@ swrast_set_span_funcs_front(struct swrast_renderbuffer *xrb,
        xrb->Base.PutValues = put_values_A8R8G8B8_front;
        xrb->Base.PutMonoValues = put_mono_values_A8R8G8B8_front;
        break;
+    case PF_X8R8G8B8:
+       xrb->Base.GetRow = get_row_X8R8G8B8_front;
+       xrb->Base.GetValues = get_values_X8R8G8B8_front;
+       xrb->Base.PutRow = put_row_X8R8G8B8_front;
+       xrb->Base.PutRowRGB = put_row_rgb_X8R8G8B8_front;
+       xrb->Base.PutMonoRow = put_mono_row_X8R8G8B8_front;
+       xrb->Base.PutValues = put_values_X8R8G8B8_front;
+       xrb->Base.PutMonoValues = put_mono_values_X8R8G8B8_front;
+       break;
     case PF_R5G6B5:
        xrb->Base.GetRow = get_row_R5G6B5_front;
        xrb->Base.GetValues = get_values_R5G6B5_front;
@@ -352,14 +364,6 @@ swrast_set_span_funcs_front(struct swrast_renderbuffer *xrb,
        xrb->Base.PutValues = put_values_R3G3B2_front;
        xrb->Base.PutMonoValues = put_mono_values_R3G3B2_front;
        break;
-    case PF_CI8:
-       xrb->Base.GetRow = get_row_CI8_front;
-       xrb->Base.GetValues = get_values_CI8_front;
-       xrb->Base.PutRow = put_row_CI8_front;
-       xrb->Base.PutMonoRow = put_mono_row_CI8_front;
-       xrb->Base.PutValues = put_values_CI8_front;
-       xrb->Base.PutMonoValues = put_mono_values_CI8_front;
-       break;
     default:
        assert(0);
        return;