| /* | |
| * Copyright 2025 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef SkHdrAgtmPriv_DEFINED | |
| #define SkHdrAgtmPriv_DEFINED | |
| #include <array> | |
| #include "include/core/SkColor.h" | |
| #include "include/core/SkColorSpace.h" | |
| #include "include/core/SkImage.h" | |
| #include "include/core/SkRefCnt.h" | |
| #include "include/core/SkSpan.h" | |
| #include "include/private/SkHdrMetadata.h" | |
| #include <optional> | |
| #include <vector> | |
| class SkData; | |
| class SkString; | |
| namespace skhdr { | |
| class Metadata; | |
| // Collection of functions and structures that could potentially be moved into | |
| // the AdaptiveGlobalToneMap structure or its sub-structures, but are not exposed yet. | |
| namespace AgtmHelpers { | |
| /** | |
| * The function evaluation described in Clause 6.3.2. | |
| */ | |
| SkColor4f EvaluateColorGainFunction(const AdaptiveGlobalToneMap::ColorGainFunction& gain, | |
| const SkColor4f& c); | |
| /** | |
| * The function evaluation described in Clause 6.4.3. | |
| */ | |
| SkColor4f EvaluateComponentMixingFunction(const AdaptiveGlobalToneMap::ComponentMixingFunction& mix, | |
| const SkColor4f& c); | |
| /** | |
| * The function evaluation described in Clause 6.5.3. | |
| */ | |
| float EvaluateGainCurve(const AdaptiveGlobalToneMap::GainCurve& gainCurve, float x); | |
| /** | |
| * Populate the fM values using the Piecewise Cubic Hermite Interpolation Package (PCHIP) | |
| * algorithm, described in Clause C.3.9: Piecewise cubic hermite interpolation package slope | |
| * computation. | |
| */ | |
| void PopulateSlopeFromPCHIP(AdaptiveGlobalToneMap::GainCurve& gainCurve); | |
| /** | |
| * Compute the weighting for the specified targeted HDR headroom according to the computations | |
| * in Clause 6.2.5, Computation of the headroom-adaptive tone map. | |
| */ | |
| struct Weighting { | |
| // The index into fAlternateImages for fWeight. If fWeight[i] is 0 then | |
| // fAlternateImageIndex[i] is not used and should be set to kInvalidIndex. | |
| static constexpr uint8_t kInvalidIndex = 255; | |
| std::array<uint8_t, 2> fAlternateImageIndex = {kInvalidIndex, kInvalidIndex}; | |
| // The value of fWeight[i] is weight for the fAlternateImageIndex[i]-th alternate image. | |
| std::array<float, 2> fWeight = {0.f, 0.f}; | |
| }; | |
| Weighting ComputeWeighting(const AdaptiveGlobalToneMap::HeadroomAdaptiveToneMap& hatm, | |
| float targetedHdrHeadroom); | |
| /** | |
| * This will populate the metadata with the Reference White Tone Mapping Operator (RWTMO) | |
| * parameters, based on the value of fBaselineHdrHeadroom. | |
| */ | |
| void PopulateUsingRwtmo(AdaptiveGlobalToneMap::HeadroomAdaptiveToneMap& hatm); | |
| /** | |
| * If tone mapping is to be performed for `inputColorSpace` with `metadata, then populate `outAgtm` | |
| * and `outScaleFactor` with the parameters to use for tone mapping with MakeColorFilter. If tone | |
| * mapping should not be performed, return false. | |
| */ | |
| bool PopulateToneMapAgtmParams(const Metadata& metadata, | |
| const SkColorSpace* inputColorSpace, | |
| AdaptiveGlobalToneMap* outAgtm, | |
| float* outScaleFactor); | |
| /** | |
| * Apply the tone mapping to `colors` in the gain application color space, targeting the | |
| * specified `targetedHdrHeadroom`. | |
| */ | |
| void ApplyGain( | |
| const AdaptiveGlobalToneMap::HeadroomAdaptiveToneMap& hatm, | |
| SkSpan<SkColor4f> colors, | |
| float targetedHdrHeadroom); | |
| /** | |
| * Return an SkColorFilter that will first scale by `scaleFactor`, and then tone map to | |
| * the specified `targetedHdrHeadroom`. | |
| */ | |
| sk_sp<SkColorFilter> MakeColorFilter( | |
| const AdaptiveGlobalToneMap::HeadroomAdaptiveToneMap& hatm, | |
| float targetedHdrHeadroom, | |
| float scaleFactor); | |
| /** | |
| * Return an SkImage containing the control point values for use by the color filter. | |
| */ | |
| sk_sp<SkImage> MakeGainCurveXYMImage( | |
| const AdaptiveGlobalToneMap::HeadroomAdaptiveToneMap& hatm); | |
| /** | |
| * Return the gain application color space. | |
| */ | |
| sk_sp<SkColorSpace> GetGainApplicationSpace( | |
| const AdaptiveGlobalToneMap::HeadroomAdaptiveToneMap& hatm); | |
| /** | |
| * Return true if `hatm` or `agtm` satisfies all normative constraints. | |
| */ | |
| bool Validate(const AdaptiveGlobalToneMap& agtm); | |
| bool Validate(const AdaptiveGlobalToneMap::HeadroomAdaptiveToneMap& hatm); | |
| } // namespace AgtmHelpers | |
| } // namespace skhdr | |
| #endif |