From: Søren Sandmann Pedersen <[email protected]>

In some cases we end up trying to use the STORE_4 macro with an 8 bit
values, which resulted in other pixels getting overwritten. Fix this
by always masking away the high 4 bits.
---
 pixman/pixman-access.c |   22 ++++++++++++++--------
 test/blitters-test.c   |    2 +-
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/pixman/pixman-access.c b/pixman/pixman-access.c
index 389cf2a..fa0a267 100644
--- a/pixman/pixman-access.c
+++ b/pixman/pixman-access.c
@@ -2445,9 +2445,12 @@ store_scanline_x4a4 (bits_image_t *  image,
     do                                                                 \
     {                                                                  \
        int bo = 4 * (o);                                               \
-       STORE_8 (img, l, bo, (bo & 4 ?                                  \
-                             (FETCH_8 (img, l, bo) & 0xf0) | (v) :     \
-                             (FETCH_8 (img, l, bo) & 0x0f) | ((v) << 4))); \
+       int v4 = (v) & 0x0f;                                            \
+                                                                       \
+       STORE_8 (img, l, bo, (                                          \
+                    bo & 4 ?                                           \
+                    (FETCH_8 (img, l, bo) & 0xf0) | (v4) :             \
+                    (FETCH_8 (img, l, bo) & 0x0f) | (v4 << 4)));       \
     } while (0)
 #else
 
@@ -2455,9 +2458,12 @@ store_scanline_x4a4 (bits_image_t *  image,
     do                                                                 \
     {                                                                  \
        int bo = 4 * (o);                                               \
-       STORE_8 (img, l, bo, (bo & 4 ?                                  \
-                             (FETCH_8 (img, l, bo) & 0x0f) | ((v) << 4) : \
-                             (FETCH_8 (img, l, bo) & 0xf0) | (v)));    \
+       int v4 = (v) & 0x0f;                                            \
+                                                                       \
+       STORE_8 (img, l, bo, (                                          \
+                    bo & 4 ?                                           \
+                    (FETCH_8 (img, l, bo) & 0x0f) | (v4 << 4) :        \
+                    (FETCH_8 (img, l, bo) & 0xf0) | (v4)));            \
     } while (0)
 #endif
 
@@ -2484,11 +2490,11 @@ store_scanline_r1g2b1 (bits_image_t *  image,
 {
     uint32_t *bits = image->bits + image->rowstride * y;
     int i;
-    
+
     for (i = 0; i < width; ++i)
     {
        uint32_t pixel;
-       
+
        SPLIT (values[i]);
        pixel = (((r >> 4) & 0x8) |
                 ((g >> 5) & 0x6) |
diff --git a/test/blitters-test.c b/test/blitters-test.c
index c11917d..5e33031 100644
--- a/test/blitters-test.c
+++ b/test/blitters-test.c
@@ -482,7 +482,7 @@ main (int argc, char *argv[])
            /* Predefined value for running with all the fastpath functions
               disabled. It needs to be updated every time when changes are
               introduced to this program or behavior of pixman changes! */
-           if (crc == 0xEF7A1179)
+           if (crc == 0xA058F792)
            {
                printf ("blitters test passed\n");
            }
-- 
1.6.0.6

_______________________________________________
Pixman mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pixman

Reply via email to