| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef UI_GFX_HDR_STATIC_METADATA_H_ |
| #define UI_GFX_HDR_STATIC_METADATA_H_ |
| |
| #include <cstdint> |
| #include <vector> |
| |
| #include "base/numerics/safe_conversions.h" |
| #include "ui/gfx/color_space_export.h" |
| |
| namespace gfx { |
| |
| // This structure is used to define the HDR static capabilities of a display. |
| // Reflects CEA 861.G-2018, Sec.7.5.13, "HDR Static Metadata Data Block" |
| // A value of 0.0 in any of the fields means that it's not indicated. |
| struct COLOR_SPACE_EXPORT HDRStaticMetadata { |
| // See Table 43 Data Byte 1 - Electro-Optical Transfer Function |
| enum class Eotf { |
| // "If “Traditional Gamma - SDR Luminance Range” is indicated, then the |
| // maximum encoded luminance is typically mastered to 100 cd/m2" |
| kGammaSdrRange = 0, |
| // "If “Traditional Gamma – HDR Luminance Range” is indicated, then the |
| // maximum encoded luminance is understood to be the maximum luminance of |
| // the Sink device." |
| kGammaHdrRange = 1, |
| kPq = 2, |
| kHlg = 3, |
| }; |
| |
| // "Desired Content Max Luminance Data. This is the content’s absolute peak |
| // luminance (in cd/m2) (likely only in a small area of the screen) that the |
| // display prefers for optimal content rendering." |
| double max; |
| // "Desired Content Max Frame-average Luminance. This is the content’s max |
| // frame-average luminance (in cd/m2) that the display prefers for optimal |
| // content rendering." |
| double max_avg; |
| // "Desired Content Min Luminance. This is the minimum value of the content |
| // (in cd/m2) that the display prefers for optimal content rendering." |
| double min; |
| // "Electro-Optical Transfer Functions supported by the Sink." See Table 85 |
| // Supported Electro-Optical Transfer Function. |
| uint8_t supported_eotf_mask; |
| |
| HDRStaticMetadata(); |
| HDRStaticMetadata(double max, |
| double max_avg, |
| double min, |
| uint8_t supported_eotf_mask); |
| HDRStaticMetadata(const HDRStaticMetadata& rhs); |
| HDRStaticMetadata& operator=(const HDRStaticMetadata& rhs); |
| |
| bool operator==(const HDRStaticMetadata& rhs) const { |
| return ((max == rhs.max) && (max_avg == rhs.max_avg) && (min == rhs.min) && |
| supported_eotf_mask == rhs.supported_eotf_mask); |
| } |
| |
| bool IsEotfSupported(Eotf eotf) const { |
| return (supported_eotf_mask & EotfMask({eotf})) != 0; |
| } |
| |
| static uint8_t EotfMask(std::vector<Eotf> eotfs) { |
| int eotf_mask = 0; |
| for (const Eotf eotf : eotfs) { |
| eotf_mask |= (1 << static_cast<int>(eotf)); |
| } |
| return base::checked_cast<uint8_t>(eotf_mask); |
| } |
| }; |
| |
| } // namespace gfx |
| |
| #endif // UI_GFX_HDR_STATIC_METADATA_H_ |