Mercurial > mplayer.hg
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; |