comparison libmpcodecs/vf_ass.c @ 32261:0dd2b27940b5

vf_ass: avoid divisions in alpha blending. On a test case, it speeds up the blending by about 20%.
author cigaes
date Thu, 23 Sep 2010 17:08:10 +0000
parents 808e9d7eef5d
children b4c3659d16b1
comparison
equal deleted inserted replaced
32260:56dadca4f36d 32261:0dd2b27940b5
304 int dst_x, int dst_y, unsigned color) 304 int dst_x, int dst_y, unsigned color)
305 { 305 {
306 unsigned char y = rgba2y(color); 306 unsigned char y = rgba2y(color);
307 unsigned char u = rgba2u(color); 307 unsigned char u = rgba2u(color);
308 unsigned char v = rgba2v(color); 308 unsigned char v = rgba2v(color);
309 unsigned char opacity = 255 - _a(color); 309 unsigned opacity = 255 - _a(color);
310 unsigned char *src, *dsty, *dstu, *dstv; 310 unsigned char *src, *dsty, *dstu, *dstv;
311 int i, j; 311 int i, j;
312 mp_image_t *dmpi = vf->dmpi; 312 mp_image_t *dmpi = vf->dmpi;
313 313
314 opacity = (0x10203 * opacity + 0x80) >> 8; /* 0x10203 = (1<<32)/(255*255) */
315 /* 0 <= opacity <= 0x10101 */
314 src = bitmap; 316 src = bitmap;
315 dsty = dmpi->planes[0] + dst_x + dst_y * dmpi->stride[0]; 317 dsty = dmpi->planes[0] + dst_x + dst_y * dmpi->stride[0];
316 dstu = vf->priv->planes[1] + dst_x + dst_y * vf->priv->outw; 318 dstu = vf->priv->planes[1] + dst_x + dst_y * vf->priv->outw;
317 dstv = vf->priv->planes[2] + dst_x + dst_y * vf->priv->outw; 319 dstv = vf->priv->planes[2] + dst_x + dst_y * vf->priv->outw;
318 for (i = 0; i < bitmap_h; ++i) { 320 for (i = 0; i < bitmap_h; ++i) {
319 for (j = 0; j < bitmap_w; ++j) { 321 for (j = 0; j < bitmap_w; ++j) {
320 unsigned k = src[j]; 322 unsigned k = src[j];
321 if (!k) 323 if (!k)
322 continue; 324 continue;
323 k = k * opacity / 255; 325 k *= opacity; /* 0 <= k <= 0xFFFFFF */
324 dsty[j] = (k * y + (255 - k) * dsty[j]) / 255; 326 dsty[j] = (k * y + (0xFFFFFF - k) * dsty[j] + 0x800000) >> 24;
325 dstu[j] = (k * u + (255 - k) * dstu[j]) / 255; 327 dstu[j] = (k * u + (0xFFFFFF - k) * dstu[j] + 0x800000) >> 24;
326 dstv[j] = (k * v + (255 - k) * dstv[j]) / 255; 328 dstv[j] = (k * v + (0xFFFFFF - k) * dstv[j] + 0x800000) >> 24;
327 } 329 }
328 src += stride; 330 src += stride;
329 dsty += dmpi->stride[0]; 331 dsty += dmpi->stride[0];
330 dstu += vf->priv->outw; 332 dstu += vf->priv->outw;
331 dstv += vf->priv->outw; 333 dstv += vf->priv->outw;