OSDN Git Service

util: fix MAKE_RGBA macro for 10bpp modes
authorIlia Mirkin <imirkin@alum.mit.edu>
Thu, 23 Nov 2017 18:51:45 +0000 (13:51 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 22 Jun 2019 17:33:55 +0000 (13:33 -0400)
We need to shift the values up, otherwise we'd end up with a negative
shift. This works for up-to 16-bit components, which is fine for now.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
tests/util/pattern.c

index c84fee5..8bdebd2 100644 (file)
@@ -60,11 +60,22 @@ struct color_yuv {
          .u = MAKE_YUV_601_U(r, g, b), \
          .v = MAKE_YUV_601_V(r, g, b) }
 
+static inline uint32_t shiftcolor(const struct util_color_component *comp,
+                                 uint32_t value)
+{
+       /* Fill the low bits with the high bits. */
+       value = (value << 8) | value;
+       /* Shift down to remove unwanted low bits */
+       value = value >> (16 - comp->length);
+       /* Shift back up to where the value should be */
+       return value << comp->offset;
+}
+
 #define MAKE_RGBA(rgb, r, g, b, a) \
-       ((((r) >> (8 - (rgb)->red.length)) << (rgb)->red.offset) | \
-        (((g) >> (8 - (rgb)->green.length)) << (rgb)->green.offset) | \
-        (((b) >> (8 - (rgb)->blue.length)) << (rgb)->blue.offset) | \
-        (((a) >> (8 - (rgb)->alpha.length)) << (rgb)->alpha.offset))
+       (shiftcolor(&(rgb)->red, (r)) | \
+        shiftcolor(&(rgb)->green, (g)) | \
+        shiftcolor(&(rgb)->blue, (b)) | \
+        shiftcolor(&(rgb)->alpha, (a)))
 
 #define MAKE_RGB24(rgb, r, g, b) \
        { .value = MAKE_RGBA(rgb, r, g, b, 0) }