diff options
author | Martin Herkt <lachs0r@srsfckn.biz> | 2016-06-25 02:25:44 +0200 |
---|---|---|
committer | Martin Herkt <lachs0r@srsfckn.biz> | 2016-06-25 02:25:44 +0200 |
commit | ad56f2c46ac6deec86870ec10f2a11a644df07d4 (patch) | |
tree | 89f2d90c5586560911e67c872b530c77f151168d /sub/img_convert.c | |
parent | 0536841647ef7931bffb4386d8ffbb5b2b568e8a (diff) | |
parent | 393bb2a565dc1e27812e1dd20747814892f80da2 (diff) | |
download | mpv-ad56f2c46ac6deec86870ec10f2a11a644df07d4.tar.bz2 mpv-ad56f2c46ac6deec86870ec10f2a11a644df07d4.tar.xz |
Merge branch 'master' into release/current
Diffstat (limited to 'sub/img_convert.c')
-rw-r--r-- | sub/img_convert.c | 144 |
1 files changed, 13 insertions, 131 deletions
diff --git a/sub/img_convert.c b/sub/img_convert.c index d86b8f4ad1..78be881fdf 100644 --- a/sub/img_convert.c +++ b/sub/img_convert.c @@ -41,106 +41,21 @@ struct osd_conv_cache *osd_conv_cache_new(void) return talloc_zero(NULL, struct osd_conv_cache); } -static void rgba_to_premultiplied_rgba(uint32_t *colors, size_t count) +void mp_blur_rgba_sub_bitmap(struct sub_bitmap *d, double gblur) { - for (int n = 0; n < count; n++) { - uint32_t c = colors[n]; - unsigned b = c & 0xFF; - unsigned g = (c >> 8) & 0xFF; - unsigned r = (c >> 16) & 0xFF; - unsigned a = (c >> 24) & 0xFF; - b = b * a / 255; - g = g * a / 255; - r = r * a / 255; - colors[n] = b | (g << 8) | (r << 16) | (a << 24); - } -} - -bool osd_conv_idx_to_rgba(struct osd_conv_cache *c, struct sub_bitmaps *imgs) -{ - struct sub_bitmaps src = *imgs; - if (src.format != SUBBITMAP_INDEXED) - return false; - - imgs->format = SUBBITMAP_RGBA; - talloc_free(c->parts); - imgs->parts = c->parts = talloc_array(c, struct sub_bitmap, src.num_parts); - - for (int n = 0; n < src.num_parts; n++) { - struct sub_bitmap *d = &imgs->parts[n]; - struct sub_bitmap *s = &src.parts[n]; - struct osd_bmp_indexed sb = *(struct osd_bmp_indexed *)s->bitmap; - - rgba_to_premultiplied_rgba(sb.palette, 256); - - *d = *s; - struct mp_image *image = mp_image_alloc(IMGFMT_BGRA, s->w, s->h); - talloc_steal(c->parts, image); - if (!image) { - // on OOM, skip the region by making it 0 sized - d->w = d->h = d->dw = d->dh = 0; - continue; - } - - d->stride = image->stride[0]; - d->bitmap = image->planes[0]; - - for (int y = 0; y < s->h; y++) { - uint8_t *inbmp = sb.bitmap + y * s->stride; - uint32_t *outbmp = (uint32_t*)((uint8_t*)d->bitmap + y * d->stride); - for (int x = 0; x < s->w; x++) - *outbmp++ = sb.palette[*inbmp++]; - } - } - return true; -} - -bool osd_conv_blur_rgba(struct osd_conv_cache *c, struct sub_bitmaps *imgs, - double gblur) -{ - struct sub_bitmaps src = *imgs; - if (src.format != SUBBITMAP_RGBA) - return false; - - talloc_free(c->parts); - imgs->parts = c->parts = talloc_array(c, struct sub_bitmap, src.num_parts); - - for (int n = 0; n < src.num_parts; n++) { - struct sub_bitmap *d = &imgs->parts[n]; - struct sub_bitmap *s = &src.parts[n]; + struct mp_image *tmp1 = mp_image_alloc(IMGFMT_BGRA, d->w, d->h); + if (tmp1) { // on OOM, skip region + struct mp_image s = {0}; + mp_image_setfmt(&s, IMGFMT_BGRA); + mp_image_set_size(&s, d->w, d->h); + s.stride[0] = d->stride; + s.planes[0] = d->bitmap; - // add a transparent padding border to reduce artifacts - int pad = 5; - struct mp_image *temp = mp_image_alloc(IMGFMT_BGRA, s->w + pad * 2, - s->h + pad * 2); - if (!temp) - continue; // on OOM, skip region - memset_pic(temp->planes[0], 0, temp->w * 4, temp->h, temp->stride[0]); - uint8_t *p0 = temp->planes[0] + pad * 4 + pad * temp->stride[0]; - memcpy_pic(p0, s->bitmap, s->w * 4, s->h, temp->stride[0], s->stride); - - double sx = (double)s->dw / s->w; - double sy = (double)s->dh / s->h; - - d->x = s->x - pad * sx; - d->y = s->y - pad * sy; - d->w = d->dw = s->dw + pad * 2 * sx; - d->h = d->dh = s->dh + pad * 2 * sy; - struct mp_image *image = mp_image_alloc(IMGFMT_BGRA, d->w, d->h); - talloc_steal(c->parts, image); - if (image) { - d->stride = image->stride[0]; - d->bitmap = image->planes[0]; + mp_image_copy(tmp1, &s); - mp_image_sw_blur_scale(image, temp, gblur); - } else { - // on OOM, skip region - *d = *s; - } - - talloc_free(temp); + mp_image_sw_blur_scale(&s, tmp1, gblur); } - return true; + talloc_free(tmp1); } // If RGBA parts need scaling, scale them. @@ -161,6 +76,7 @@ bool osd_scale_rgba(struct osd_conv_cache *c, struct sub_bitmaps *imgs) talloc_free(c->parts); imgs->parts = c->parts = talloc_array(c, struct sub_bitmap, src.num_parts); + imgs->packed = NULL; // Note: we scale all parts, since most likely all need scaling anyway, and // to get a proper copy of all data in the imgs list. @@ -193,41 +109,6 @@ bool osd_scale_rgba(struct osd_conv_cache *c, struct sub_bitmaps *imgs) return true; } -static void rgba_to_gray(uint32_t *colors, size_t count) -{ - for (int n = 0; n < count; n++) { - uint32_t c = colors[n]; - int b = c & 0xFF; - int g = (c >> 8) & 0xFF; - int r = (c >> 16) & 0xFF; - int a = (c >> 24) & 0xFF; - r = g = b = (r + g + b) / 3; - colors[n] = b | (g << 8) | (r << 16) | (a << 24); - } -} - -bool osd_conv_idx_to_gray(struct osd_conv_cache *c, struct sub_bitmaps *imgs) -{ - struct sub_bitmaps src = *imgs; - if (src.format != SUBBITMAP_INDEXED) - return false; - - talloc_free(c->parts); - imgs->parts = c->parts = talloc_array(c, struct sub_bitmap, src.num_parts); - - for (int n = 0; n < src.num_parts; n++) { - struct sub_bitmap *d = &imgs->parts[n]; - struct sub_bitmap *s = &src.parts[n]; - struct osd_bmp_indexed sb = *(struct osd_bmp_indexed *)s->bitmap; - - rgba_to_gray(sb.palette, 256); - - *d = *s; - d->bitmap = talloc_memdup(c->parts, &sb, sizeof(sb)); - } - return true; -} - static void draw_ass_rgba(unsigned char *src, int src_w, int src_h, int src_stride, unsigned char *dst, size_t dst_stride, int dst_x, int dst_y, uint32_t color) @@ -274,6 +155,7 @@ bool osd_conv_ass_to_rgba(struct osd_conv_cache *c, struct sub_bitmaps *imgs) imgs->format = SUBBITMAP_RGBA; imgs->parts = c->part; imgs->num_parts = num_bb; + imgs->packed = NULL; size_t newsize = 0; for (int n = 0; n < num_bb; n++) { |