diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2010-05-30 08:11:19 -0400 |
---|---|---|
committer | Andrea Canciani <ranma42@gmail.com> | 2010-12-13 17:22:35 +0100 |
commit | 47862b0abd7391a661628379d668bedaefdc3bcf (patch) | |
tree | d6ad002da189bed1fcb01e62de73cca479fe6992 | |
parent | 2b33abbfab39c0ea620450846ca01cc0165b6679 (diff) |
Some more conversion routines
-rw-r--r-- | pixman/pixman-utils.c | 61 |
1 files changed, 37 insertions, 24 deletions
diff --git a/pixman/pixman-utils.c b/pixman/pixman-utils.c index 7393755..7f7285a 100644 --- a/pixman/pixman-utils.c +++ b/pixman/pixman-utils.c @@ -118,6 +118,31 @@ pixman_expand (uint64_t * dst, } } +static force_inline uint16_t +float_to_unorm (float f, int n_bits) +{ + uint32_t u; + + if (f > 1.0) + f = 1.0; + if (f < 0.0) + f = 0.0; + + u = f * (1 << n_bits); + u -= (u >> n_bits); + + return u; +} + + +static force_inline float +unorm_to_float (uint16_t u, int n_bits) +{ + uint16_t m = ((1 << n_bits) - 1); + + return (u & m) * (1 / (float)m); +} + void pixman_expand_to_float (argb_t *dst, const uint32_t *src, @@ -136,41 +161,29 @@ pixman_expand_to_float (argb_t *dst, r_shift = 24 - r_size, g_shift = 16 - g_size, b_shift = 8 - b_size; - const uint8_t a_mask = ~(~0 << a_size), - r_mask = ~(~0 << r_size), - g_mask = ~(~0 << g_size), - b_mask = ~(~0 << b_size); int i; for (i = 0; i < width; ++i) { const uint32_t pixel = src[i]; - const uint8_t a = (pixel >> a_shift) & a_mask, - r = (pixel >> r_shift) & r_mask, - g = (pixel >> g_shift) & g_mask, - b = (pixel >> b_shift) & b_mask; - dst[i].a = a_size? a * (1 / ((1 << a_size) - 1.0)) : 1.0; - dst[i].r = r_size? r * (1 / ((1 << r_size) - 1.0)) : 0.0; - dst[i].g = g_size? g * (1 / ((1 << g_size) - 1.0)) : 0.0; - dst[i].b = b_size? b * (1 / ((1 << b_size) - 1.0)) : 0.0; + dst[i].a = a_size? unorm_to_float (pixel >> a_shift, a_size) : 1.0; + dst[i].r = r_size? unorm_to_float (pixel >> r_shift, r_size) : 0.0; + dst[i].g = g_size? unorm_to_float (pixel >> g_shift, g_size) : 0.0; + dst[i].b = b_size? unorm_to_float (pixel >> b_shift, b_size) : 0.0; } } -static force_inline uint16_t -float_to_unorm (float f, int n_bits) +uint16_t +pixman_float_to_unorm (float f, int n_bits) { - uint32_t u; - - if (f > 1.0) - f = 1.0; - if (f < 0.0) - f = 0.0; - - u = f * (1 << n_bits); - u -= (u >> n_bits); + return float_to_unorm (f, n_bits); +} - return u; +float +pixman_unorm_to_float (uint16_t u, int n_bits) +{ + return unorm_to_float (u, n_bits); } void |