pixman: Branch 'master'

Søren Sandmann Pedersen sandmann at kemper.freedesktop.org
Wed May 7 19:31:48 PDT 2008


 pixman/pixman-mmx.c |   36 ++++++++++++++++++++++++++++++++----
 1 file changed, 32 insertions(+), 4 deletions(-)

New commits:
commit 1f275b4bdc28b121f4afd3cfd2df187bebedf35d
Author: Søren Sandmann <sandmann at redhat.com>
Date:   Wed May 7 22:27:56 2008 -0400

    Add support for 8 bit fills in pixman_fill_mmx()

diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c
index 024dfee..5c6adfb 100644
--- a/pixman/pixman-mmx.c
+++ b/pixman/pixman-mmx.c
@@ -1733,13 +1733,27 @@ pixman_fill_mmx (uint32_t *bits,
     __m64	v1, v2, v3, v4, v5, v6, v7;
 #endif
 
-    if (bpp == 16 && (xor >> 16 != (xor & 0xffff)))
+    if (bpp != 16 && bpp != 32 && bpp != 8)
 	return FALSE;
 
-    if (bpp != 16 && bpp != 32)
+    if (bpp == 16 && (xor >> 16 != (xor & 0xffff)))
 	return FALSE;
 
-    if (bpp == 16)
+    if (bpp == 8 &&
+	((xor >> 16 != (xor & 0xffff)) ||
+	 (xor >> 24 != (xor & 0x00ff) >> 16)))
+    {
+	return FALSE;
+    }
+    
+    if (bpp == 8)
+    {
+	stride = stride * (int) sizeof (uint32_t) / 1;
+	byte_line = (uint8_t *)(((uint8_t *)bits) + stride * y + x);
+	byte_width = width;
+	stride *= 1;
+    }
+    else if (bpp == 16)
     {
 	stride = stride * (int) sizeof (uint32_t) / 2;
 	byte_line = (uint8_t *)(((uint16_t *)bits) + stride * y + x);
@@ -1778,6 +1792,13 @@ pixman_fill_mmx (uint32_t *bits,
 	byte_line += stride;
 	w = byte_width;
 
+	while (w >= 1 && ((unsigned long)d & 1))
+	{
+	    *(uint8_t *)d = (xor & 0xff);
+	    w--;
+	    d++;
+	}
+	
 	while (w >= 2 && ((unsigned long)d & 3))
 	{
 	    *(uint16_t *)d = xor;
@@ -1831,12 +1852,19 @@ pixman_fill_mmx (uint32_t *bits,
 	    w -= 4;
 	    d += 4;
 	}
-	if (w >= 2)
+	while (w >= 2)
 	{
 	    *(uint16_t *)d = xor;
 	    w -= 2;
 	    d += 2;
 	}
+	while (w >= 1)
+	{
+	    *(uint8_t *)d = (xor & 0xff);
+	    w--;
+	    d++;
+	}
+	
     }
 
     _mm_empty();


More information about the xorg-commit mailing list