videomixer: Don't do floating point math in the inner processing loop for I420 blending
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 11 Dec 2009 11:35:59 +0000 (12:35 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 11 Dec 2009 11:36:42 +0000 (12:36 +0100)
gst/videomixer/blend_i420.c

index 46acb70..fb672f6 100644 (file)
@@ -190,6 +190,7 @@ gst_i420_do_blend (guint8 * src, guint8 * dest,
     gint dest_width, gdouble src_alpha)
 {
   int i, j;
+  gint b_alpha;
 
   /* If it's completely transparent... we just return */
   if (G_UNLIKELY (src_alpha == 0.0)) {
@@ -208,9 +209,11 @@ gst_i420_do_blend (guint8 * src, guint8 * dest,
     return;
   }
 
+  b_alpha = (gint) (src_alpha * 255);
+
   for (i = 0; i < src_height; i++) {
     for (j = 0; j < src_width; j++) {
-      *dest = src_alpha * (*src) + (1. - src_alpha) * (*dest);
+      *dest = (b_alpha * (*src) + (255 - b_alpha) * (*dest)) >> 16;
       dest++;
       src++;
     }