summaryrefslogtreecommitdiffstats
path: root/libass/ass_bitmap.c
diff options
context:
space:
mode:
authorDr.Smile <vabnick@gmail.com>2021-06-15 00:37:47 +0300
committerOleg Oshmyan <chortos@inbox.lv>2021-09-14 21:52:01 +0300
commited462af3fdd8867ab6dc1f8664aa392f21a494bf (patch)
tree8338e23757851f4358a6718d39a84d3edb3e5a7e /libass/ass_bitmap.c
parentc967a5a3d9ec0d36af1148b3fdf2f307a21dd122 (diff)
downloadlibass-ed462af3fdd8867ab6dc1f8664aa392f21a494bf.tar.bz2
libass-ed462af3fdd8867ab6dc1f8664aa392f21a494bf.tar.xz
renderer: use complementary equations for \clip and \iclip
Basic symmetry considerations require that clip_func(src, clip) = iclip_func(src, 255 - clip), but we use unrelated expressions for them: clip_func(src, clip) = (src * clip + 255) / 256 != iclip_func(src, iclip) = max(src - iclip, 0) = max(src + clip - 255, 0). Version with multiplication is more correct (albeit slower) as it gives results closer to the infinite resolution reference (per compare -s 8) in case of half-transparency. So I've picked better function (clip variant) and derived another from it.
Diffstat (limited to 'libass/ass_bitmap.c')
-rw-r--r--libass/ass_bitmap.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/libass/ass_bitmap.c b/libass/ass_bitmap.c
index d3186b4..5e2ca77 100644
--- a/libass/ass_bitmap.c
+++ b/libass/ass_bitmap.c
@@ -395,16 +395,14 @@ void ass_add_bitmaps_c(uint8_t *dst, intptr_t dst_stride,
}
}
-void ass_sub_bitmaps_c(uint8_t *dst, intptr_t dst_stride,
- uint8_t *src, intptr_t src_stride,
- intptr_t width, intptr_t height)
+void ass_imul_bitmaps_c(uint8_t *dst, intptr_t dst_stride,
+ uint8_t *src, intptr_t src_stride,
+ intptr_t width, intptr_t height)
{
- short out;
uint8_t* end = dst + dst_stride * height;
while (dst < end) {
for (unsigned j = 0; j < width; ++j) {
- out = dst[j] - src[j];
- dst[j] = FFMAX(out, 0);
+ dst[j] = (dst[j] * (255 - src[j]) + 255) >> 8;
}
dst += dst_stride;
src += src_stride;