diff options
author | Dr.Smile <vabnick@gmail.com> | 2021-12-05 09:37:24 +0300 |
---|---|---|
committer | Dr.Smile <vabnick@gmail.com> | 2022-12-04 02:17:38 +0300 |
commit | d3563e80a88c83d9253ea044dd2676d0914e4822 (patch) | |
tree | e604890c4b33fb5ef63553d8724c8a8597a52a9e /libass | |
parent | fceed8c028e0afc8e6860ad21d6d463f6a080043 (diff) | |
download | libass-d3563e80a88c83d9253ea044dd2676d0914e4822.tar.bz2 libass-d3563e80a88c83d9253ea044dd2676d0914e4822.tar.xz |
be_blur: reorganize code
Diffstat (limited to 'libass')
-rw-r--r-- | libass/ass_bitmap_engine.h | 4 | ||||
-rw-r--r-- | libass/c/c_be_blur.c | 76 | ||||
-rw-r--r-- | libass/x86/be_blur.asm | 4 |
3 files changed, 33 insertions, 51 deletions
diff --git a/libass/ass_bitmap_engine.h b/libass/ass_bitmap_engine.h index 3682984..3fbf6f2 100644 --- a/libass/ass_bitmap_engine.h +++ b/libass/ass_bitmap_engine.h @@ -39,8 +39,8 @@ typedef void BitmapMulFunc(uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *src2, ptrdiff_t src2_stride, size_t width, size_t height); -typedef void BeBlurFunc(uint8_t *buf, intptr_t stride, - intptr_t width, intptr_t height, uint16_t *tmp); +typedef void BeBlurFunc(uint8_t *buf, ptrdiff_t stride, + size_t width, size_t height, uint16_t *tmp); // intermediate bitmaps represented as sets of verical stripes of int16_t[alignment / 2] typedef void Convert8to16Func(int16_t *dst, const uint8_t *src, ptrdiff_t src_stride, diff --git a/libass/c/c_be_blur.c b/libass/c/c_be_blur.c index b8e25c9..e2ee10f 100644 --- a/libass/c/c_be_blur.c +++ b/libass/c/c_be_blur.c @@ -23,69 +23,51 @@ #include <stdint.h> +static inline uint16_t sliding_sum(uint16_t *prev, uint16_t next) +{ + uint16_t sum = *prev + next; + *prev = next; + return sum; +} + /** * \brief Blur with [[1,2,1], [2,4,2], [1,2,1]] kernel * This blur is the same as the one employed by vsfilter. * Pure C implementation. */ -void ass_be_blur_c(uint8_t *buf, intptr_t stride, - intptr_t width, intptr_t height, uint16_t *tmp) +void ass_be_blur_c(uint8_t *buf, ptrdiff_t stride, + size_t width, size_t height, uint16_t *tmp) { uint16_t *col_pix_buf = tmp; - uint16_t *col_sum_buf = tmp + width; - unsigned x, y, old_pix, old_sum, temp1, temp2; - uint8_t *src, *dst; - y = 0; + uint16_t *col_sum_buf = tmp + stride; { - src=buf+y*stride; - - x = 1; - old_pix = src[x-1]; - old_sum = old_pix; + size_t x = 1; + uint16_t sum = buf[x - 1]; for ( ; x < width; x++) { - temp1 = src[x]; - temp2 = old_pix + temp1; - old_pix = temp1; - temp1 = old_sum + temp2; - old_sum = temp2; - col_pix_buf[x-1] = temp1; - col_sum_buf[x-1] = temp1; + uint16_t col_pix = sliding_sum(&sum, buf[x - 1] + buf[x]); + col_pix_buf[x - 1] = col_sum_buf[x - 1] = col_pix; } - temp1 = old_sum + old_pix; - col_pix_buf[x-1] = temp1; - col_sum_buf[x-1] = temp1; + uint16_t col_pix = sum + buf[x - 1]; + col_pix_buf[x - 1] = col_sum_buf[x - 1] = col_pix; } - for (y++; y < height; y++) { - src=buf+y*stride; - dst=buf+(y-1)*stride; + for (size_t y = 1; y < height; y++) { + uint8_t *dst = buf; + buf += stride; - x = 1; - old_pix = src[x-1]; - old_sum = old_pix; + size_t x = 1; + uint16_t sum = buf[x - 1]; for ( ; x < width; x++) { - temp1 = src[x]; - temp2 = old_pix + temp1; - old_pix = temp1; - temp1 = old_sum + temp2; - old_sum = temp2; - - temp2 = col_pix_buf[x-1] + temp1; - col_pix_buf[x-1] = temp1; - dst[x-1] = (col_sum_buf[x-1] + temp2) >> 4; - col_sum_buf[x-1] = temp2; + uint16_t col_pix = sliding_sum(&sum, buf[x - 1] + buf[x]); + uint16_t col_sum = sliding_sum(&col_pix_buf[x - 1], col_pix); + dst[x - 1] = sliding_sum(&col_sum_buf[x - 1], col_sum) >> 4; } - temp1 = old_sum + old_pix; - temp2 = col_pix_buf[x-1] + temp1; - col_pix_buf[x-1] = temp1; - dst[x-1] = (col_sum_buf[x-1] + temp2) >> 4; - col_sum_buf[x-1] = temp2; + uint16_t col_pix = sum + buf[x - 1]; + uint16_t col_sum = sliding_sum(&col_pix_buf[x - 1], col_pix); + dst[x - 1] = sliding_sum(&col_sum_buf[x - 1], col_sum) >> 4; } - { - dst=buf+(y-1)*stride; - for (x = 0; x < width; x++) - dst[x] = (col_sum_buf[x] + col_pix_buf[x]) >> 4; - } + for (size_t x = 0; x < width; x++) + buf[x] = (col_sum_buf[x] + col_pix_buf[x]) >> 4; } diff --git a/libass/x86/be_blur.asm b/libass/x86/be_blur.asm index 3f5bcb3..e461907 100644 --- a/libass/x86/be_blur.asm +++ b/libass/x86/be_blur.asm @@ -24,8 +24,8 @@ SECTION .text ;------------------------------------------------------------------------------ ; BE_BLUR -; void be_blur(uint8_t *buf, intptr_t stride, -; intptr_t width, intptr_t height, uint16_t *tmp); +; void be_blur(uint8_t *buf, ptrdiff_t stride, +; size_t width, size_t height, uint16_t *tmp); ;------------------------------------------------------------------------------ %macro BE_BLUR 0 |