Source code for colour.models.rgb.transfer_functions.davinci_intermediate

"""
DaVinci Intermediate
====================

Define the *DaVinci Intermediate* opto-electrical transfer function
(OETF) and its inverse:

-   :func:`colour.models.oetf_DaVinciIntermediate`
-   :func:`colour.models.oetf_inverse_DaVinciIntermediate`

References
----------
-   :cite:`BlackmagicDesign2020a` : Blackmagic Design. (2020). Wide Gamut
    Intermediate DaVinci Resolve. Retrieved December 12, 2020, from
    https://documents.blackmagicdesign.com/InformationNotes/\
DaVinci_Resolve_17_Wide_Gamut_Intermediate.pdf?_v=1607414410000
"""

from __future__ import annotations

import numpy as np

from colour.hints import ArrayLike, NDArrayFloat
from colour.utilities import Structure, as_float, from_range_1, to_domain_1

__author__ = "Colour Developers"
__copyright__ = "Copyright 2013 Colour Developers"
__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
__maintainer__ = "Colour Developers"
__email__ = "colour-developers@colour-science.org"
__status__ = "Production"

__all__ = [
    "CONSTANTS_DAVINCI_INTERMEDIATE",
    "oetf_DaVinciIntermediate",
    "oetf_inverse_DaVinciIntermediate",
]

CONSTANTS_DAVINCI_INTERMEDIATE: Structure = Structure(
    DI_A=0.0075,
    DI_B=7.0,
    DI_C=0.07329248,
    DI_M=10.44426855,
    DI_LIN_CUT=0.00262409,
    DI_LOG_CUT=0.02740668,
)
"""*DaVinci Intermediate* colour component transfer functions constants."""


[docs] def oetf_DaVinciIntermediate( L: ArrayLike, constants: Structure = CONSTANTS_DAVINCI_INTERMEDIATE, ) -> NDArrayFloat: """ Define the *DaVinci Intermediate* opto-electronic transfer function. Parameters ---------- L Linear light value :math`L`. constants *DaVinci Intermediate* colour component transfer function constants. Returns ------- :class:`numpy.ndarray` Encoded value :math:`V`. Notes ----- +------------+-----------------------+---------------+ | **Domain** | **Scale - Reference** | **Scale - 1** | +============+=======================+===============+ | ``L`` | [0, 1] | [0, 1] | +------------+-----------------------+---------------+ +------------+-----------------------+---------------+ | **Range** | **Scale - Reference** | **Scale - 1** | +============+=======================+===============+ | ``V`` | [0, 1] | [0, 1] | +------------+-----------------------+---------------+ References ---------- :cite:`BlackmagicDesign2020a` Examples -------- >>> oetf_DaVinciIntermediate(0.18) # doctest: +ELLIPSIS 0.3360432... """ L = to_domain_1(L) DI_LIN_CUT = constants.DI_LIN_CUT DI_A = constants.DI_A DI_B = constants.DI_B DI_C = constants.DI_C DI_M = constants.DI_M V_out = np.where( L <= DI_LIN_CUT, L * DI_M, DI_C * (np.log2(L + DI_A) + DI_B), ) return as_float(from_range_1(V_out))
[docs] def oetf_inverse_DaVinciIntermediate( V: ArrayLike, constants: Structure = CONSTANTS_DAVINCI_INTERMEDIATE, ) -> NDArrayFloat: """ Define the *DaVinci Intermediate* inverse opto-electronic transfer function (OETF). Parameters ---------- V Encoded value :math:`V`. constants *DaVinci Intermediate* colour component transfer function constants. Returns ------- :class:`numpy.ndarray` Linear light value :math`L`. Notes ----- +------------+-----------------------+---------------+ | **Domain** | **Scale - Reference** | **Scale - 1** | +============+=======================+===============+ | ``y`` | [0, 1] | [0, 1] | +------------+-----------------------+---------------+ +------------+-----------------------+---------------+ | **Range** | **Scale - Reference** | **Scale - 1** | +============+=======================+===============+ | ``x`` | [0, 1] | [0, 1] | +------------+-----------------------+---------------+ References ---------- :cite:`BlackmagicDesign2020a` Examples -------- >>> oetf_inverse_DaVinciIntermediate(0.336043272384855) ... # doctest: +ELLIPSIS 0.1799999... """ V = to_domain_1(V) DI_LOG_CUT = constants.DI_LOG_CUT DI_A = constants.DI_A DI_B = constants.DI_B DI_C = constants.DI_C DI_M = constants.DI_M L_out = np.where( V <= DI_LOG_CUT, V / DI_M, 2 ** ((V / DI_C) - DI_B) - DI_A, ) return as_float(from_range_1(L_out))