From: Carl Hetherington Date: Mon, 29 Jan 2024 10:31:30 +0000 (+0100) Subject: Separate out OtherParams into Other{RGB,YUV}Params. X-Git-Tag: v2.16.74~11 X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=ace4d751495a5284585f7877a79d9f69e70e3c95 Separate out OtherParams into Other{RGB,YUV}Params. --- diff --git a/src/lib/image.cc b/src/lib/image.cc index 2588d9f21..c6e7b418c 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -642,7 +642,8 @@ struct TargetParams }; -struct OtherParams +/** Parameters of the other image (the one being blended onto the target) when target and other are RGB */ +struct OtherRGBParams { int start_x; int start_y; @@ -661,9 +662,20 @@ struct OtherParams }; +/** Parameters of the other image (the one being blended onto the target) when target and other are YUV */ +struct OtherYUVParams +{ + int start_x; + int start_y; + dcp::Size size; + uint8_t* const* data; + int const* stride; +}; + + template void -alpha_blend_onto_rgb24(TargetParams const& target, OtherParams const& other, int red, int blue, std::function get, int value_divisor) +alpha_blend_onto_rgb24(TargetParams const& target, OtherRGBParams const& other, int red, int blue, std::function get, int value_divisor) { /* Going onto RGB24. First byte is red, second green, third blue */ auto const alpha_divisor = other.alpha_divisor(); @@ -685,7 +697,7 @@ alpha_blend_onto_rgb24(TargetParams const& target, OtherParams const& other, int template void -alpha_blend_onto_bgra(TargetParams const& target, OtherParams const& other, int red, int blue, std::function get, int value_divisor) +alpha_blend_onto_bgra(TargetParams const& target, OtherRGBParams const& other, int red, int blue, std::function get, int value_divisor) { auto const alpha_divisor = other.alpha_divisor(); for (int ty = target.start_y, oy = other.start_y; ty < target.size.height && oy < other.size.height; ++ty, ++oy) { @@ -707,7 +719,7 @@ alpha_blend_onto_bgra(TargetParams const& target, OtherParams const& other, int template void -alpha_blend_onto_rgba(TargetParams const& target, OtherParams const& other, int red, int blue, std::function get, int value_divisor) +alpha_blend_onto_rgba(TargetParams const& target, OtherRGBParams const& other, int red, int blue, std::function get, int value_divisor) { auto const alpha_divisor = other.alpha_divisor(); for (int ty = target.start_y, oy = other.start_y; ty < target.size.height && oy < other.size.height; ++ty, ++oy) { @@ -729,7 +741,7 @@ alpha_blend_onto_rgba(TargetParams const& target, OtherParams const& other, int template void -alpha_blend_onto_rgb48le(TargetParams const& target, OtherParams const& other, int red, int blue, std::function get, int value_scale) +alpha_blend_onto_rgb48le(TargetParams const& target, OtherRGBParams const& other, int red, int blue, std::function get, int value_scale) { auto const alpha_divisor = other.alpha_divisor(); for (int ty = target.start_y, oy = other.start_y; ty < target.size.height && oy < other.size.height; ++ty, ++oy) { @@ -750,7 +762,7 @@ alpha_blend_onto_rgb48le(TargetParams const& target, OtherParams const& other, i template void -alpha_blend_onto_xyz12le(TargetParams const& target, OtherParams const& other, int red, int blue, std::function get, int value_divisor) +alpha_blend_onto_xyz12le(TargetParams const& target, OtherRGBParams const& other, int red, int blue, std::function get, int value_divisor) { auto const alpha_divisor = other.alpha_divisor(); auto conv = dcp::ColourConversion::srgb_to_xyz(); @@ -788,7 +800,7 @@ alpha_blend_onto_xyz12le(TargetParams const& target, OtherParams const& other, i static void -alpha_blend_onto_yuv420p(TargetParams const& target, OtherParams const& other, uint8_t* const* alpha_data, int const* alpha_stride) +alpha_blend_onto_yuv420p(TargetParams const& target, OtherYUVParams const& other, uint8_t* const* alpha_data, int const* alpha_stride) { auto const ts = target.size; auto const os = other.size; @@ -825,7 +837,7 @@ alpha_blend_onto_yuv420p(TargetParams const& target, OtherParams const& other, u static void -alpha_blend_onto_yuv420p10(TargetParams const& target, OtherParams const& other, uint8_t* const* alpha_data, int const* alpha_stride) +alpha_blend_onto_yuv420p10(TargetParams const& target, OtherYUVParams const& other, uint8_t* const* alpha_data, int const* alpha_stride) { auto const ts = target.size; auto const os = other.size; @@ -862,7 +874,7 @@ alpha_blend_onto_yuv420p10(TargetParams const& target, OtherParams const& other, static void -alpha_blend_onto_yuv422p9or10le(TargetParams const& target, OtherParams const& other, uint8_t* const* alpha_data, int const* alpha_stride) +alpha_blend_onto_yuv422p9or10le(TargetParams const& target, OtherYUVParams const& other, uint8_t* const* alpha_data, int const* alpha_stride) { auto const ts = target.size; auto const os = other.size; @@ -932,7 +944,7 @@ Image::alpha_blend (shared_ptr other, Position position) 0 }; - OtherParams other_params = { + OtherRGBParams other_rgb_params = { start_ox, start_oy, other->size(), @@ -941,6 +953,14 @@ Image::alpha_blend (shared_ptr other, Position position) other->pixel_format() == AV_PIX_FMT_RGBA64BE ? 8 : 4 }; + OtherYUVParams other_yuv_params = { + start_ox, + start_oy, + other->size(), + other->data(), + other->stride(), + }; + auto byteswap = [](uint16_t* p) { return (*p >> 8) | ((*p & 0xff) << 8); }; @@ -953,66 +973,66 @@ Image::alpha_blend (shared_ptr other, Position position) case AV_PIX_FMT_RGB24: target_params.bpp = 3; if (other->pixel_format() == AV_PIX_FMT_RGBA64BE) { - alpha_blend_onto_rgb24(target_params, other_params, red, blue, byteswap, 256); + alpha_blend_onto_rgb24(target_params, other_rgb_params, red, blue, byteswap, 256); } else { - alpha_blend_onto_rgb24(target_params, other_params, red, blue, pass, 1); + alpha_blend_onto_rgb24(target_params, other_rgb_params, red, blue, pass, 1); } break; case AV_PIX_FMT_BGRA: target_params.bpp = 4; if (other->pixel_format() == AV_PIX_FMT_RGBA64BE) { - alpha_blend_onto_bgra(target_params, other_params, red, blue, byteswap, 256); + alpha_blend_onto_bgra(target_params, other_rgb_params, red, blue, byteswap, 256); } else { - alpha_blend_onto_bgra(target_params, other_params, red, blue, pass, 1); + alpha_blend_onto_bgra(target_params, other_rgb_params, red, blue, pass, 1); } break; case AV_PIX_FMT_RGBA: target_params.bpp = 4; if (other->pixel_format() == AV_PIX_FMT_RGBA64BE) { - alpha_blend_onto_rgba(target_params, other_params, red, blue, byteswap, 256); + alpha_blend_onto_rgba(target_params, other_rgb_params, red, blue, byteswap, 256); } else { - alpha_blend_onto_rgba(target_params, other_params, red, blue, pass, 1); + alpha_blend_onto_rgba(target_params, other_rgb_params, red, blue, pass, 1); } break; case AV_PIX_FMT_RGB48LE: target_params.bpp = 6; if (other->pixel_format() == AV_PIX_FMT_RGBA64BE) { - alpha_blend_onto_rgb48le(target_params, other_params, red, blue, byteswap, 1); + alpha_blend_onto_rgb48le(target_params, other_rgb_params, red, blue, byteswap, 1); } else { - alpha_blend_onto_rgb48le(target_params, other_params, red, blue, pass, 256); + alpha_blend_onto_rgb48le(target_params, other_rgb_params, red, blue, pass, 256); } break; case AV_PIX_FMT_XYZ12LE: target_params.bpp = 6; if (other->pixel_format() == AV_PIX_FMT_RGBA64BE) { - alpha_blend_onto_xyz12le(target_params, other_params, red, blue, byteswap, 256); + alpha_blend_onto_xyz12le(target_params, other_rgb_params, red, blue, byteswap, 256); } else { - alpha_blend_onto_xyz12le(target_params, other_params, red, blue, pass, 1); + alpha_blend_onto_xyz12le(target_params, other_rgb_params, red, blue, pass, 1); } break; case AV_PIX_FMT_YUV420P: { auto yuv = other->convert_pixel_format (dcp::YUVToRGB::REC709, _pixel_format, Alignment::COMPACT, false); - other_params.data = yuv->data(); - other_params.stride = yuv->stride(); - alpha_blend_onto_yuv420p(target_params, other_params, other->data(), other->stride()); + other_yuv_params.data = yuv->data(); + other_yuv_params.stride = yuv->stride(); + alpha_blend_onto_yuv420p(target_params, other_yuv_params, other->data(), other->stride()); break; } case AV_PIX_FMT_YUV420P10: { auto yuv = other->convert_pixel_format (dcp::YUVToRGB::REC709, _pixel_format, Alignment::COMPACT, false); - other_params.data = yuv->data(); - other_params.stride = yuv->stride(); - alpha_blend_onto_yuv420p10(target_params, other_params, other->data(), other->stride()); + other_yuv_params.data = yuv->data(); + other_yuv_params.stride = yuv->stride(); + alpha_blend_onto_yuv420p10(target_params, other_yuv_params, other->data(), other->stride()); break; } case AV_PIX_FMT_YUV422P9LE: case AV_PIX_FMT_YUV422P10LE: { auto yuv = other->convert_pixel_format (dcp::YUVToRGB::REC709, _pixel_format, Alignment::COMPACT, false); - other_params.data = yuv->data(); - other_params.stride = yuv->stride(); - alpha_blend_onto_yuv422p9or10le(target_params, other_params, other->data(), other->stride()); + other_yuv_params.data = yuv->data(); + other_yuv_params.stride = yuv->stride(); + alpha_blend_onto_yuv422p9or10le(target_params, other_yuv_params, other->data(), other->stride()); break; } default: