From 55305cf8db7787883bc80b7348eb626e609626f8 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Fri, 9 Oct 2009 16:08:15 -0700 Subject: [PATCH] EXA: fix exaGetRGBAFromPixel to not loop forever on PICT_a8 picture MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Easily reproducible by running "rendercheck -t fill". It should be safe to just test against rbits for all colour components as we should always have values for r/g/bbits for PICT_FORMAT_COLOR formats. Signed-off-by: Ben Skeggs Signed-off-by: Michel Dänzer --- exa/exa_render.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/exa/exa_render.c b/exa/exa_render.c index 1c1856610..70701a2b3 100644 --- a/exa/exa_render.c +++ b/exa/exa_render.c @@ -204,22 +204,28 @@ exaGetRGBAFromPixel(CARD32 pixel, bshift = pFormat->direct.blue; ashift = pFormat->direct.alpha; - *red = ((pixel >> rshift ) & ((1 << rbits) - 1)) << (16 - rbits); - while (rbits < 16) { - *red |= *red >> rbits; - rbits <<= 1; - } + if (rbits) { + *red = ((pixel >> rshift ) & ((1 << rbits) - 1)) << (16 - rbits); + while (rbits < 16) { + *red |= *red >> rbits; + rbits <<= 1; + } - *green = ((pixel >> gshift ) & ((1 << gbits) - 1)) << (16 - gbits); - while (gbits < 16) { - *green |= *green >> gbits; - gbits <<= 1; - } + *green = ((pixel >> gshift ) & ((1 << gbits) - 1)) << (16 - gbits); + while (gbits < 16) { + *green |= *green >> gbits; + gbits <<= 1; + } - *blue = ((pixel >> bshift ) & ((1 << bbits) - 1)) << (16 - bbits); - while (bbits < 16) { - *blue |= *blue >> bbits; - bbits <<= 1; + *blue = ((pixel >> bshift ) & ((1 << bbits) - 1)) << (16 - bbits); + while (bbits < 16) { + *blue |= *blue >> bbits; + bbits <<= 1; + } + } else { + *red = 0x0000; + *green = 0x0000; + *blue = 0x0000; } if (abits) {