diff options
author | wm4 <wm4@nowhere> | 2012-11-25 23:32:35 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2012-11-25 23:40:07 +0100 |
commit | 5d5ddb2ad00a13e719585cefbbb59fa307fa2f73 (patch) | |
tree | 51c67ee2f25cefbd09bbcb4275e4a3d5ee7a74ac /sub | |
parent | 24bfa82a91a49b0e2a120b719a6b89ac2b1b415b (diff) | |
download | mpv-5d5ddb2ad00a13e719585cefbbb59fa307fa2f73.tar.bz2 mpv-5d5ddb2ad00a13e719585cefbbb59fa307fa2f73.tar.xz |
sub: add --sub-gray option to display image subs in grayscale
MPlayer/mplayer2 still show DVD subtitles in gray. Depending on who you
ask, this can be considered a bug or a feature. Include rendering in
gray as explicit feature, so the user can decide what is better.
This affects all indexed sub bitmaps entering the OSD rendering path.
Currently, this means all image subs are affected by this option, but
nothing else.
Diffstat (limited to 'sub')
-rw-r--r-- | sub/img_convert.c | 35 | ||||
-rw-r--r-- | sub/img_convert.h | 2 | ||||
-rw-r--r-- | sub/sub.c | 7 |
3 files changed, 42 insertions, 2 deletions
diff --git a/sub/img_convert.c b/sub/img_convert.c index 274a83d833..578a20b646 100644 --- a/sub/img_convert.c +++ b/sub/img_convert.c @@ -128,3 +128,38 @@ bool osd_conv_blur_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; +} diff --git a/sub/img_convert.h b/sub/img_convert.h index eab543051c..2ea17ef889 100644 --- a/sub/img_convert.h +++ b/sub/img_convert.h @@ -11,7 +11,9 @@ struct osd_conv_cache *osd_conv_cache_new(void); // These functions convert from one OSD format to another. On success, they copy // the converted image data into c, and change imgs to point to the data. bool osd_conv_idx_to_rgba(struct osd_conv_cache *c, struct sub_bitmaps *imgs); +// Sub postprocessing bool osd_conv_blur_rgba(struct osd_conv_cache *c, struct sub_bitmaps *imgs, double gblur); +bool osd_conv_idx_to_gray(struct osd_conv_cache *c, struct sub_bitmaps *imgs); #endif @@ -221,11 +221,14 @@ static void render_object(struct osd_state *osd, struct osd_object *obj, bool cached = false; // do we have a copy of all the image data? + if (out_imgs->format == SUBBITMAP_INDEXED && opts->sub_gray) + cached |= osd_conv_idx_to_gray(obj->cache[0], out_imgs); + if (formats[SUBBITMAP_RGBA] && out_imgs->format == SUBBITMAP_INDEXED) - cached |= osd_conv_idx_to_rgba(obj->cache[0], out_imgs); + cached |= osd_conv_idx_to_rgba(obj->cache[1], out_imgs); if (out_imgs->format == SUBBITMAP_RGBA && opts->sub_gauss != 0.0f) - cached |= osd_conv_blur_rgba(obj->cache[1], out_imgs, opts->sub_gauss); + cached |= osd_conv_blur_rgba(obj->cache[2], out_imgs, opts->sub_gauss); if (cached) obj->cached = *out_imgs; |