/*
 * Copyright 2025 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "include/core/SkBitmap.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkColorFilter.h"
#include "include/core/SkData.h"
#include "include/core/SkImage.h"
#include "include/core/SkScalar.h"
#include "include/private/SkHdrMetadata.h"
#include "src/codec/SkHdrAgtmPriv.h"
#include "tests/Test.h"

#include <array>

DEF_TEST(HdrMetadata_ParseSerialize_ContentLightLevelInformation, r) {
    uint8_t data[] = {
        0x03, 0xE8,
        0x00, 0xFA,
    };
    // Data taken from:
    // https://www.w3.org/TR/png-3/#example-13
    // https://www.w3.org/TR/png-3/#example-14
    uint8_t dataPng[] = {
        0x00, 0x98, 0x96, 0x80,
        0x00, 0x26, 0x25, 0xA0,
    };
    skhdr::ContentLightLevelInformation clliExpected = {
        1000.f, 250.f,
    };
    auto skData = SkData::MakeWithoutCopy(data, sizeof(data));
    auto skDataPng = SkData::MakeWithoutCopy(dataPng, sizeof(dataPng));

    skhdr::ContentLightLevelInformation clli;
    REPORTER_ASSERT(r, clli.parse(skData.get()));
    REPORTER_ASSERT(r, clli == clliExpected);
    REPORTER_ASSERT(r, skData->equals(clli.serialize().get()));

    skhdr::ContentLightLevelInformation clliPng;
    REPORTER_ASSERT(r, clliPng.parsePngChunk(skDataPng.get()));
    REPORTER_ASSERT(r, clliPng == clliExpected);
    REPORTER_ASSERT(r, skDataPng->equals(clli.serializePngChunk().get()));
}

DEF_TEST(HdrMetadata_ParseSerialize_MasteringDisplayColorVolume, r) {
    // Data taken from:
    // https://www.w3.org/TR/png-3/#example-5
    // https://www.w3.org/TR/png-3/#example-6
    // https://www.w3.org/TR/png-3/#example-7
    // https://www.w3.org/TR/png-3/#example-8
    uint8_t data[] = {
        0x8A, 0x48, 0x39, 0x08, // Red
        0x21, 0x34, 0x9B, 0xAA, // Green
        0x19, 0x96, 0x08, 0xFC, // Blue
        0x3D, 0x13, 0x40, 0x42, // White
        0x02, 0x62, 0x5A, 0x00, // Maximum luminance
        0x00, 0x00, 0x00, 0x05, // Minimum luminance
    };
    skhdr::MasteringDisplayColorVolume mdcvExpected = {
        {0.708f, 0.292f, 0.17f, 0.797f, 0.131f, 0.046f, 0.3127f, 0.329f},
        4000.f, 0.0005f,
    };
    auto skData = SkData::MakeWithoutCopy(data, sizeof(data));

    skhdr::MasteringDisplayColorVolume mdcv;
    REPORTER_ASSERT(r, mdcv.parse(skData.get()));
    REPORTER_ASSERT(r, mdcv == mdcvExpected);
    REPORTER_ASSERT(r, skData->equals(mdcv.serialize().get()));
}

DEF_TEST(HdrMetadata_Agtm_Cubic, r) {
    skhdr::AdaptiveGlobalToneMap::GainCurve cubic = {
        .fControlPoints = {
            { .fX = 0.10720647f, .fY = 0.37384606f },
            { .fX = 0.76246667f, .fY = 0.93143060f },
            { .fX = 1.39535723f, .fY = 0.f         },
            { .fX = 2.17572099f, .fY = 1.23009354f },
            { .fX = 2.47834070f, .fY = 1.25542898f },
            { .fX = 3.14288223f, .fY = 2.22460677f },
            { .fX = 3.35428070f, .fY = 2.69226748f },
            { .fX = 4.24864607f, .fY = 3.45838813f },
            { .fX = 4.59087493f, .fY = 4.44597502f },
            { .fX = 4.80373641f, .fY = 5.19196203f }
        }
    };
    skhdr::AgtmHelpers::PopulateSlopeFromPCHIP(cubic);

    static constexpr std::array<float, 10> mExpected = {
            2.03242568f, 0.f,         0.f,         0.14042951f, 0.14250506f,
            1.82245618f, 1.35855757f, 1.43703564f, 3.18918733f, 3.74186390f,
    };
    for (size_t i = 0; i < 10; ++i) {
        REPORTER_ASSERT(r, SkScalarNearlyEqual(cubic.fControlPoints[i].fM, mExpected[i], 0.0001f));
    }

    static constexpr std::array<float, 11> yExpected = {
            0.37384606f, 0.86280187f, 0.63630745f, 0.05871820f, 1.05625216f,
            1.26009455f, 1.95243885f, 2.85680727f, 3.19521825f, 4.14318213f,
            5.13419092f
    };
    for (size_t i = 0; i < 11; ++i) {
        const float x = i / 2.f;
        const float y = skhdr::AgtmHelpers::EvaluateGainCurve(cubic, x);
        REPORTER_ASSERT(r, SkScalarNearlyEqual(y, yExpected[i], 0.0001f));
    }
}

DEF_TEST(HdrMetadata_Agtm_PCHIP_EdgeCases, r) {
    struct SlopeTest {
        const char* name;
        skhdr::AdaptiveGlobalToneMap::GainCurve curve;
        std::vector<std::pair<int, float>> expected;
    };

    const SlopeTest tests[] = {
        {
            .name = "SinglePoint",
            .curve = { .fControlPoints = {
                {.fX = 1.f, .fY = 1.f}}
            },
            .expected = { {0, 0.f} }
        },
        {
            .name = "Left endpoint, three-point, sign change s0 vs m",
            .curve = { .fControlPoints = {
                {.fX = 0.f, .fY = 0.f},
                {.fX = 1.f, .fY = 1.f},
                {.fX = 2.f, .fY = 5.f}}
            },
            .expected = { {0, 0.f} }
        },
        {
            .name = "Left endpoint, three-point, sign change s1 vs m, |m| > 3|s0|",
            .curve = { .fControlPoints = {
                {.fX = 0.f, .fY = 0.f},
                {.fX = 1.f, .fY = 1.f},
                {.fX = 2.f, .fY = -9.f}}
            },
            .expected = { {0, 3.f} }
        },
        {
            .name = "Interior point, different signs",
            .curve = { .fControlPoints = {
                {.fX = 0.f, .fY = 0.f},
                {.fX = 1.f, .fY = 1.f},
                {.fX = 2.f, .fY = 0.f}}
            },
            .expected = { {1, 0.f} }
        },
        {
            .name = "Interior point, duplicate point left",
            .curve = { .fControlPoints = {
                {.fX = 0.f, .fY = 0.f},
                {.fX = 0.f, .fY = 0.f},
                {.fX = 1.f, .fY = 2.f}}
            },
            .expected = { {1, 2.f} }
        },
        {
            .name = "Interior point, duplicate point right",
            .curve = { .fControlPoints = {
                {.fX = 0.f, .fY = 0.f},
                {.fX = 1.f, .fY = 2.f},
                {.fX = 1.f, .fY = 2.f}}
            },
            .expected = { {1, 2.f} }
        },
        {
            .name = "Interior point, flat on both sides",
            .curve = { .fControlPoints = {
                {.fX = 0.f, .fY = 2.f},
                {.fX = 1.f, .fY = 2.f},
                {.fX = 2.f, .fY = 2.f}}
            },
            .expected = { {1, 0.f} }
        },
        {
            .name = "N=2, two-point difference",
            .curve = { .fControlPoints = {
                {.fX = 0.f, .fY = 0.f},
                {.fX = 2.f, .fY = 4.f}}
            },
            .expected = { {0, 2.f}, {1, 2.f} }
        },
        {
            .name = "h[i]=0 case",
            .curve = { .fControlPoints = {
                {.fX = 0.f, .fY = 0.f},
                {.fX = 0.f, .fY = 0.f},
                {.fX = 1.f, .fY = 1.f}}
            },
            .expected = { {0, 0.f}, {1, 1.f} }
        },
        {
            .name = "Right endpoint, three-point, sign change s0 vs m",
            .curve = { .fControlPoints = {
                {.fX = 0.f, .fY = 4.f},
                {.fX = 1.f, .fY = 0.f},
                {.fX = 2.f, .fY = -1.f}}
            },
            .expected = { {2, 0.f} }
        },
        {
            .name = "Right endpoint, three-point, sign change s1 vs m, |m| > 3|s0|",
            .curve = { .fControlPoints = {
                {.fX = 0.f, .fY = -4.f},
                {.fX = 1.f, .fY = 0.f},
                {.fX = 2.f, .fY = -1.f}}
            },
            .expected = { {2, -3.f} }
        },
    };

    for (const auto& t : tests) {
        skiatest::ReporterContext ctx(r, t.name);
        skhdr::AdaptiveGlobalToneMap::GainCurve curve = t.curve;
        skhdr::AgtmHelpers::PopulateSlopeFromPCHIP(curve);
        for (const auto& [index, expectedM] : t.expected) {
            REPORTER_ASSERT(r, curve.fControlPoints[index].fM == expectedM);
        }
    }
}

DEF_TEST(HdrMetadata_Agtm_Mix, r) {
    auto test = [&r](const std::string& name, skhdr::AdaptiveGlobalToneMap::ComponentMixingFunction mix,
                     SkColor4f input, SkColor4f expected) {
        skiatest::ReporterContext ctx(r, name);
        SkColor4f actual = skhdr::AgtmHelpers::EvaluateComponentMixingFunction(mix, input);
        REPORTER_ASSERT(r, actual.fR == expected.fR);
        REPORTER_ASSERT(r, actual.fG == expected.fG);
        REPORTER_ASSERT(r, actual.fB == expected.fB);
        REPORTER_ASSERT(r, actual.fA == expected.fA);
        REPORTER_ASSERT(r, actual.fA == input.fA);
    };

    test("Red only",
         skhdr::AdaptiveGlobalToneMap::ComponentMixingFunction({.fRed=1.f}),
         SkColor4f({0.5f, 0.75f, 0.25f, 1.f}),
         SkColor4f({0.5f, 0.5f,  0.5f,  1.f}));

    test("Green only",
         skhdr::AdaptiveGlobalToneMap::ComponentMixingFunction({.fGreen=1.f}),
         SkColor4f({0.75f, 0.5f, 0.25f, 1.f}),
         SkColor4f({0.5f,  0.5f, 0.5f,  1.f}));

    test("Blue only",
         skhdr::AdaptiveGlobalToneMap::ComponentMixingFunction({.fBlue=1.f}),
         SkColor4f({0.75f, 0.25f, 0.5f, 1.f}),
         SkColor4f({0.5f,  0.5f,  0.5f,  1.f}));

    test("Max only",
         skhdr::AdaptiveGlobalToneMap::ComponentMixingFunction({.fMax=1.f}),
         SkColor4f({0.75f, 0.5f,  0.25f, 1.f}),
         SkColor4f({0.75f, 0.75f, 0.75f, 1.f}));

    test("Min only",
         skhdr::AdaptiveGlobalToneMap::ComponentMixingFunction({.fMin=1.f}),
         SkColor4f({0.75f, 0.5f,  0.25f, 1.f}),
         SkColor4f({0.25f, 0.25f, 0.25f, 1.f}));

    test("Component only",
         skhdr::AdaptiveGlobalToneMap::ComponentMixingFunction({.fComponent=1.f}),
         SkColor4f({0.75f, 0.5f, 0.25f, 1.f}),
         SkColor4f({0.75f, 0.5f, 0.25f, 1.f}));

    test("CIE Y (luminance)",
         skhdr::AdaptiveGlobalToneMap::ComponentMixingFunction(
             {.fRed=0.2627f, .fGreen=0.6780f, .fBlue=0.0593f}),
         SkColor4f({0.75f,    0.5f,     0.25f,    0.125f}),
         SkColor4f({0.55085f, 0.55085f, 0.55085f, 0.125f}));

    test("max-component",
         skhdr::AdaptiveGlobalToneMap::ComponentMixingFunction({.fMax=0.75f, .fComponent=0.25f}),
         SkColor4f({0.75f, 0.5f,    0.25f,   0.125f}),
         SkColor4f({0.75f, 0.6875f, 0.6250f, 0.125f}));

}

DEF_TEST(HdrMetadata_Agtm_RWTMO, r) {
    skhdr::AdaptiveGlobalToneMap agtm = {
        .fHeadroomAdaptiveToneMap = {{
            .fBaselineHdrHeadroom = 1.f,
        }}
    };
    auto& hatm = agtm.fHeadroomAdaptiveToneMap.value();
    skhdr::AgtmHelpers::PopulateUsingRwtmo(hatm);

    REPORTER_ASSERT(r, memcmp(&hatm.fGainApplicationSpacePrimaries, &SkNamedPrimaries::kRec2020,
                              sizeof(SkColorSpacePrimaries)) == 0);
    REPORTER_ASSERT(r, hatm.fAlternateImages.size() == 2);
    REPORTER_ASSERT(r, hatm.fAlternateImages[0].fHdrHeadroom == 0.f);
    REPORTER_ASSERT(r, SkScalarNearlyEqual(hatm.fAlternateImages[1].fHdrHeadroom,
                                           0.6151137835929048f));

    static constexpr std::array<std::array<const float, 8>, 2> xExpected = {{
            {1.00000f, 1.06461f, 1.15531f, 1.27209f, 1.41494f, 1.58388f, 1.77890f, 2.00000f},
            {1.00000f, 1.10504f, 1.22269f, 1.35294f, 1.49580f, 1.65126f, 1.81933f, 2.00000f},
    }};
    static constexpr std::array<std::array<const float, 8>, 2> yExpected = {{
            {-0.35356f, -0.37367f, -0.42913f, -0.51246f, -0.61663f, -0.73563f, -0.86465f, -1.00000f},
            { 0.00000f, -0.01253f, -0.04583f, -0.09477f, -0.15559f, -0.22550f, -0.30244f, -0.38489f},
    }};
    static constexpr std::array<std::array<const float, 8>, 2> mExpected = {{
            {0.00000f, -0.50266f, -0.68079f, -0.73059f, -0.72159f, -0.68535f, -0.63784f, -0.58742f},
            {0.00000f, -0.21470f, -0.33759f, -0.40581f, -0.44088f, -0.45573f, -0.45828f, -0.45351f},
    }};

    for (size_t a = 0; a < 2; ++a) {
        const auto& cubic = hatm.fAlternateImages[a].fColorGainFunction.fGainCurve;
        REPORTER_ASSERT(r, cubic.fControlPoints.size() == 8u);
        for (size_t c = 0; c < 8; ++c) {
            REPORTER_ASSERT(r, SkScalarNearlyEqual(xExpected[a][c], cubic.fControlPoints[c].fX));
            REPORTER_ASSERT(r, SkScalarNearlyEqual(yExpected[a][c], cubic.fControlPoints[c].fY));
            REPORTER_ASSERT(r, SkScalarNearlyEqual(mExpected[a][c], cubic.fControlPoints[c].fM));
        }
    }
}

DEF_TEST(HdrMetadata_Agtm_Weighting, r) {
    skhdr::AdaptiveGlobalToneMap::HeadroomAdaptiveToneMap hatm;

    auto test = [&r, &hatm](const std::string& name,
                            float targetedHdrHeadroom,
                            const skhdr::AgtmHelpers::Weighting& wExpected) {
        skiatest::ReporterContext ctx(r, name);
        skhdr::AgtmHelpers::Weighting w = skhdr::AgtmHelpers::ComputeWeighting(
                hatm, targetedHdrHeadroom);
        REPORTER_ASSERT(r, w.fWeight[0] == wExpected.fWeight[0]);
        REPORTER_ASSERT(r, w.fWeight[1] == wExpected.fWeight[1]);
        REPORTER_ASSERT(r, w.fAlternateImageIndex[0] == wExpected.fAlternateImageIndex[0]);
        REPORTER_ASSERT(r, w.fAlternateImageIndex[1] == wExpected.fAlternateImageIndex[1]);
    };

    // Tests with a single baseline representation.
    hatm.fBaselineHdrHeadroom = 1.f;
    test("base-1, target-0", 0.f,
         {{skhdr::AgtmHelpers::Weighting::kInvalidIndex, skhdr::AgtmHelpers::Weighting::kInvalidIndex},
          {0.f, 0.f}});

    test("base-1, target-1", 1.f,
         {{skhdr::AgtmHelpers::Weighting::kInvalidIndex, skhdr::AgtmHelpers::Weighting::kInvalidIndex},
          {0.f, 0.f}});

    test("base-2, target-2", 2.f,
         {{skhdr::AgtmHelpers::Weighting::kInvalidIndex, skhdr::AgtmHelpers::Weighting::kInvalidIndex},
          {0.f, 0.f}});

    // Tests with a baseline and an alternate representation.
    hatm.fBaselineHdrHeadroom = 1.f;
    hatm.fAlternateImages = {
        { .fHdrHeadroom = 0.f },
    };

    test("base-1-alt0, target-0", 0.f,
         {{0, skhdr::AgtmHelpers::Weighting::kInvalidIndex},
          {1.f, 0.f}});

    test("base-1-alt0, target-0.25", 0.25f,
         {{0, skhdr::AgtmHelpers::Weighting::kInvalidIndex},
          {0.75f, 0.f}});

    test("base-1-alt0, target-1", 1.f,
         {{skhdr::AgtmHelpers::Weighting::kInvalidIndex, skhdr::AgtmHelpers::Weighting::kInvalidIndex},
          {0.f, 0.f}});

    test("base-1-alt0, target-1.25", 1.25f,
         {{skhdr::AgtmHelpers::Weighting::kInvalidIndex, skhdr::AgtmHelpers::Weighting::kInvalidIndex},
          {0.f, 0.f}});

    // Two alternate representations.
    hatm.fBaselineHdrHeadroom = 1.f;
    hatm.fAlternateImages = {
        { .fHdrHeadroom = 0.f },
        { .fHdrHeadroom = 2.f },
    };

    test("base-1-alt0-alt2, target-0", 0.f,
         {{0, skhdr::AgtmHelpers::Weighting::kInvalidIndex},
          {1.f, 0.f}});

    test("base-1-alt0-alt2, target-0.25", 0.25f,
         {{0, skhdr::AgtmHelpers::Weighting::kInvalidIndex},
          {0.75f, 0.f}});

    test("base-1-alt0-alt2, target-1", 1.f,
         {{skhdr::AgtmHelpers::Weighting::kInvalidIndex, skhdr::AgtmHelpers::Weighting::kInvalidIndex},
          {0.f, 0.f}});

    test("base-1-alt0-alt2, target-1.25", 1.25f,
         {{1, skhdr::AgtmHelpers::Weighting::kInvalidIndex},
          {0.25f, 0.f}});

    test("base-1-alt0-alt2, target-2", 2.f,
         {{1, skhdr::AgtmHelpers::Weighting::kInvalidIndex},
          {1.f, 0.f}});

    test("base-1-alt0-alt2, target-3", 3.f,
         {{1, skhdr::AgtmHelpers::Weighting::kInvalidIndex},
          {1.f, 0.f}});

    // Two alternate representations again, now mix-able.
    hatm.fBaselineHdrHeadroom = 2.f;
    hatm.fAlternateImages = {
      { .fHdrHeadroom = 0.f },
      { .fHdrHeadroom = 1.f },
    };

    test("base-2-alt0-alt1, target-0.25", 0.25f,
         {{0, 1},
          {0.75f, 0.25f}});
}

static void assert_agtms_equal(skiatest::Reporter* r,
                               const skhdr::AdaptiveGlobalToneMap& agtmIn,
                               const skhdr::AdaptiveGlobalToneMap& agtmOut) {
    // Allow error for headrooms, x, and y to twice the their encoding step.
    constexpr float kHeadroomError = 0.0002f;
    constexpr float kXError = 0.002f;
    constexpr float kYError = 0.0002f;
    // The slope is non-uniformly sampled. It has higher precision than the Y values near 0, but
    // lower precision at higher values.
    constexpr float kMError = 0.0004f;

    REPORTER_ASSERT(r, agtmIn.fHdrReferenceWhite == agtmOut.fHdrReferenceWhite);

    REPORTER_ASSERT(r, agtmIn.fHeadroomAdaptiveToneMap.has_value() ==
                       agtmOut.fHeadroomAdaptiveToneMap.has_value());
    if (!agtmIn.fHeadroomAdaptiveToneMap.has_value()) {
        return;
    }

    const auto& hatmIn = agtmIn.fHeadroomAdaptiveToneMap.value();
    const auto& hatmOut = agtmOut.fHeadroomAdaptiveToneMap.value();
    REPORTER_ASSERT(r, SkScalarNearlyEqual(
            hatmIn.fBaselineHdrHeadroom, hatmOut.fBaselineHdrHeadroom, kHeadroomError));
    REPORTER_ASSERT(r, hatmIn.fGainApplicationSpacePrimaries ==
                       hatmOut.fGainApplicationSpacePrimaries);
    REPORTER_ASSERT(r, hatmIn.fAlternateImages.size() == hatmOut.fAlternateImages.size());
    if (hatmIn.fAlternateImages.size() != hatmOut.fAlternateImages.size()) {
        return;
    }
    for (size_t a = 0; a < hatmIn.fAlternateImages.size(); ++a) {
        const auto& altrIn = hatmIn.fAlternateImages[a];
        const auto& altrOut = hatmOut.fAlternateImages[a];

        skiatest::ReporterContext ctxA(
            r, SkStringPrintf("AlternateImage:a=%d", static_cast<int>(a)));

        REPORTER_ASSERT(r, SkScalarNearlyEqual(
            altrIn.fHdrHeadroom, altrOut.fHdrHeadroom, kHeadroomError));

        auto& mixIn = altrIn.fColorGainFunction.fComponentMixing;
        auto& mixOut = altrOut.fColorGainFunction.fComponentMixing;

        REPORTER_ASSERT(r, mixIn.fRed == mixOut.fRed);
        REPORTER_ASSERT(r, mixIn.fGreen == mixOut.fGreen);
        REPORTER_ASSERT(r, mixIn.fBlue == mixOut.fBlue);
        REPORTER_ASSERT(r, mixIn.fMax == mixOut.fMax);
        REPORTER_ASSERT(r, mixIn.fMin == mixOut.fMin);
        REPORTER_ASSERT(r, mixIn.fComponent == mixOut.fComponent);

        auto& curveIn = altrIn.fColorGainFunction.fGainCurve;
        auto& curveOut = altrOut.fColorGainFunction.fGainCurve;
        REPORTER_ASSERT(r, curveIn.fControlPoints.size() == curveOut.fControlPoints.size());
        if (curveIn.fControlPoints.size() != curveOut.fControlPoints.size()) {
            return;
        }
        for (uint8_t c = 0; c < curveIn.fControlPoints.size(); ++c) {
            skiatest::ReporterContext ctxC(r, SkStringPrintf("ControlPoint:c=%u", c));
            REPORTER_ASSERT(r, SkScalarNearlyEqual(
                curveIn.fControlPoints[c].fX, curveOut.fControlPoints[c].fX, kXError));
            REPORTER_ASSERT(r, SkScalarNearlyEqual(
                curveIn.fControlPoints[c].fY, curveOut.fControlPoints[c].fY, kYError));
            REPORTER_ASSERT(r, SkScalarNearlyEqual(
                curveIn.fControlPoints[c].fM, curveOut.fControlPoints[c].fM, kMError));
        }
    }
}

// Test round-trip serialization of AGTM metadata.
DEF_TEST(HdrMetadata_Agtm_RoundTripSerialize, r) {
    struct Test {
        // The name of the test.
        const char* name;

        // The AGTM data that we will serialize and deserialized.
        skhdr::AdaptiveGlobalToneMap agtm;

        // Different binary encodings, which should all produce `agtm`, and some of them may be
        // bit-exact the same as `agtm.serialize()`.
        struct Encoding {
            // The name of the serialization, if it has some unique properties.
            const char* name = nullptr;

            // If true, then `data` should equal `agtm.serialize()`.
            const bool is_default_encoding = true;

            // The serialized data.
            std::vector<uint8_t> data;
        };
        std::vector<Encoding> encodings;
    };

    auto get_rwtmo = [](float hdr_reference_white, float headroom) {
        skhdr::AdaptiveGlobalToneMap agtm = {
            .fHeadroomAdaptiveToneMap = {{
                .fBaselineHdrHeadroom = headroom
            }}
        };
        skhdr::AgtmHelpers::PopulateUsingRwtmo(agtm.fHeadroomAdaptiveToneMap.value());
        return agtm;
    };

    Test tests[] = {
        {
            .name = "NoAdaptiveToneMap-DefaultWhite",
            .agtm = {},
            .encodings = {
                {
                    .data = { 0x00, 0x00, },
                },
                // The application_version syntax element is 7. Because minimum_application_version
                // is 0, we should still parse this. See Clause C.2.1.
                {
                    .name = "application_version=7",
                    .is_default_encoding = false,
                    .data = { 0xe0, 0x00, },
                },
            },
        },
        {
            .name = "NoAdaptiveToneMap-123-White",
            .agtm = { .fHdrReferenceWhite = 123.f, },
            .encodings = {{
                .data = { 0x00, 0x80, 0x02, 0x67, },
            }},
        },
        {
            .name = "NoAdaptiveToneMap-MinWhite",
            .agtm = { .fHdrReferenceWhite = 0.2f, },
            .encodings = {
                {
                    .data = { 0x00, 0x80, 0x00, 0x01, },
                },
                // The hdr_reference_white syntax element is 0 but clamped to 1 by Clause C.3.3.
                {
                    .name = "hdr_reference_white=0",
                    .is_default_encoding = false,
                    .data = { 0x00, 0x80, 0x00, 0x00, },
                },
            },
        },
        {
            .name = "NoAdaptiveToneMap-MaxWhite",
            .agtm = { .fHdrReferenceWhite = 10000.f, },
            .encodings = {
                {
                    .data = { 0x00, 0x80, 0xc3, 0x50, },
                },
                // The hdr_reference_white syntax element is 65535 but clamped to 50000 by Clause
                // C.3.3.
                {
                    .name = "hdr_reference_white=65535",
                    .is_default_encoding = false,
                    .data = { 0x00, 0x80, 0xff, 0xff, },
                },
            },
        },
        {
            .name = "RWTMO-min-headroom",
            .agtm = get_rwtmo(203.f, 0.f),
            .encodings = {
                {
                    .data = { 0x00, 0x40, 0x00, 0x00, 0x80, },
                },
            },
        },
        {
            .name = "RWTMO-mid-headroom",
            .agtm = get_rwtmo(203.f, 3.f),
            .encodings = {
                {
                    .data = { 0x00, 0x40, 0x75, 0x30, 0x80 },
                }
            },
        },
        {
            .name = "RWTMO-max-headroom",
            .agtm = get_rwtmo(203.f, 6.f),
            .encodings = {
                {
                    .data = { 0x00, 0x40, 0xea, 0x60, 0x80 },
                },
                // The baseline_hdr_headroom syntax element is 65535 but clamped to 60000 by Clause
                // C.3.4.
                {
                    .name = "baseline_hdr_headroom=65535",
                    .is_default_encoding = false,
                    .data = { 0x00, 0x40, 0xff, 0xff, 0x80 },
                }
            },
        },
        {
            .name = "ClampInRec601",
            .agtm = {
                .fHdrReferenceWhite = 100.f,
                .fHeadroomAdaptiveToneMap = {{
                    .fBaselineHdrHeadroom = 2.f,
                    .fGainApplicationSpacePrimaries = SkNamedPrimaries::kRec601,
                }},
            },
            .encodings = {
                {
                    .data = {
                        0x00, 0xc0, 0x01, 0xf4, 0x4e, 0x20, 0x0c, 0x7b, 0x0c, 0x42, 0x68, 0x3c,
                        0x8c, 0x74, 0x36, 0x1e, 0x46, 0x0d, 0xac, 0x3d, 0x13, 0x40, 0x42,
                    },
                },
            },
        },
        {
            .name = "OneAlternates",
                .agtm = {
                .fHdrReferenceWhite = 400.f,
                .fHeadroomAdaptiveToneMap = {{
                    .fBaselineHdrHeadroom = 4.f,
                    .fGainApplicationSpacePrimaries = SkNamedPrimaries::kSMPTE_EG_432_1,
                    .fAlternateImages = {
                        {
                            .fHdrHeadroom = 0.f,
                            .fColorGainFunction = {
                                .fComponentMixing = {.fMax = 1.f},
                                .fGainCurve = {
                                    .fControlPoints = {
                                        {1.f, 0.f, 0.f},
                                        {16.f, -4.f, 0.f},
                                    }
                                }
                            }
                        }
                    },
                }}
            },
            .encodings = {
                {
                    .data = {
                        0x00, 0xc0, 0x07, 0xd0, 0x9c, 0x40, 0x14, 0x00, 0x00, 0x00, 0x08, 0x03,
                        0xe8, 0x3e, 0x80, 0x00, 0x00, 0x9c, 0x40, 0x46, 0x50, 0x46, 0x50,
                    },
                },
            },
        },
        {
            .name = "OneAlternates-MaxValues",
                .agtm = {
                .fHeadroomAdaptiveToneMap = {{
                    .fBaselineHdrHeadroom = 6.f,
                    .fGainApplicationSpacePrimaries = SkNamedPrimaries::kRec2020,
                    .fAlternateImages = {
                        {
                            .fHdrHeadroom = 0.f,
                            .fColorGainFunction = {
                                .fComponentMixing = {.fMax = 1.f},
                                .fGainCurve = {
                                    .fControlPoints = {
                                        {64.f, -6.f, 0.f},
                                    }
                                }
                            }
                        }
                    },
                }}
            },
            .encodings = {
                {
                    .data = {
                        0x00, 0x40, 0xea, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x00, 0xea,
                        0x60, 0x46, 0x50,
                    },
                },
                // The gain_curve_control_points_x and gain_curve_control_points_y syntax elements
                // are 65535 but are clamped to 64000 and 60000 by Clause C.3.7.
                {
                    .name = "gain_curve_control_points_x/y=65535",
                    .is_default_encoding = false,
                    .data = {
                        0x00, 0x40, 0xea, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
                        0xff, 0x46, 0x50,
                    }
                }
            }
        },
        {
            .name = "FourAlternates",
            .agtm = {
                .fHdrReferenceWhite = 400.f,
                .fHeadroomAdaptiveToneMap = {{
                    .fBaselineHdrHeadroom = 2.f,
                    .fGainApplicationSpacePrimaries = SkNamedPrimaries::kSMPTE_EG_432_1,
                    .fAlternateImages = {
                        {
                            .fHdrHeadroom = 0.f,
                            .fColorGainFunction = {
                                .fComponentMixing = { .fMax = 0.75f, .fMin = 0.25f },
                                .fGainCurve = {
                                    .fControlPoints = {
                                        { .fX = 0.f, .fY = -1.f, .fM = 0.f },
                                    }
                                }
                            }
                        },
                        {
                            .fHdrHeadroom = 1.f,
                            .fColorGainFunction = {
                                .fComponentMixing = { .fMax = 1.f, },
                                .fGainCurve = {
                                    .fControlPoints = {
                                        { .fX = 0.f, .fY = -1.f,  .fM = 0.f  },
                                        { .fX = 1.f, .fY = -0.5f, .fM = 0.1f },
                                        { .fX = 2.f, .fY = -0.4f, .fM = 0.2f },
                                        { .fX = 3.f, .fY = -0.3f, .fM = 0.3f },
                                    },
                                },
                            },
                        },
                        {
                            .fHdrHeadroom = 3.f,
                            .fColorGainFunction = {
                                .fComponentMixing = { .fComponent = 1.f, },
                                .fGainCurve = {
                                    .fControlPoints = {
                                        { .fX = 0.f, .fY = 1.f,  .fM = 0.f  },
                                        { .fX = 1.f, .fY = 0.5f, .fM = 0.1f },
                                    },
                                },
                            },
                        },
                        {
                            .fHdrHeadroom = 4.f,
                            .fColorGainFunction = {
                                .fComponentMixing = {
                                    .fRed   = 0.3f,
                                    .fGreen = 0.6f,
                                    .fBlue  = 0.1f,
                                },
                                .fGainCurve = {
                                    .fControlPoints = {
                                        { .fX = 0.f, .fY = 1.f,  .fM = 0.f  },
                                        { .fX = 1.f, .fY = 0.5f, .fM = 0.1f },
                                        { .fX = 2.f, .fY = 0.4f, .fM = 0.5f  },
                                        { .fX = 2.f, .fY = 0.4f, .fM = 0.7f  },
                                    },
                                },
                            },
                        },
                    },
                }},
            },
            .encodings = {
                {
                    .data = {
                        0x00, 0xc0, 0x07, 0xd0, 0x4e, 0x20, 0x44, 0x00, 0x00, 0xc6, 0x92, 0x7c,
                        0x30, 0xd4, 0x00, 0x00, 0x00, 0x27, 0x10, 0x46, 0x50, 0x27, 0x10, 0x00,
                        0x18, 0x00, 0x00, 0x03, 0xe8, 0x07, 0xd0, 0x0b, 0xb8, 0x27, 0x10, 0x13,
                        0x88, 0x0f, 0xa0, 0x0b, 0xb8, 0x46, 0x50, 0x4a, 0xc6, 0x4f, 0x26, 0x53,
                        0x5c, 0x75, 0x30, 0x40, 0x08, 0x00, 0x00, 0x03, 0xe8, 0x27, 0x10, 0x13,
                        0x88, 0x46, 0x50, 0x4a, 0xc6, 0x9c, 0x40, 0xf8, 0x3a, 0x98, 0x75, 0x30,
                        0x13, 0x88, 0x18, 0x00, 0x00, 0x03, 0xe8, 0x07, 0xd0, 0x07, 0xd0, 0x27,
                        0x10, 0x13, 0x88, 0x0f, 0xa0, 0x0f, 0xa0, 0x46, 0x50, 0x4a, 0xc6, 0x5b,
                        0x11, 0x61, 0xa6,
                    },
                },
                // The num_alternate_images syntax element is 7 but clamped to 4 by Clause C.3.4.
                // The difference from the above is the 0x74 element, which was previously 0x44.
                {
                    .name = "num_alternate_images=7",
                    .is_default_encoding = false,
                    .data = {
                        0x00, 0xc0, 0x07, 0xd0, 0x4e, 0x20, 0x74, 0x00, 0x00, 0xc6, 0x92, 0x7c,
                        0x30, 0xd4, 0x00, 0x00, 0x00, 0x27, 0x10, 0x46, 0x50, 0x27, 0x10, 0x00,
                        0x18, 0x00, 0x00, 0x03, 0xe8, 0x07, 0xd0, 0x0b, 0xb8, 0x27, 0x10, 0x13,
                        0x88, 0x0f, 0xa0, 0x0b, 0xb8, 0x46, 0x50, 0x4a, 0xc6, 0x4f, 0x26, 0x53,
                        0x5c, 0x75, 0x30, 0x40, 0x08, 0x00, 0x00, 0x03, 0xe8, 0x27, 0x10, 0x13,
                        0x88, 0x46, 0x50, 0x4a, 0xc6, 0x9c, 0x40, 0xf8, 0x3a, 0x98, 0x75, 0x30,
                        0x13, 0x88, 0x18, 0x00, 0x00, 0x03, 0xe8, 0x07, 0xd0, 0x07, 0xd0, 0x27,
                        0x10, 0x13, 0x88, 0x0f, 0xa0, 0x0f, 0xa0, 0x46, 0x50, 0x4a, 0xc6, 0x5b,
                        0x11, 0x61, 0xa6,
                    },
                },
            },
        },
        {
            // This is an inverse tone map, computed using the script used to generate the figures
            // used in SMPTE ST 2094-50. This also tests using 32 control points (the maximum
            // allowable).
            .name = "InverseToneMap",
            .agtm = {
                .fHeadroomAdaptiveToneMap = {{
                    .fBaselineHdrHeadroom = 0.f,
                    .fGainApplicationSpacePrimaries = SkNamedPrimaries::kSMPTE_EG_432_1,
                    .fAlternateImages = {
                        {
                            .fHdrHeadroom = 2.f,
                            .fColorGainFunction = {
                                .fComponentMixing = {
                                    .fMax = 1.f,
                                },
                                .fGainCurve = {
                                    .fControlPoints = {
                                        { .fX = 0.5f,       .fY = 0.9998566f, .fM = 0.0015297f },
                                        { .fX = 0.5208116f, .fY = 1.0027409f, .fM = 0.2734709f },
                                        { .fX = 0.5413111f, .fY = 1.0109166f, .fM = 0.5211183f },
                                        { .fX = 0.5614984f, .fY = 1.0237336f, .fM = 0.7456896f },
                                        { .fX = 0.5813735f, .fY = 1.0406077f, .fM = 0.9495246f },
                                        { .fX = 0.6009365f, .fY = 1.0610152f, .fM = 1.1343419f },
                                        { .fX = 0.6201873f, .fY = 1.0844893f, .fM = 1.3021958f },
                                        { .fX = 0.6391259f, .fY = 1.1106143f, .fM = 1.4547685f },
                                        { .fX = 0.6577523f, .fY = 1.1390220f, .fM = 1.5937591f },
                                        { .fX = 0.6760665f, .fY = 1.1693869f, .fM = 1.7207136f },
                                        { .fX = 0.6940686f, .fY = 1.2014223f, .fM = 1.8370443f },
                                        { .fX = 0.7117585f, .fY = 1.2348758f, .fM = 1.9440458f },
                                        { .fX = 0.7291363f, .fY = 1.2695263f, .fM = 2.0429054f },
                                        { .fX = 0.7462018f, .fY = 1.3051801f, .fM = 2.1347281f },
                                        { .fX = 0.7629552f, .fY = 1.3416678f, .fM = 2.2204760f },
                                        { .fX = 0.7793964f, .fY = 1.3788421f, .fM = 2.3010690f },
                                        { .fX = 0.7955254f, .fY = 1.4165743f, .fM = 2.3773159f },
                                        { .fX = 0.8113423f, .fY = 1.4547529f, .fM = 2.4499659f },
                                        { .fX = 0.8268470f, .fY = 1.4932810f, .fM = 2.5197041f },
                                        { .fX = 0.8420395f, .fY = 1.5320748f, .fM = 2.5871586f },
                                        { .fX = 0.8569198f, .fY = 1.5710618f, .fM = 2.6529097f },
                                        { .fX = 0.8714880f, .fY = 1.6101797f, .fM = 2.7174979f },
                                        { .fX = 0.8857440f, .fY = 1.6493748f, .fM = 2.7814233f },
                                        { .fX = 0.8996878f, .fY = 1.6886011f, .fM = 2.8451656f },
                                        { .fX = 0.9133194f, .fY = 1.7278194f, .fM = 2.9091748f },
                                        { .fX = 0.9266389f, .fY = 1.7669963f, .fM = 2.9738880f },
                                        { .fX = 0.9396462f, .fY = 1.8061036f, .fM = 3.0397306f },
                                        { .fX = 0.9523413f, .fY = 1.8451175f, .fM = 3.1071218f },
                                        { .fX = 0.9647242f, .fY = 1.8840181f, .fM = 3.1764804f },
                                        { .fX = 0.9767950f, .fY = 1.9227892f, .fM = 3.2482303f },
                                        { .fX = 0.9885535f, .fY = 1.9614173f, .fM = 3.3228070f },
                                        { .fX = 1.0000000f, .fY = 1.9998918f, .fM = 3.4006599f },
                                    }
                                }
                            }
                        }
                    }
                }}
            },
            .encodings = {
                {
                    .data = {
                        0x00, 0x40, 0x00, 0x00, 0x14, 0x4e, 0x20, 0x00, 0xf8, 0x01, 0xf4, 0x02,
                        0x09, 0x02, 0x1d, 0x02, 0x31, 0x02, 0x45, 0x02, 0x59, 0x02, 0x6c, 0x02,
                        0x7f, 0x02, 0x92, 0x02, 0xa4, 0x02, 0xb6, 0x02, 0xc8, 0x02, 0xd9, 0x02,
                        0xea, 0x02, 0xfb, 0x03, 0x0b, 0x03, 0x1c, 0x03, 0x2b, 0x03, 0x3b, 0x03,
                        0x4a, 0x03, 0x59, 0x03, 0x67, 0x03, 0x76, 0x03, 0x84, 0x03, 0x91, 0x03,
                        0x9f, 0x03, 0xac, 0x03, 0xb8, 0x03, 0xc5, 0x03, 0xd1, 0x03, 0xdd, 0x03,
                        0xe8, 0x27, 0x0f, 0x27, 0x2b, 0x27, 0x7d, 0x27, 0xfd, 0x28, 0xa6, 0x29,
                        0x72, 0x2a, 0x5d, 0x2b, 0x62, 0x2c, 0x7e, 0x2d, 0xae, 0x2e, 0xee, 0x30,
                        0x3d, 0x31, 0x97, 0x32, 0xfc, 0x34, 0x69, 0x35, 0xdc, 0x37, 0x56, 0x38,
                        0xd4, 0x3a, 0x55, 0x3b, 0xd9, 0x3d, 0x5f, 0x3e, 0xe6, 0x40, 0x6e, 0x41,
                        0xf6, 0x43, 0x7e, 0x45, 0x06, 0x46, 0x8d, 0x48, 0x13, 0x49, 0x98, 0x4b,
                        0x1c, 0x4c, 0x9e, 0x4e, 0x1f, 0x46, 0x62, 0x52, 0x43, 0x5b, 0xd1, 0x62,
                        0xfe, 0x68, 0x4f, 0x6c, 0x48, 0x6f, 0x50, 0x71, 0xab, 0x73, 0x8b, 0x75,
                        0x0f, 0x76, 0x50, 0x77, 0x5c, 0x78, 0x40, 0x79, 0x04, 0x79, 0xaf, 0x7a,
                        0x46, 0x7a, 0xcd, 0x7b, 0x47, 0x7b, 0xb7, 0x7c, 0x1d, 0x7c, 0x7d, 0x7c,
                        0xd7, 0x7d, 0x2d, 0x7d, 0x7f, 0x7d, 0xce, 0x7e, 0x1b, 0x7e, 0x66, 0x7e,
                        0xb0, 0x7e, 0xf9, 0x7f, 0x42, 0x7f, 0x8a, 0x7f, 0xd3,
                    }
                }
            }
        },
        {
            .name = "Mix-Normalization",
            .agtm = {
                .fHeadroomAdaptiveToneMap = {{
                    .fBaselineHdrHeadroom = 1.f,
                    .fGainApplicationSpacePrimaries = SkNamedPrimaries::kRec2020,
                    .fAlternateImages = {
                        {
                            .fHdrHeadroom = 0.f,
                            .fColorGainFunction = {
                                .fComponentMixing = {.fMax = 0.75f, .fComponent = 0.25f},
                                .fGainCurve = {
                                    .fControlPoints = {
                                        {1.f, -1.f, -0.5f},
                                    }
                                }
                            }
                        }
                    },
                }}
            },
            .encodings = {
                {
                    .is_default_encoding = false,
                    .data = {
                        0x00, 0x40, 0x27, 0x10, 0x18, 0x00, 0x00, 0xc5, 0x00, 0x03, 0x00, 0x01,
                        0x00, 0x03, 0xe8, 0x27, 0x10, 0x31, 0x8f,
                    }
                }
            }
        }
    };

    for (const auto& test : tests) {
        skiatest::ReporterContext ctx(r, test.name);

        // Serialize the `agtm` member, and verify the bits come out as expected.
        auto serialized = test.agtm.serialize();
        REPORTER_ASSERT(r, serialized != nullptr);

        for (const auto& encoding : test.encodings) {
            skiatest::ReporterContext ctxSubSubTest(r, encoding.name ? encoding.name : "default");

            // Parse `encoding.data`, and verify that parsing it matches `agtm`.
            skhdr::AdaptiveGlobalToneMap agtmParsed;
            auto encoding_data = SkData::MakeWithoutCopy(
                encoding.data.data(), encoding.data.size());
            REPORTER_ASSERT(r, agtmParsed.parse(encoding_data.get()));
            assert_agtms_equal(r, test.agtm, agtmParsed);

            // If this is idempotent, then `encoding.data` should bit-equal `serialized`.
            REPORTER_ASSERT(r, encoding.is_default_encoding ==
                               SkData::Equals(serialized.get(), encoding_data.get()));
        }
    }
}

// Test the logic to apply the AGTM tone mapping.
DEF_TEST(HdrMetadata_Agtm_Apply_and_Shader, r) {
    // This will tone map several input colors to different targeted HDR headrooms using this
    // RWTMO metadata.
    skhdr::AdaptiveGlobalToneMap agtm = {
        .fHeadroomAdaptiveToneMap = {{
            .fBaselineHdrHeadroom = 2.f,
        }}
    };
    auto& hatm = agtm.fHeadroomAdaptiveToneMap.value();
    skhdr::AgtmHelpers::PopulateUsingRwtmo(hatm);

    // We will use the following input pixel values in gain application color space. These include
    // monochrome and non-monochrome values, as well as values that are less than white (less than
    // 1) and brighter than white (greater than 1).
    constexpr size_t kNumTestColors = 6;
    SkColor4f inputTestColors[kNumTestColors] = {
        {1.00f, 1.00f, 1.00f, 1.f},
        {1.00f, 0.50f, 0.25f, 1.f},
        {4.00f, 4.00f, 4.00f, 1.f},
        {1.00f, 2.00f, 4.00f, 1.f},
        {0.50f, 0.50f, 0.50f, 1.f},
        {2.00f, 2.00f, 2.00f, 1.f},
    };

    // We will test applying the gain for the following targetd HDR headroom values.
    constexpr size_t kNumTests = 5;
    const std::array<float, kNumTests> testTargetedHdrHeadrooms = {
            0.f,
            1.f,
            hatm.fAlternateImages[1].fHdrHeadroom,
            std::log2(3.f),
            2.f,
    };

    // These are the expected output pixel values for each of the targted HDR headrooms.
    SkColor4f expectedTestColors[kNumTests][kNumTestColors] = {
        {
            {0.565302f, 0.565302f, 0.565302f, 1.f},
            {0.565302f, 0.282651f, 0.141326f, 1.f},
            {1.000000f, 1.000000f, 1.000000f, 1.f},
            {0.250000f, 0.500000f, 1.000000f, 1.f},
            {0.282651f, 0.282651f, 0.282651f, 1.f},
            {0.815278f, 0.815278f, 0.815278f, 1.f},
        },
        {
            {0.898755f, 0.898755f, 0.898755f, 1.f},
            {0.898755f, 0.449377f, 0.224689f, 1.f},
            {2.000000f, 2.000000f, 2.000000f, 1.f},
            {0.500000f, 1.000000f, 2.000000f, 1.f},
            {0.449377f, 0.449377f, 0.449377f, 1.f},
            {1.471569f, 1.471569f, 1.471569f, 1.f},
        },
        {
            {1.000000f, 1.000000f, 1.000000f, 1.f},
            {1.000000f, 0.500000f, 0.250000f, 1.f},
            {2.346040f, 2.346040f, 2.346040f, 1.f},
            {0.586510f, 1.173020f, 2.346040f, 1.f},
            {0.500000f, 0.500000f, 0.500000f, 1.f},
            {1.685886f, 1.685886f, 1.685886f, 1.f},
        },
        {
            {1.000000f, 1.000000f, 1.000000f, 1.f},
            {1.000000f, 0.500000f, 0.250000f, 1.f},
            {3.000000f, 3.000000f, 3.000000f, 1.f},
            {0.750000f, 1.500000f, 3.000000f, 1.f},
            {0.500000f, 0.500000f, 0.500000f, 1.f},
            {1.823991f, 1.823991f, 1.823991f, 1.f},
        },
        {
            {1.00f, 1.00f, 1.00f, 1.f},
            {1.00f, 0.50f, 0.25f, 1.f},
            {4.00f, 4.00f, 4.00f, 1.f},
            {1.00f, 2.00f, 4.00f, 1.f},
            {0.50f, 0.50f, 0.50f, 1.f},
            {2.00f, 2.00f, 2.00f, 1.f},
        },
    };

    // All of the math is done with at least half-precision. Given the range of values we are in
    // (not far from 1), we should maintain at least ten bit precision.
    constexpr float kEpsilon = 1.f/1024.f;

    // Test the AgtmHelpers::ApplyGain function.
    for (size_t t = 0; t < kNumTests; ++t) {
        const auto targetedHdrHeadroom = testTargetedHdrHeadrooms[t];
        skiatest::ReporterContext ctx(
            r,
            SkStringPrintf("AgtmHelpers::ApplyGain, targetedHdrHeadroom:%f", targetedHdrHeadroom));

        // Copy the inputTextColors to outputTestColors (because ApplyGain works in-place).
        SkColor4f outputTestColors[kNumTestColors];
        for (size_t i = 0; i < kNumTestColors; ++i) {
            outputTestColors[i] = inputTestColors[i];
        }

        // Apply the tone mapping gain in-place on outputTestColors.
        skhdr::AgtmHelpers::ApplyGain(hatm,
                                      SkSpan<SkColor4f>(outputTestColors, kNumTestColors),
                                      targetedHdrHeadroom);

        // Verify the result matches expectations.
        for (size_t i = 0; i < kNumTestColors; ++i) {
            const auto& output = outputTestColors[i];
            const auto& expected = expectedTestColors[t][i];

            REPORTER_ASSERT(r, SkScalarNearlyEqual(output.fR, expected.fR, kEpsilon));
            REPORTER_ASSERT(r, SkScalarNearlyEqual(output.fG, expected.fG, kEpsilon));
            REPORTER_ASSERT(r, SkScalarNearlyEqual(output.fB, expected.fB, kEpsilon));
            REPORTER_ASSERT(r, SkScalarNearlyEqual(output.fA, expected.fA, kEpsilon));
        }
    }

    // Test using an SkColorFilter from skhdr::Metadata.
    for (size_t t = 0; t < kNumTests; ++t) {
        const auto targetedHdrHeadroom = testTargetedHdrHeadrooms[t];
        skiatest::ReporterContext ctx(
            r, SkStringPrintf("skhdr::Metadata::makeToneMapColorFilter, targetedHdrHeadroom:%f",
                targetedHdrHeadroom));

        // The input and output images will be kNumTestColors-by-1.
        const auto info = SkImageInfo::Make(
            kNumTestColors, 1,
            kRGBA_F32_SkColorType, kPremul_SkAlphaType,
            skhdr::AgtmHelpers::GetGainApplicationSpace(hatm));

        // Create an SkImage that references the inputTestColors array directly.
        const auto inputImage = SkImages::RasterFromData(
            info,
            SkData::MakeWithoutCopy(inputTestColors, sizeof(inputTestColors)),
            info.minRowBytes());

        constexpr size_t kNumInputImages = 3;
        std::array<const char*, kNumInputImages> inputImageNames = {
                "linear",
                "pq",
                "pq-100",
        };
        std::array<sk_sp<SkImage>, kNumInputImages> inputImages;
        inputImages[0] = inputImage;
        inputImages[1] = inputImage->makeColorSpace(
            nullptr, SkColorSpace::MakeRGB(SkNamedTransferFn::kPQ, SkNamedGamut::kRec2020), {});
        {
            skcms_TransferFunction pq100;
            skcms_TransferFunction_makePQ(&pq100, 100);
            inputImages[2] = inputImages[1]->reinterpretColorSpace(
                SkColorSpace::MakeRGB(pq100, SkNamedGamut::kRec2020));
        }
        for (size_t s = 0; s < kNumInputImages; ++s) {
            skiatest::ReporterContext subCtx(
                r, SkStringPrintf("inputImage:%s", inputImageNames[s]));

            // Create an output SkBitmap to draw into.
            SkBitmap bm;
            bm.allocPixels(info);

            // Call drawImage, using the color filter created by Agtm::makeColorFilter.
            {
                skhdr::Metadata metadata;
                metadata.setAdaptiveGlobalToneMap(agtm);
                auto colorFilter = metadata.makeToneMapColorFilter(
                    targetedHdrHeadroom, inputImages[s]->colorSpace());

                SkPaint paint;
                SkASSERT(colorFilter);
                paint.setColorFilter(colorFilter);
                auto canvas = SkCanvas::MakeRasterDirect(bm.info(), bm.getPixels(), bm.rowBytes());
                canvas->drawImage(inputImages[s].get(), 0, 0, SkSamplingOptions(), &paint);
            }

            // Verify that the pixels written into the SkBitmap match the expected values.
            for (size_t i = 0; i < kNumTestColors; ++i) {
                // There is more error in the PQ transfer function.
                constexpr float kLooserEpsilon = 1.f/100.f;

                const auto& output = *reinterpret_cast<const SkColor4f*>(bm.getAddr(i, 0));
                const auto& expected = expectedTestColors[t][i];
                REPORTER_ASSERT(r, SkScalarNearlyEqual(output.fR, expected.fR, kLooserEpsilon));
                REPORTER_ASSERT(r, SkScalarNearlyEqual(output.fG, expected.fG, kLooserEpsilon));
                REPORTER_ASSERT(r, SkScalarNearlyEqual(output.fB, expected.fB, kLooserEpsilon));
                REPORTER_ASSERT(r, SkScalarNearlyEqual(output.fA, expected.fA, kLooserEpsilon));
            }
        }
    }
}

DEF_TEST(HdrMetadata_ShaderParams, r) {
    sk_sp<SkColorSpace> cs_srgb = SkColorSpace::MakeSRGB();
    sk_sp<SkColorSpace> cs_pq = SkColorSpace::MakeRGB(
        SkNamedTransferFn::kPQ, SkNamedGamut::kRec2020);
    sk_sp<SkColorSpace> cs_pq100;
    {
        skcms_TransferFunction pq100;
        skcms_TransferFunction_makePQ(&pq100, 100);
        cs_pq100 = SkColorSpace::MakeRGB(pq100, SkNamedGamut::kRec2020);
    }

    // Start with CLLI and MDCV metadata.
    skhdr::Metadata metadata;
    {
        skhdr::ContentLightLevelInformation clli;
        clli.fMaxCLL = 406.f;
        metadata.setContentLightLevelInformation(clli);

        skhdr::MasteringDisplayColorVolume mdcv;
        mdcv.fMaximumDisplayMasteringLuminance = 812.f;
        metadata.setMasteringDisplayColorVolume(mdcv);
    }

    skhdr::AdaptiveGlobalToneMap toneMapAgtm;
    float scaleFactor = 1.f;

    // Because this has no AGTM metadata, SDR inputs get no tone mapping shader.
    REPORTER_ASSERT(r, !skhdr::AgtmHelpers::PopulateToneMapAgtmParams(
        metadata, cs_srgb.get(), &toneMapAgtm, &scaleFactor));

    // This will have headroom log2(406/203)=1 for PQ.
    REPORTER_ASSERT(r, skhdr::AgtmHelpers::PopulateToneMapAgtmParams(
        metadata, cs_pq.get(), &toneMapAgtm, &scaleFactor));
    REPORTER_ASSERT(r, scaleFactor == 1.f);
    REPORTER_ASSERT(r, toneMapAgtm.fHeadroomAdaptiveToneMap.has_value());
    REPORTER_ASSERT(r,
        toneMapAgtm.fHeadroomAdaptiveToneMap->fBaselineHdrHeadroom == 1.f);

    // This will have headroom log2(406/100) for PQ with 100 nit white.
    REPORTER_ASSERT(r, skhdr::AgtmHelpers::PopulateToneMapAgtmParams(
        metadata, cs_pq100.get(), &toneMapAgtm, &scaleFactor));
    REPORTER_ASSERT(r, scaleFactor == 1.f);
    REPORTER_ASSERT(r, toneMapAgtm.fHeadroomAdaptiveToneMap.has_value());
    REPORTER_ASSERT(r,
        toneMapAgtm.fHeadroomAdaptiveToneMap->fBaselineHdrHeadroom == std::log2(4.06f));

    // Invalidate the CLLI metadata.
    {
        skhdr::ContentLightLevelInformation clli;
        clli.fMaxCLL = 0.f;
        metadata.setContentLightLevelInformation(clli);
    }

    // This will now have headroom log2(812/203)=2 for PQ.
    REPORTER_ASSERT(r, skhdr::AgtmHelpers::PopulateToneMapAgtmParams(
        metadata, cs_pq.get(), &toneMapAgtm, &scaleFactor));
    REPORTER_ASSERT(r, scaleFactor == 1.f);
    REPORTER_ASSERT(r, toneMapAgtm.fHeadroomAdaptiveToneMap.has_value());
    REPORTER_ASSERT(r,
        toneMapAgtm.fHeadroomAdaptiveToneMap->fBaselineHdrHeadroom == 2.f);

    // Set AGTM metadata with just white level set.
    {
        skhdr::AdaptiveGlobalToneMap agtm;
        agtm.fHdrReferenceWhite = 100.f;
        metadata.setAdaptiveGlobalToneMap(agtm);
    }

    // PQ input at 203 nits will be scaled now.
    REPORTER_ASSERT(r, skhdr::AgtmHelpers::PopulateToneMapAgtmParams(
        metadata, cs_pq.get(), &toneMapAgtm, &scaleFactor));
    REPORTER_ASSERT(r, scaleFactor == 203.f/100.f);
    REPORTER_ASSERT(r, toneMapAgtm.fHeadroomAdaptiveToneMap.has_value());
    REPORTER_ASSERT(r,
        toneMapAgtm.fHeadroomAdaptiveToneMap->fBaselineHdrHeadroom == std::log2(812.f / 100.f));

    // PQ input at 100 nits will not be scaled now.
    REPORTER_ASSERT(r, skhdr::AgtmHelpers::PopulateToneMapAgtmParams(
        metadata, cs_pq100.get(), &toneMapAgtm, &scaleFactor));
    REPORTER_ASSERT(r, scaleFactor == 1.f);
    REPORTER_ASSERT(r, toneMapAgtm.fHeadroomAdaptiveToneMap.has_value());
    REPORTER_ASSERT(r,
        toneMapAgtm.fHeadroomAdaptiveToneMap->fBaselineHdrHeadroom == std::log2(812.f / 100.f));
}

DEF_TEST(HdrMetadata_Agtm_Invalid, r) {
    const skhdr::AdaptiveGlobalToneMap agtm_baseline_0 = {
        .fHeadroomAdaptiveToneMap = {{
            .fBaselineHdrHeadroom = 0.0f,
            .fGainApplicationSpacePrimaries = SkNamedPrimaries::kRec2020,
        }},
    };
    const skhdr::AdaptiveGlobalToneMap agtm_baseline_2 = {
        .fHeadroomAdaptiveToneMap = {{
            .fBaselineHdrHeadroom = 2.0f,
            .fGainApplicationSpacePrimaries = SkNamedPrimaries::kRec2020,
        }},
    };

    {
        skiatest::ReporterContext ctx(r, "HdrReferenceWhite too low");
        skhdr::AdaptiveGlobalToneMap agtm = { .fHdrReferenceWhite = -1.f };
        REPORTER_ASSERT(r, !skhdr::AgtmHelpers::Validate(agtm));
    }
    {
        skiatest::ReporterContext ctx(r, "HdrReferenceWhite too high");
        skhdr::AdaptiveGlobalToneMap agtm = { .fHdrReferenceWhite = 10000.1f };
        REPORTER_ASSERT(r, !skhdr::AgtmHelpers::Validate(agtm));
    }
    {
        skiatest::ReporterContext ctx(r, "BaselineHdrHeadroom too low");
        skhdr::AdaptiveGlobalToneMap agtm = {
            .fHeadroomAdaptiveToneMap = {{
                .fBaselineHdrHeadroom = -0.01f,
            }},
        };
        REPORTER_ASSERT(r, !skhdr::AgtmHelpers::Validate(agtm));
    }
    {
        skiatest::ReporterContext ctx(r, "BaselineHdrHeadroom too high");
        skhdr::AdaptiveGlobalToneMap agtm = {
            .fHeadroomAdaptiveToneMap = {{
                .fBaselineHdrHeadroom = 6.01f,
            }},
        };
        REPORTER_ASSERT(r, !skhdr::AgtmHelpers::Validate(agtm));
    }
    {
        skiatest::ReporterContext ctx(r, "Equal headrooms");
        skhdr::AdaptiveGlobalToneMap agtm = agtm_baseline_0;
        agtm.fHeadroomAdaptiveToneMap->fAlternateImages = {
            {
                .fHdrHeadroom = 0.f,
                .fColorGainFunction = {
                    .fComponentMixing = {.fMax = 1.f},
                    .fGainCurve = { .fControlPoints = { {0.f, 0.f, 0.f}, } }
                }
            }
        };
        REPORTER_ASSERT(r, !skhdr::AgtmHelpers::Validate(agtm));
    }
    {
        skiatest::ReporterContext ctx(r, "Non-monotone headrooms");
        skhdr::AdaptiveGlobalToneMap agtm = agtm_baseline_0;
        agtm.fHeadroomAdaptiveToneMap->fAlternateImages = {
            {
                .fHdrHeadroom = 1.f,
                .fColorGainFunction = {
                    .fComponentMixing = {.fMax = 1.f},
                    .fGainCurve = { .fControlPoints = { {0.f, 0.f, 0.f}, } }
                }
            },
            {
                .fHdrHeadroom = 2.f,
                .fColorGainFunction = {
                    .fComponentMixing = {.fMax = 1.f},
                    .fGainCurve = { .fControlPoints = { {0.f, 0.f, 0.f}, } }
                }
            },
        };
        REPORTER_ASSERT(r, skhdr::AgtmHelpers::Validate(agtm));
        std::swap(agtm.fHeadroomAdaptiveToneMap->fAlternateImages[0],
                  agtm.fHeadroomAdaptiveToneMap->fAlternateImages[1]);
        REPORTER_ASSERT(r, !skhdr::AgtmHelpers::Validate(agtm));
    }
    {
        skiatest::ReporterContext ctx(r, "Non-monotone X");
        skhdr::AdaptiveGlobalToneMap agtm = agtm_baseline_2;
        agtm.fHeadroomAdaptiveToneMap->fAlternateImages = {
            {
                .fHdrHeadroom = 0.f,
                .fColorGainFunction = {
                    .fComponentMixing = {.fMax = 1.f},
                    .fGainCurve = {
                        .fControlPoints = {
                            {4.f, -2.f, 0.f},
                            {0.f, 0.f, 0.f},
                        }
                    }
                }
            },
        };
        REPORTER_ASSERT(r, !skhdr::AgtmHelpers::Validate(agtm));
    }
    {
        skiatest::ReporterContext ctx(r, "Discontinuous Y");
        skhdr::AdaptiveGlobalToneMap agtm = agtm_baseline_2;
        agtm.fHeadroomAdaptiveToneMap->fAlternateImages = {
            {
                .fHdrHeadroom = 0.f,
                .fColorGainFunction = {
                    .fComponentMixing = {.fMax = 1.f},
                    .fGainCurve = {
                        .fControlPoints = {
                            {0.f, 0.f, 0.f},
                            {2.f, -1.f, 0.f},
                            {2.f, -1.f, 0.f},
                            {4.f, -2.f, 0.f},
                        }
                    }
                }
            },
        };
        REPORTER_ASSERT(r, skhdr::AgtmHelpers::Validate(agtm));

        auto& alt = agtm.fHeadroomAdaptiveToneMap->fAlternateImages[0];
        alt.fColorGainFunction.fGainCurve.fControlPoints[2].fY = -2.f;
        REPORTER_ASSERT(r, !skhdr::AgtmHelpers::Validate(agtm));
    }
}

