#include "skia/ext/cicp.h"
namespace skia {
sk_sp<SkColorSpace> CICPGetSkColorSpace(uint8_t color_primaries,
uint8_t transfer_characteristics,
uint8_t matrix_coefficients,
uint8_t full_range_flag,
bool prefer_srgb_trfn) {
if (matrix_coefficients != 0) {
return nullptr;
}
if (full_range_flag != 1) {
return nullptr;
}
auto transfer_id =
static_cast<SkNamedTransferFn::CicpId>(transfer_characteristics);
if (prefer_srgb_trfn) {
switch (transfer_id) {
case SkNamedTransferFn::CicpId::kRec709:
case SkNamedTransferFn::CicpId::kRec601:
case SkNamedTransferFn::CicpId::kIEC61966_2_4:
transfer_id = SkNamedTransferFn::CicpId::kSRGB;
break;
default:
break;
};
}
auto primaries_id = static_cast<SkNamedPrimaries::CicpId>(color_primaries);
return SkColorSpace::MakeCICP(primaries_id, transfer_id);
}
bool CICPGetSkYUVColorSpace(uint8_t matrix_coefficients,
uint8_t full_range_flag,
uint8_t bits_per_color,
SkYUVColorSpace& yuv_color_space) {
switch (matrix_coefficients) {
case 0:
if (full_range_flag) {
yuv_color_space = kIdentity_SkYUVColorSpace;
return true;
}
break;
case 1:
yuv_color_space = full_range_flag ? kRec709_Full_SkYUVColorSpace
: kRec709_Limited_SkYUVColorSpace;
return true;
case 5:
case 6:
yuv_color_space = full_range_flag ? kJPEG_SkYUVColorSpace
: kRec601_Limited_SkYUVColorSpace;
return true;
case 9:
case 10:
switch (bits_per_color) {
case 8:
yuv_color_space = full_range_flag
? kBT2020_8bit_Full_SkYUVColorSpace
: kBT2020_8bit_Limited_SkYUVColorSpace;
return true;
case 10:
yuv_color_space = full_range_flag
? kBT2020_10bit_Full_SkYUVColorSpace
: kBT2020_10bit_Limited_SkYUVColorSpace;
return true;
case 12:
yuv_color_space = full_range_flag
? kBT2020_12bit_Full_SkYUVColorSpace
: kBT2020_12bit_Limited_SkYUVColorSpace;
return true;
case 16:
yuv_color_space = full_range_flag
? kBT2020_16bit_Full_SkYUVColorSpace
: kBT2020_16bit_Limited_SkYUVColorSpace;
return true;
default:
break;
}
break;
case 2:
case 3:
case 4:
case 7:
case 8:
case 11:
case 12:
case 13:
case 14:
default:
break;
}
yuv_color_space = kIdentity_SkYUVColorSpace;
return false;
}
}