diff --git a/src/OpenColorIO/transforms/builtins/ACES.cpp b/src/OpenColorIO/transforms/builtins/ACES.cpp index 47a0a6b08..bb7e75988 100644 --- a/src/OpenColorIO/transforms/builtins/ACES.cpp +++ b/src/OpenColorIO/transforms/builtins/ACES.cpp @@ -497,6 +497,90 @@ void Generate_roll_white_d65_ops(OpRcPtrVec & ops) } // namespace ACES_OUTPUT +namespace ACES2_OUTPUT +{ + void Generate_output_transform( + OpRcPtrVec & ops, + float peak_luminance, + const Primaries & limiting_pri, + const Primaries & encoding_pri, + float linear_scale, + bool scale_white) + { + // Clamp to AP1 + MatrixOpData::MatrixArrayPtr matrixToAP1 + = build_conversion_matrix(ACES_AP0::primaries, ACES_AP1::primaries, ADAPTATION_NONE); + CreateMatrixOp(ops, matrixToAP1, TRANSFORM_DIR_FORWARD); + + CreateRangeOp(ops, + 0., RangeOpData::EmptyValue(), + 0., RangeOpData::EmptyValue(), + TRANSFORM_DIR_FORWARD); + + CreateMatrixOp(ops, matrixToAP1, TRANSFORM_DIR_INVERSE); + + // ACES2 display rendering + const Primaries & input_pri = ACES_AP0::primaries; + CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_RGB_TO_JMh_20, { + input_pri.m_red.m_xy[0], input_pri.m_red.m_xy[1], + input_pri.m_grn.m_xy[0], input_pri.m_grn.m_xy[1], + input_pri.m_blu.m_xy[0], input_pri.m_blu.m_xy[1], + input_pri.m_wht.m_xy[0], input_pri.m_wht.m_xy[1], + }); + + CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_TONESCALE_COMPRESS_20_FWD, { + peak_luminance + }); + + CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_GAMUT_COMPRESS_20_FWD, { + peak_luminance, + limiting_pri.m_red.m_xy[0], limiting_pri.m_red.m_xy[1], + limiting_pri.m_grn.m_xy[0], limiting_pri.m_grn.m_xy[1], + limiting_pri.m_blu.m_xy[0], limiting_pri.m_blu.m_xy[1], + limiting_pri.m_wht.m_xy[0], limiting_pri.m_wht.m_xy[1], + }); + + CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_JMh_TO_RGB_20, { + limiting_pri.m_red.m_xy[0], limiting_pri.m_red.m_xy[1], + limiting_pri.m_grn.m_xy[0], limiting_pri.m_grn.m_xy[1], + limiting_pri.m_blu.m_xy[0], limiting_pri.m_blu.m_xy[1], + limiting_pri.m_wht.m_xy[0], limiting_pri.m_wht.m_xy[1], + }); + + // White point simulation + if (scale_white) + { + MatrixOpData::MatrixArrayPtr matrixLimToOut + = build_conversion_matrix(limiting_pri, encoding_pri, ADAPTATION_NONE); + + MatrixOpData::Offsets white(1.f, 1.f, 1.f, 0.f); + white = matrixLimToOut->inner(white); + + const double scale = 1. / std::max(std::max(white[0], white[1]), white[2]); + const double scale4[4] = { scale, scale, scale, 1. }; + CreateScaleOp(ops, scale4, TRANSFORM_DIR_FORWARD); + } + + // Linear scale factor + if (linear_scale != 1.f) + { + const double scale = linear_scale; + const double scale4[4] = { scale, scale, scale, 1. }; + CreateScaleOp(ops, scale4, TRANSFORM_DIR_FORWARD); + } + + CreateRangeOp(ops, + 0., RangeOpData::EmptyValue(), + 0., RangeOpData::EmptyValue(), + TRANSFORM_DIR_FORWARD); + + MatrixOpData::MatrixArrayPtr matrixToXYZ + = build_conversion_matrix_to_XYZ_D65(limiting_pri, ADAPTATION_NONE); + CreateMatrixOp(ops, matrixToXYZ, TRANSFORM_DIR_FORWARD); + } + +} // namespace ACES2_OUTPUT + // // Create the built-in transforms. // @@ -1051,191 +1135,320 @@ void RegisterAll(BuiltinTransformRegistryImpl & registry) noexcept // ACES 2 OUTPUT TRANSFORMS // + struct ACES2OutputTransform { - auto ACES2065_1_to_CIE_XYZ_video_rec709lim_2_0_Functor = [](OpRcPtrVec & ops) - { - MatrixOpData::MatrixArrayPtr matrixToAP1 - = build_conversion_matrix(ACES_AP0::primaries, ACES_AP1::primaries, ADAPTATION_NONE); - CreateMatrixOp(ops, matrixToAP1, TRANSFORM_DIR_FORWARD); - - CreateRangeOp(ops, - 0., RangeOpData::EmptyValue(), - 0., RangeOpData::EmptyValue(), - TRANSFORM_DIR_FORWARD); - - CreateMatrixOp(ops, matrixToAP1, TRANSFORM_DIR_INVERSE); - - const Primaries & InP = ACES_AP0::primaries; - CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_RGB_TO_JMh_20, { - InP.m_red.m_xy[0], InP.m_red.m_xy[1], - InP.m_grn.m_xy[0], InP.m_grn.m_xy[1], - InP.m_blu.m_xy[0], InP.m_blu.m_xy[1], - InP.m_wht.m_xy[0], InP.m_wht.m_xy[1], - }); - - const float peak_luminance = 100.f; - CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_TONESCALE_COMPRESS_20_FWD, { - peak_luminance - }); - - const Primaries & LimP = REC709::primaries; - CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_GAMUT_COMPRESS_20_FWD, { - peak_luminance, - LimP.m_red.m_xy[0], LimP.m_red.m_xy[1], - LimP.m_grn.m_xy[0], LimP.m_grn.m_xy[1], - LimP.m_blu.m_xy[0], LimP.m_blu.m_xy[1], - LimP.m_wht.m_xy[0], LimP.m_wht.m_xy[1], - }); - - const Primaries & OutP = REC709::primaries; - CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_JMh_TO_RGB_20, { - OutP.m_red.m_xy[0], OutP.m_red.m_xy[1], - OutP.m_grn.m_xy[0], OutP.m_grn.m_xy[1], - OutP.m_blu.m_xy[0], OutP.m_blu.m_xy[1], - OutP.m_wht.m_xy[0], OutP.m_wht.m_xy[1], - }); - - CreateRangeOp(ops, - 0., RangeOpData::EmptyValue(), - 0., RangeOpData::EmptyValue(), - TRANSFORM_DIR_FORWARD); - - MatrixOpData::MatrixArrayPtr matrixToXYZ - = build_conversion_matrix_to_XYZ_D65(REC709::primaries, ADAPTATION_BRADFORD); - CreateMatrixOp(ops, matrixToXYZ, TRANSFORM_DIR_FORWARD); - }; - - registry.addBuiltin("ACES-2-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-REC709lim", - "Component of ACES 2 Output Transforms for SDR D65 video", - ACES2065_1_to_CIE_XYZ_video_rec709lim_2_0_Functor); - } + std::string name; + std::string desc; + float peak_luminance; + Primaries limiting_primaries; + Primaries encoding_primaries; + float linear_scale; + bool scale_white; + }; - { - auto ACES2065_1_to_CIE_XYZ_video_rec709d60lim_2_0_Functor = [](OpRcPtrVec & ops) + const std::vector aces2_output_transforms { + // + // D65 + // { - MatrixOpData::MatrixArrayPtr matrixToAP1 - = build_conversion_matrix(ACES_AP0::primaries, ACES_AP1::primaries, ADAPTATION_NONE); - CreateMatrixOp(ops, matrixToAP1, TRANSFORM_DIR_FORWARD); - - CreateRangeOp(ops, - 0., RangeOpData::EmptyValue(), - 0., RangeOpData::EmptyValue(), - TRANSFORM_DIR_FORWARD); - - CreateMatrixOp(ops, matrixToAP1, TRANSFORM_DIR_INVERSE); - - const Primaries & InP = ACES_AP0::primaries; - CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_RGB_TO_JMh_20, { - InP.m_red.m_xy[0], InP.m_red.m_xy[1], - InP.m_grn.m_xy[0], InP.m_grn.m_xy[1], - InP.m_blu.m_xy[0], InP.m_blu.m_xy[1], - InP.m_wht.m_xy[0], InP.m_wht.m_xy[1], - }); - - const float peak_luminance = 100.f; - CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_TONESCALE_COMPRESS_20_FWD, { - peak_luminance - }); - - const Primaries & LimP = REC709_D60::primaries; - CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_GAMUT_COMPRESS_20_FWD, { - peak_luminance, - LimP.m_red.m_xy[0], LimP.m_red.m_xy[1], - LimP.m_grn.m_xy[0], LimP.m_grn.m_xy[1], - LimP.m_blu.m_xy[0], LimP.m_blu.m_xy[1], - LimP.m_wht.m_xy[0], LimP.m_wht.m_xy[1], - }); - - CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_JMh_TO_RGB_20, { - LimP.m_red.m_xy[0], LimP.m_red.m_xy[1], - LimP.m_grn.m_xy[0], LimP.m_grn.m_xy[1], - LimP.m_blu.m_xy[0], LimP.m_blu.m_xy[1], - LimP.m_wht.m_xy[0], LimP.m_wht.m_xy[1], - }); - - const Primaries & OutP = REC709::primaries; - MatrixOpData::MatrixArrayPtr limToOut - = build_conversion_matrix(LimP, OutP, ADAPTATION_NONE); - CreateMatrixOp(ops, limToOut, TRANSFORM_DIR_FORWARD); - - MatrixOpData::Offsets white(1.f, 1.f, 1.f, 0.f); - white = limToOut->inner(white); - const double scale = 1. / std::max(std::max(white[0], white[1]), white[2]); - const double scale4[4] = { scale, scale, scale, 1. }; - CreateScaleOp(ops, scale4, TRANSFORM_DIR_FORWARD); - - CreateRangeOp(ops, - 0., RangeOpData::EmptyValue(), - 0., RangeOpData::EmptyValue(), - TRANSFORM_DIR_FORWARD); - - MatrixOpData::MatrixArrayPtr matrixToXYZ - = build_conversion_matrix_to_XYZ_D65(OutP, ADAPTATION_BRADFORD); - CreateMatrixOp(ops, matrixToXYZ, TRANSFORM_DIR_FORWARD); - }; - - registry.addBuiltin("ACES-2-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-REC709-D60lim", - "Component of ACES 2 Output Transforms for SDR D65 video", - ACES2065_1_to_CIE_XYZ_video_rec709d60lim_2_0_Functor); - } + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709_2.0", + "Component of ACES 2 Output Transforms for 100 nit SDR Rec709", + 100.f, + REC709::primaries, + REC709::primaries, + 1.f, + false + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 100 nit SDR P3-D65", + 100.f, + P3_D65::primaries, + P3_D65::primaries, + 1.f, + false + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-108nit-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 108 nit HDR P3-D65", + 225.f, // = 108 * (100/48); + P3_D65::primaries, + P3_D65::primaries, + 0.48f, + false + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-300nit-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 300 nit HDR P3-D65", + 625.f, // = 300 * (100/48); + REC709::primaries, + REC709::primaries, + 0.48f, + false + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 500 nit HDR P3-D65", + 500.f, + P3_D65::primaries, + P3_D65::primaries, + 1.f, + false + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 1000 nit HDR P3-D65", + 1000.f, + P3_D65::primaries, + P3_D65::primaries, + 1.f, + false + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 2000 nit HDR P3-D65", + 2000.f, + P3_D65::primaries, + P3_D65::primaries, + 1.f, + false + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 4000 nit HDR P3-D65", + 4000.f, + P3_D65::primaries, + P3_D65::primaries, + 1.f, + false + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-REC2020_2.0", + "Component of ACES 2 Output Transforms for 500 nit HDR Rec2020", + 500.f, + REC2020::primaries, + REC2020::primaries, + 1.f, + false + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-REC2020_2.0", + "Component of ACES 2 Output Transforms for 1000 nit HDR Rec2020", + 1000.f, + REC2020::primaries, + REC2020::primaries, + 1.f, + false + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-REC2020_2.0", + "Component of ACES 2 Output Transforms for 2000 nit HDR Rec2020", + 2000.f, + REC2020::primaries, + REC2020::primaries, + 1.f, + false + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-REC2020_2.0", + "Component of ACES 2 Output Transforms for 4000 nit HDR Rec2020", + 4000.f, + REC2020::primaries, + REC2020::primaries, + 1.f, + false + }, + // + // D60 + // + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709-D60-in-REC709-D65_2.0", + "Component of ACES 2 Output Transforms for 100 nit SDR Rec709 simulating D60 white in Rec709", + 100.f, + REC709_D60::primaries, + REC709::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709-D60-in-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 100 nit SDR Rec709 simulating D60 white in P3-D65", + 100.f, + REC709_D60::primaries, + P3_D65::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709-D60-in-REC2020-D65_2.0", + "Component of ACES 2 Output Transforms for 100 nit SDR Rec709 simulating D60 white in Rec2020", + 100.f, + REC709_D60::primaries, + REC2020::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-P3-D60-in-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 100 nit SDR P3-D60 simulating D60 white in P3-D65", + 100.f, + P3_D60::primaries, + P3_D65::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-P3-D60-in-XYZ-E_2.0", + "Component of ACES 2 Output Transforms for 100 nit SDR P3-D60 simulating D60 white in XYZ-E", + 100.f, + P3_D60::primaries, + CIE_XYZ_ILLUM_E::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-108nit-P3-D60-in-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 108 nit HDR P3-D60 simulating D60 white in P3-D65", + 225.f, // = 108 * (100/48); + P3_D60::primaries, + P3_D65::primaries, + 0.48f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-300nit-P3-D60-in-XYZ-E_2.0", + "Component of ACES 2 Output Transforms for 300 nit HDR P3-D60 simulating D60 white in XYZ-E", + 625.f, // = 300 * (100/48); + P3_D60::primaries, + CIE_XYZ_ILLUM_E::primaries, + 0.48f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-P3-D60-in-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 500 nit HDR P3-D60 simulating D60 white in P3-D65", + 500.f, + P3_D60::primaries, + P3_D65::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-P3-D60-in-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 1000 nit HDR P3-D60 simulating D60 white in P3-D65", + 1000.f, + P3_D60::primaries, + P3_D65::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-P3-D60-in-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 2000 nit HDR P3-D60 simulating D60 white in P3-D65", + 2000.f, + P3_D60::primaries, + P3_D65::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-P3-D60-in-P3-D65_2.0", + "Component of ACES 2 Output Transforms for 4000 nit HDR P3-D60 simulating D60 white in P3-D65", + 4000.f, + P3_D60::primaries, + P3_D65::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-P3-D60-in-REC2020-D65_2.0", + "Component of ACES 2 Output Transforms for 500 nit HDR P3-D60 simulating D60 white in Rec2020", + 500.f, + P3_D60::primaries, + REC2020::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-P3-D60-in-REC2020-D65_2.0", + "Component of ACES 2 Output Transforms for 1000 nit HDR P3-D60 simulating D60 white in Rec2020", + 1000.f, + P3_D60::primaries, + REC2020::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-P3-D60-in-REC2020-D65_2.0", + "Component of ACES 2 Output Transforms for 2000 nit HDR P3-D60 simulating D60 white in Rec2020", + 2000.f, + P3_D60::primaries, + REC2020::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-P3-D60-in-REC2020-D65_2.0", + "Component of ACES 2 Output Transforms for 4000 nit HDR P3-D60 simulating D60 white in Rec2020", + 4000.f, + P3_D60::primaries, + REC2020::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-REC2020-D60-in-REC2020-D65_2.0", + "Component of ACES 2 Output Transforms for 500 nit HDR Rec2020 simulating D60 white in Rec2020", + 500.f, + REC2020_D60::primaries, + REC2020::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-REC2020-D60-in-REC2020-D65_2.0", + "Component of ACES 2 Output Transforms for 1000 nit HDR Rec2020 simulating D60 white in Rec2020", + 1000.f, + REC2020_D60::primaries, + REC2020::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-REC2020-D60-in-REC2020-D65_2.0", + "Component of ACES 2 Output Transforms for 2000 nit HDR Rec2020 simulating D60 white in Rec2020", + 2000.f, + REC2020_D60::primaries, + REC2020::primaries, + 1.f, + true + }, + { + "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-REC2020-D60-in-REC2020-D65_2.0", + "Component of ACES 2 Output Transforms for 4000 nit HDR Rec2020 simulating D60 white in Rec2020", + 4000.f, + REC2020_D60::primaries, + REC2020::primaries, + 1.f, + true + } + }; + for (const auto& tr : aces2_output_transforms) { - auto ACES2065_1_to_CIE_XYZ_hdr_video_1000nits_p3lim_2_0_Functor = [](OpRcPtrVec & ops) + auto functor = [tr](OpRcPtrVec & ops) { - MatrixOpData::MatrixArrayPtr matrixToAP1 - = build_conversion_matrix(ACES_AP0::primaries, ACES_AP1::primaries, ADAPTATION_NONE); - CreateMatrixOp(ops, matrixToAP1, TRANSFORM_DIR_FORWARD); - - CreateRangeOp(ops, - 0., RangeOpData::EmptyValue(), - 0., RangeOpData::EmptyValue(), - TRANSFORM_DIR_FORWARD); - - CreateMatrixOp(ops, matrixToAP1, TRANSFORM_DIR_INVERSE); - - const Primaries & InP = ACES_AP0::primaries; - CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_RGB_TO_JMh_20, { - InP.m_red.m_xy[0], InP.m_red.m_xy[1], - InP.m_grn.m_xy[0], InP.m_grn.m_xy[1], - InP.m_blu.m_xy[0], InP.m_blu.m_xy[1], - InP.m_wht.m_xy[0], InP.m_wht.m_xy[1], - }); - - const float peak_luminance = 1000.f; - CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_TONESCALE_COMPRESS_20_FWD, { - peak_luminance - }); - - const Primaries & LimP = P3_D65::primaries; - CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_GAMUT_COMPRESS_20_FWD, { - peak_luminance, - LimP.m_red.m_xy[0], LimP.m_red.m_xy[1], - LimP.m_grn.m_xy[0], LimP.m_grn.m_xy[1], - LimP.m_blu.m_xy[0], LimP.m_blu.m_xy[1], - LimP.m_wht.m_xy[0], LimP.m_wht.m_xy[1], - }); - - const Primaries & OutP = P3_D65::primaries; - CreateFixedFunctionOp(ops, FixedFunctionOpData::ACES_JMh_TO_RGB_20, { - OutP.m_red.m_xy[0], OutP.m_red.m_xy[1], - OutP.m_grn.m_xy[0], OutP.m_grn.m_xy[1], - OutP.m_blu.m_xy[0], OutP.m_blu.m_xy[1], - OutP.m_wht.m_xy[0], OutP.m_wht.m_xy[1], - }); - - CreateRangeOp(ops, - 0., RangeOpData::EmptyValue(), - 0., RangeOpData::EmptyValue(), - TRANSFORM_DIR_FORWARD); - - MatrixOpData::MatrixArrayPtr matrixToXYZ - = build_conversion_matrix_to_XYZ_D65(P3_D65::primaries, ADAPTATION_BRADFORD); - CreateMatrixOp(ops, matrixToXYZ, TRANSFORM_DIR_FORWARD); + ACES2_OUTPUT::Generate_output_transform( + ops, + tr.peak_luminance, + tr.limiting_primaries, + tr.encoding_primaries, + tr.linear_scale, + tr.scale_white + ); }; - registry.addBuiltin("ACES-2-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-1000nit-P3D65lim", - "Component of ACES 2 Output Transforms for 1000 nit HDR D65 video", - ACES2065_1_to_CIE_XYZ_hdr_video_1000nits_p3lim_2_0_Functor); + registry.addBuiltin(tr.name.c_str(), tr.desc.c_str(), functor); } } diff --git a/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.cpp b/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.cpp index 8d1948157..3ab1dd13f 100644 --- a/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.cpp +++ b/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.cpp @@ -71,6 +71,16 @@ static const Chromaticities wht_xy(0.3127, 0.3290); const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); } +namespace REC2020_D60 +{ +static const Chromaticities red_xy(0.708, 0.292 ); +static const Chromaticities grn_xy(0.170, 0.797 ); +static const Chromaticities blu_xy(0.131, 0.046 ); +static const Chromaticities wht_xy(0.32168, 0.33767); + +const Primaries primaries(red_xy, grn_xy, blu_xy, wht_xy); +} + namespace P3_DCI { static const Chromaticities red_xy(0.680, 0.320); diff --git a/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.h b/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.h index 7a2daaf52..323d5712b 100644 --- a/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.h +++ b/src/OpenColorIO/transforms/builtins/ColorMatrixHelpers.h @@ -112,6 +112,11 @@ namespace REC2020 extern const Primaries primaries; } +namespace REC2020_D60 +{ +extern const Primaries primaries; +} + namespace P3_DCI { extern const Primaries primaries; diff --git a/tests/cpu/transforms/BuiltinTransform_tests.cpp b/tests/cpu/transforms/BuiltinTransform_tests.cpp index c5e027927..d1fbcc9be 100644 --- a/tests/cpu/transforms/BuiltinTransform_tests.cpp +++ b/tests/cpu/transforms/BuiltinTransform_tests.cpp @@ -429,13 +429,69 @@ AllValues UnitTestValues { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-CINEMA-108nit-7.2nit-P3lim_1.1", { { 0.5f, 0.4f, 0.3f }, { 0.22214814f, 0.21179835f, 0.15639816f } } }, - { "ACES-2-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-REC709lim", - { { 0.5f, 0.4f, 0.3f }, { 0.26260212f, 0.2520747f, 0.20617338f } } }, - { "ACES-2-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-VIDEO-REC709-D60lim", - { { 0.5f, 0.4f, 0.3f }, { 0.25147706f, 0.24029446f, 0.18221128f } } }, - - { "ACES-2-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-VIDEO-1000nit-P3D65lim", - { { 0.5f, 0.4f, 0.3f }, { 0.4653657f, 0.43852836f, 0.33688113f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.26260212f, 0.25207470f, 0.20617338f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.26260212f, 0.25207472f, 0.20617332f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-108nit-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.16253406f, 0.15513624f, 0.12449740f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-300nit-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.20592399f, 0.19440515f, 0.15028581f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.41039306f, 0.38813826f, 0.30191866f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.46536570f, 0.43852836f, 0.33688113f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.51225936f, 0.48264506f, 0.37060050f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.55653524f, 0.51967940f, 0.38678724f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-REC2020_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.41039258f, 0.38813800f, 0.30191845f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-REC2020_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.46536540f, 0.43852820f, 0.33688095f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-REC2020_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.51225930f, 0.48264477f, 0.37060022f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-REC2020_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.55653550f, 0.51967950f, 0.38678730f } } }, + + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709-D60-in-REC709-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.25147703f, 0.24029444f, 0.18221131f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709-D60-in-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.25373828f, 0.24245512f, 0.18384966f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709-D60-in-REC2020-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.25712878f, 0.24569483f, 0.18630630f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-P3-D60-in-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.25373834f, 0.24245517f, 0.18384990f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-P3-D60-in-XYZ-E_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.26101884f, 0.24941191f, 0.18912509f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-108nit-P3-D60-in-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.15705064f, 0.14920068f, 0.11100890f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-300nit-P3-D60-in-XYZ-E_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.20469205f, 0.19229384f, 0.13782679f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-P3-D60-in-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.39655724f, 0.37322620f, 0.26917280f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-P3-D60-in-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.44968104f, 0.42165324f, 0.30032730f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-P3-D60-in-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.49499428f, 0.46407104f, 0.33038715f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-P3-D60-in-P3-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.53778990f, 0.49960223f, 0.34477120f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-P3-D60-in-REC2020-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.40185606f, 0.37821326f, 0.27276948f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-P3-D60-in-REC2020-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.45568960f, 0.42728746f, 0.30434040f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-P3-D60-in-REC2020-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.50160843f, 0.47027197f, 0.33480182f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-P3-D60-in-REC2020-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.54497580f, 0.50627790f, 0.34937808f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-REC2020-D60-in-REC2020-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.40185624f, 0.37821335f, 0.27276933f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-REC2020-D60-in-REC2020-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.45568994f, 0.42728750f, 0.30434027f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-REC2020-D60-in-REC2020-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.50160870f, 0.47027220f, 0.33480210f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-REC2020-D60-in-REC2020-D65_2.0", + { { 0.5f, 0.4f, 0.3f }, { 0.54497580f, 0.50627780f, 0.34937814f } } }, { "APPLE_LOG_to_ACES2065-1", { { 0.5f, 0.4f, 0.3f }, { 0.153334766f, 0.083515430f, 0.032948254f } } },