summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2010-05-30 08:11:19 -0400
committerAndrea Canciani <ranma42@gmail.com>2010-12-13 17:22:35 +0100
commit47862b0abd7391a661628379d668bedaefdc3bcf (patch)
treed6ad002da189bed1fcb01e62de73cca479fe6992
parent2b33abbfab39c0ea620450846ca01cc0165b6679 (diff)
Some more conversion routines
-rw-r--r--pixman/pixman-utils.c61
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