From 2e7fb6655334789f8a5e290245d47c8d6b221c24 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=B8ren=20Sandmann=20Pedersen?= Date: Sat, 10 Jul 2010 20:47:01 -0400 Subject: [PATCH] When converting indexed formats to 64 bits, don't correct for channel widths Indexed formats are mapped to a8r8g8b8 with full precision, so when expanding we shouldn't correct for the width of the channels --- pixman/pixman-access.c | 31 +++++++++++++++++++++++++++++-- test/blitters-test.c | 2 +- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/pixman/pixman-access.c b/pixman/pixman-access.c index 9708b10..80fa9e8 100644 --- a/pixman/pixman-access.c +++ b/pixman/pixman-access.c @@ -2683,12 +2683,26 @@ fetch_scanline_generic_64 (pixman_image_t *image, uint32_t * buffer, const uint32_t *mask) { + pixman_format_code_t format; + /* Fetch the pixels into the first half of buffer and then expand them in * place. */ image->bits.fetch_scanline_raw_32 (image, x, y, width, buffer, NULL); + + format = image->bits.format; + if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_COLOR || + PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_GRAY) + { + /* Indexed formats are mapped to a8r8g8b8 with full + * precision, so when expanding we shouldn't correct + * for the width of the channels + */ + + format = PIXMAN_a8r8g8b8; + } - pixman_expand ((uint64_t *)buffer, buffer, image->bits.format, width); + pixman_expand ((uint64_t *)buffer, buffer, format, width); } /* Despite the type, this function expects a uint64_t *buffer */ @@ -2699,8 +2713,21 @@ fetch_pixel_generic_64 (bits_image_t *image, { uint32_t pixel32 = image->fetch_pixel_raw_32 (image, offset, line); uint64_t result; + pixman_format_code_t format; + + format = image->format; + if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_COLOR || + PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_GRAY) + { + /* Indexed formats are mapped to a8r8g8b8 with full + * precision, so when expanding we shouldn't correct + * for the width of the channels + */ + + format = PIXMAN_a8r8g8b8; + } - pixman_expand ((uint64_t *)&result, &pixel32, image->format, 1); + pixman_expand ((uint64_t *)&result, &pixel32, format, 1); return result; } diff --git a/test/blitters-test.c b/test/blitters-test.c index 5becada..2c6334a 100644 --- a/test/blitters-test.c +++ b/test/blitters-test.c @@ -478,6 +478,6 @@ main (int argc, const char *argv[]) } return fuzzer_test_main("blitters", 2000000, - 0xD0B050B1, + 0xD5833506, test_composite, argc, argv); } -- 2.7.4