summaryrefslogtreecommitdiff
path: root/src/xine-engine/alphablend.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xine-engine/alphablend.c')
-rw-r--r--src/xine-engine/alphablend.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/xine-engine/alphablend.c b/src/xine-engine/alphablend.c
index b6e284ccd..0b5e3252f 100644
--- a/src/xine-engine/alphablend.c
+++ b/src/xine-engine/alphablend.c
@@ -2171,3 +2171,33 @@ void _x_alphablend_free(alphablend_t *extra_data)
extra_data->buffer_size = 0;
}
+#define saturate(n, l, u) ((n) < (l) ? (l) : ((n) > (u) ? (u) : (n)))
+
+void _x_clut_yuv2rgb(uint32_t *clut, int num_items)
+{
+ uint32_t *end = clut + num_items;
+ if (end <= clut) return;
+
+ while (clut < end) {
+ union {
+ uint32_t u32;
+ clut_t c;
+ } tmp = { *clut };
+
+ int y, u, v, r, g, b;
+ y = saturate(tmp.c.y, 16, 235);
+ u = saturate(tmp.c.cb, 16, 240);
+ v = saturate(tmp.c.cr, 16, 240);
+
+ y = (9 * y) / 8;
+ r = y + (25 * v) / 16 - 218;
+ g = y + (-13 * v) / 16 + (-25 * u) / 64 + 136;
+ b = y + 2 * u - 274;
+
+ tmp.c.cb = saturate(b, 0, 255);
+ tmp.c.cr = saturate(g, 0, 255);
+ tmp.c.y = saturate(r, 0, 255);
+
+ *clut++ = tmp.u32;
+ }
+}