blob: 02200142bb3224d047fdc3ade09f7333848c0cb5 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/gfx/hdr_metadata.h"
#include <iomanip>
#include <sstream>
#include "skia/ext/skcolorspace_primaries.h"
#include "third_party/skia/include/core/SkColorSpace.h"
#include "third_party/skia/include/core/SkData.h"
namespace gfx {
std::string HdrMetadataCta861_3::ToString() const {
std::stringstream ss;
ss << std::fixed << std::setprecision(4)
<< "{maxCLL:" << max_content_light_level
<< ", maxFALL:" << max_frame_average_light_level << "}";
return ss.str();
}
HdrMetadataSmpteSt2086& HdrMetadataSmpteSt2086::operator=(
const HdrMetadataSmpteSt2086& rhs) = default;
std::string HdrMetadataSmpteSt2086::ToString() const {
std::stringstream ss;
ss << std::fixed << std::setprecision(4) << "{"
<< "red:[" << primaries.fRX << ", " << primaries.fRY << "], "
<< "green:[" << primaries.fGX << ", " << primaries.fGY << "], "
<< "blue:[" << primaries.fBX << ", " << primaries.fBY << "], "
<< "whitePoint:[" << primaries.fWX << ", " << primaries.fWY << "], "
<< "minLum:" << luminance_min << ", "
<< "maxLum:" << luminance_max << "}";
return ss.str();
}
std::string HdrMetadataNdwl::ToString() const {
std::stringstream ss;
ss << std::fixed << std::setprecision(4) << "{"
<< "nits:" << nits << "}";
return ss.str();
}
std::string HdrMetadataExtendedRange::ToString() const {
std::stringstream ss;
ss << std::fixed << std::setprecision(4) << "{"
<< "current_headroom:" << current_headroom << ", "
<< "desired_headroom:" << desired_headroom << "}";
return ss.str();
}
HdrMetadataAgtm::HdrMetadataAgtm() = default;
HdrMetadataAgtm::HdrMetadataAgtm(const void* payload, size_t size)
: payload(SkData::MakeWithCopy(payload, size)) {}
HdrMetadataAgtm::HdrMetadataAgtm(sk_sp<SkData> payload)
: payload(std::move(payload)) {}
HdrMetadataAgtm::HdrMetadataAgtm(const HdrMetadataAgtm& other) = default;
HdrMetadataAgtm& HdrMetadataAgtm::operator=(const HdrMetadataAgtm& other) =
default;
HdrMetadataAgtm::~HdrMetadataAgtm() = default;
std::string HdrMetadataAgtm::ToString() const {
return "agtm placeholder";
}
bool HdrMetadataAgtm::operator==(const HdrMetadataAgtm& rhs) const {
if (!payload) {
return !rhs.payload;
}
return payload->equals(rhs.payload.get());
}
HDRMetadata::HDRMetadata() = default;
HDRMetadata::HDRMetadata(const HdrMetadataSmpteSt2086& smpte_st_2086,
const HdrMetadataCta861_3& cta_861_3)
: smpte_st_2086(smpte_st_2086), cta_861_3(cta_861_3) {}
HDRMetadata::HDRMetadata(const HdrMetadataSmpteSt2086& smpte_st_2086)
: smpte_st_2086(smpte_st_2086) {}
HDRMetadata::HDRMetadata(const HdrMetadataCta861_3& cta_861_3)
: cta_861_3(cta_861_3) {}
HDRMetadata::HDRMetadata(const HDRMetadata& rhs) = default;
HDRMetadata& HDRMetadata::operator=(const HDRMetadata& rhs) = default;
HDRMetadata::~HDRMetadata() = default;
// static
HDRMetadata HDRMetadata::PopulateUnspecifiedWithDefaults(
const std::optional<gfx::HDRMetadata>& hdr_metadata) {
constexpr HdrMetadataSmpteSt2086 kDefaults2086(SkNamedPrimaries::kRec2020,
1000.f, 0.f);
if (!hdr_metadata)
return HDRMetadata(kDefaults2086);
HDRMetadata result = *hdr_metadata;
if (!result.smpte_st_2086) {
result.smpte_st_2086 = kDefaults2086;
return result;
}
// If the gamut is unspecified, replace it with the default Rec2020.
if (result.smpte_st_2086->primaries == SkNamedPrimariesExt::kInvalid) {
result.smpte_st_2086->primaries = kDefaults2086.primaries;
}
// If the max luminance is unspecified, replace it with the default 1,000
// nits.
if (result.smpte_st_2086->luminance_max == 0.f) {
result.smpte_st_2086->luminance_max = kDefaults2086.luminance_max;
}
return result;
}
std::string HDRMetadata::ToString() const {
std::stringstream ss;
ss << "{";
if (smpte_st_2086) {
ss << "smpte_st_2086:" << smpte_st_2086->ToString() << ", ";
}
if (cta_861_3) {
ss << "cta_861_3:" << cta_861_3->ToString() << ", ";
}
if (ndwl) {
ss << "ndwl:" << ndwl->ToString() << ", ";
}
if (extended_range) {
ss << "extended_range:" << extended_range->ToString() << ", ";
}
if (agtm) {
ss << "agtm:" << agtm->ToString() << ", ";
}
ss << "}";
return ss.str();
}
} // namespace gfx