mirror of
https://github.com/mpv-player/mpv
synced 2025-01-11 17:39:38 +00:00
draw_bmp: refactor
This commit is contained in:
parent
c652e3f6b1
commit
5c049bf577
@ -443,6 +443,35 @@ static bool get_sub_area(struct mp_rect bb, struct mp_image *temp,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Convert the src image to imgfmt (which should be a 444 format)
|
||||||
|
static struct mp_image *chroma_up(struct mp_draw_sub_cache *cache, int imgfmt,
|
||||||
|
struct mp_image *src)
|
||||||
|
{
|
||||||
|
if (src->imgfmt == imgfmt)
|
||||||
|
return src;
|
||||||
|
|
||||||
|
struct mp_image *temp = mp_image_alloc(imgfmt, src->w, src->h);
|
||||||
|
// temp is always YUV, but src not necessarily
|
||||||
|
// reduce amount of conversions in YUV case (upsampling/shifting only)
|
||||||
|
if (src->flags & MP_IMGFLAG_YUV) {
|
||||||
|
temp->colorspace = src->colorspace;
|
||||||
|
temp->levels = src->levels;
|
||||||
|
}
|
||||||
|
mp_image_swscale(temp, src, SWS_POINT); // chroma up
|
||||||
|
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Undo chroma_up()
|
||||||
|
static void chroma_down(struct mp_image *old_src, struct mp_image *temp)
|
||||||
|
{
|
||||||
|
assert(old_src->w == temp->w && old_src->h == temp->h);
|
||||||
|
if (temp != old_src) {
|
||||||
|
mp_image_swscale(old_src, temp, SWS_AREA); // chroma down
|
||||||
|
talloc_free(temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// cache: if not NULL, the function will set *cache to a talloc-allocated cache
|
// cache: if not NULL, the function will set *cache to a talloc-allocated cache
|
||||||
// containing scaled versions of sbs contents - free the cache with
|
// containing scaled versions of sbs contents - free the cache with
|
||||||
// talloc_free()
|
// talloc_free()
|
||||||
@ -467,21 +496,9 @@ void mp_draw_sub_bitmaps(struct mp_draw_sub_cache **cache, struct mp_image *dst,
|
|||||||
if (!align_bbox_for_swscale(dst, &bb))
|
if (!align_bbox_for_swscale(dst, &bb))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
struct mp_image *temp;
|
|
||||||
struct mp_image dst_region = *dst;
|
struct mp_image dst_region = *dst;
|
||||||
mp_image_crop_rc(&dst_region, bb);
|
mp_image_crop_rc(&dst_region, bb);
|
||||||
if (dst->imgfmt == format) {
|
struct mp_image *temp = chroma_up(cache_, format, &dst_region);
|
||||||
temp = &dst_region;
|
|
||||||
} else {
|
|
||||||
temp = mp_image_alloc(format, bb.x1 - bb.x0, bb.y1 - bb.y0);
|
|
||||||
// temp is always YUV, dst_region not
|
|
||||||
// reduce amount of conversions in YUV case (upsampling/shifting only)
|
|
||||||
if (dst_region.flags & MP_IMGFLAG_YUV) {
|
|
||||||
temp->colorspace = dst_region.colorspace;
|
|
||||||
temp->levels = dst_region.levels;
|
|
||||||
}
|
|
||||||
mp_image_swscale(temp, &dst_region, SWS_POINT); // chroma up
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sbs->format == SUBBITMAP_RGBA) {
|
if (sbs->format == SUBBITMAP_RGBA) {
|
||||||
draw_rgba(cache_, bb, temp, bits, sbs);
|
draw_rgba(cache_, bb, temp, bits, sbs);
|
||||||
@ -489,10 +506,7 @@ void mp_draw_sub_bitmaps(struct mp_draw_sub_cache **cache, struct mp_image *dst,
|
|||||||
draw_ass(cache_, bb, temp, bits, sbs);
|
draw_ass(cache_, bb, temp, bits, sbs);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (temp != &dst_region) {
|
chroma_down(&dst_region, temp);
|
||||||
mp_image_swscale(&dst_region, temp, SWS_AREA); // chroma down
|
|
||||||
talloc_free(temp);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cache) {
|
if (cache) {
|
||||||
*cache = cache_;
|
*cache = cache_;
|
||||||
|
Loading…
Reference in New Issue
Block a user