gallium: added a4r4g4b4_put_tile_rgba()
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 3 Jul 2008 20:55:14 +0000 (14:55 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 3 Jul 2008 23:21:22 +0000 (17:21 -0600)
src/gallium/auxiliary/util/p_tile.c

index ab603ff6e4d270370879b3ac5ed4f6393ae913cd..93abef987925327b8217873e750122804003571a 100644 (file)
@@ -298,6 +298,33 @@ a4r4g4b4_get_tile_rgba(ushort *src,
 }
 
 
+static void
+a4r4g4b4_put_tile_rgba(ushort *dst,
+                       unsigned w, unsigned h,
+                       const float *p,
+                       unsigned src_stride)
+{
+   unsigned i, j;
+
+   for (i = 0; i < h; i++) {
+      const float *pRow = p;
+      for (j = 0; j < w; j++, pRow += 4) {
+         unsigned r, g, b, a;
+         UNCLAMPED_FLOAT_TO_UBYTE(r, pRow[0]);
+         UNCLAMPED_FLOAT_TO_UBYTE(g, pRow[1]);
+         UNCLAMPED_FLOAT_TO_UBYTE(b, pRow[2]);
+         UNCLAMPED_FLOAT_TO_UBYTE(a, pRow[3]);
+         r >>= 4;
+         g >>= 4;
+         b >>= 4;
+         a >>= 4;
+         *dst++ = (a << 12) | (r << 16) | (g << 4) | b;
+      }
+      p += src_stride;
+   }
+}
+
+
 /*** PIPE_FORMAT_R5G6B5_UNORM ***/
 
 static void
@@ -774,6 +801,10 @@ pipe_put_tile_rgba(struct pipe_context *pipe,
       r5g5b5_put_tile_rgba((ushort *) packed, w, h, p, src_stride);
       break;
    case PIPE_FORMAT_R8G8B8A8_UNORM:
+      assert(0);
+      break;
+   case PIPE_FORMAT_A4R4G4B4_UNORM:
+      a4r4g4b4_put_tile_rgba((ushort *) packed, w, h, p, src_stride);
       break;
    case PIPE_FORMAT_L8_UNORM:
       /*l8_put_tile_rgba((ubyte *) packed, w, h, p, src_stride);*/