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

#include "Resources.h"
#include "SkColorSpace.h"
#include "SkColorSpacePriv.h"
#include "SkColorSpace_XYZ.h"
#include "SkData.h"
#include "SkICC.h"
#include "SkICCPriv.h"
#include "SkMatrix44.h"
#include "SkStream.h"
#include "Test.h"

static bool almost_equal(float a, float b) {
    return SkTAbs(a - b) < 0.001f;
}

static inline void test_to_xyz_d50(skiatest::Reporter* r, SkICC* icc, bool shouldSucceed,
                                   const float* reference) {
    SkMatrix44 result(SkMatrix44::kUninitialized_Constructor);
    REPORTER_ASSERT(r, shouldSucceed == icc->toXYZD50(&result));
    if (shouldSucceed) {
        float resultVals[16];
        result.asColMajorf(resultVals);
        for (int i = 0; i < 16; i++) {
            REPORTER_ASSERT(r, almost_equal(resultVals[i], reference[i]));
        }
    }
}

DEF_TEST(ICC_ToXYZD50, r) {
    const float z30Reference[16] = {
        0.59825f, 0.27103f, 0.00603f, 0.0f, 0.22243f, 0.67447f, 0.07368f, 0.0f, 0.14352f, 0.05449f,
        0.74519f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
    };

    sk_sp<SkData> data = SkData::MakeFromFileName(
            GetResourcePath("icc_profiles/HP_ZR30w.icc").c_str());
    sk_sp<SkICC> z30 = SkICC::Make(data->data(), data->size());
    test_to_xyz_d50(r, z30.get(), true, z30Reference);

    const float z32Reference[16] = {
        0.61583f, 0.28789f, 0.00513f, 0.0f, 0.20428f, 0.66972f, 0.06609f, 0.0f, 0.14409f, 0.04237f,
        0.75368f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
    };

    data = SkData::MakeFromFileName( GetResourcePath("icc_profiles/HP_Z32x.icc").c_str());
    sk_sp<SkICC> z32 = SkICC::Make(data->data(), data->size());
    test_to_xyz_d50(r, z32.get(), true, z32Reference);

    data = SkData::MakeFromFileName(GetResourcePath("icc_profiles/upperLeft.icc").c_str());
    sk_sp<SkICC> upperLeft = SkICC::Make(data->data(), data->size());
    test_to_xyz_d50(r, upperLeft.get(), false, z32Reference);

    data = SkData::MakeFromFileName(GetResourcePath("icc_profiles/upperRight.icc").c_str());
    sk_sp<SkICC> upperRight = SkICC::Make(data->data(), data->size());
    test_to_xyz_d50(r, upperRight.get(), false, z32Reference);
}

static inline void test_is_numerical_transfer_fn(skiatest::Reporter* r, SkICC* icc,
                                                 bool shouldSucceed,
                                                 const SkColorSpaceTransferFn& reference) {
    SkColorSpaceTransferFn result;
    REPORTER_ASSERT(r, shouldSucceed == icc->isNumericalTransferFn(&result));
    if (shouldSucceed) {
        REPORTER_ASSERT(r, 0 == memcmp(&result, &reference, sizeof(SkColorSpaceTransferFn)));
    }
}

DEF_TEST(ICC_IsNumericalTransferFn, r) {
    SkColorSpaceTransferFn referenceFn;
    referenceFn.fA = 1.0f;
    referenceFn.fB = 0.0f;
    referenceFn.fC = 0.0f;
    referenceFn.fD = 0.0f;
    referenceFn.fE = 0.0f;
    referenceFn.fF = 0.0f;
    referenceFn.fG = 2.2f;

    sk_sp<SkData> data = SkData::MakeFromFileName(
            GetResourcePath("icc_profiles/HP_ZR30w.icc").c_str());
    sk_sp<SkICC> z30 = SkICC::Make(data->data(), data->size());
    test_is_numerical_transfer_fn(r, z30.get(), true, referenceFn);

    data = SkData::MakeFromFileName( GetResourcePath("icc_profiles/HP_Z32x.icc").c_str());
    sk_sp<SkICC> z32 = SkICC::Make(data->data(), data->size());
    test_is_numerical_transfer_fn(r, z32.get(), true, referenceFn);

    data = SkData::MakeFromFileName(GetResourcePath("icc_profiles/upperLeft.icc").c_str());
    sk_sp<SkICC> upperLeft = SkICC::Make(data->data(), data->size());
    test_is_numerical_transfer_fn(r, upperLeft.get(), false, referenceFn);

    data = SkData::MakeFromFileName(GetResourcePath("icc_profiles/upperRight.icc").c_str());
    sk_sp<SkICC> upperRight = SkICC::Make(data->data(), data->size());
    test_is_numerical_transfer_fn(r, upperRight.get(), false, referenceFn);
}

static inline void test_write_icc(skiatest::Reporter* r, const SkColorSpaceTransferFn& fn,
                                  const SkMatrix44& toXYZD50, SkColorSpace* reference,
                                  bool writeToFile) {
    sk_sp<SkData> profile = SkICC::WriteToICC(fn, toXYZD50);
    if (writeToFile) {
        SkFILEWStream stream("out.icc");
        stream.write(profile->data(), profile->size());
    }

    sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeICC(profile->data(), profile->size());
    REPORTER_ASSERT(r, SkColorSpace::Equals(reference, colorSpace.get()));
}

template <typename T>
static bool equal(const SkTArray<T>& u, const SkTArray<T>& v) {
    if (u.count() != v.count()) {
        return false;
    }
    return u.count() == 0 || 0 == memcmp(&u[0], &v[0], sizeof(T) * u.count());
}

DEF_TEST(ICC_WriteICC, r) {
    SkColorSpaceTransferFn adobeFn;
    adobeFn.fA = 1.0f;
    adobeFn.fB = 0.0f;
    adobeFn.fC = 0.0f;
    adobeFn.fD = 0.0f;
    adobeFn.fE = 0.0f;
    adobeFn.fF = 0.0f;
    adobeFn.fG = 2.2f;
    SkMatrix44 adobeMatrix(SkMatrix44::kUninitialized_Constructor);
    adobeMatrix.set3x3RowMajorf(gAdobeRGB_toXYZD50);
    test_write_icc(r, adobeFn, adobeMatrix,
                   SkColorSpace_Base::MakeNamed(SkColorSpace_Base::kAdobeRGB_Named).get(), false);

    SkColorSpaceTransferFn srgbFn;
    srgbFn.fA = 1.0f / 1.055f;
    srgbFn.fB = 0.055f / 1.055f;
    srgbFn.fC = 1.0f / 12.92f;
    srgbFn.fD = 0.04045f;
    srgbFn.fE = 0.0f;
    srgbFn.fF = 0.0f;
    srgbFn.fG = 2.4f;
    SkMatrix44 srgbMatrix(SkMatrix44::kUninitialized_Constructor);
    srgbMatrix.set3x3RowMajorf(gSRGB_toXYZD50);
    test_write_icc(r, srgbFn, srgbMatrix, SkColorSpace::MakeSRGB().get(),
                   false);

    SkTArray<uint8_t> adobeTag;
    adobeTag.reset(SkToInt(SkICCWriteDescriptionTag(nullptr, adobeFn, adobeMatrix)));
    SkICCWriteDescriptionTag(&adobeTag[0], adobeFn, adobeMatrix);

    SkTArray<uint8_t> srgbTag;
    srgbTag.reset(SkToInt(SkICCWriteDescriptionTag(nullptr, srgbFn, srgbMatrix)));
    SkICCWriteDescriptionTag(&srgbTag[0], srgbFn, srgbMatrix);

    REPORTER_ASSERT(r, !equal(adobeTag, srgbTag));
}

static inline void test_raw_transfer_fn(skiatest::Reporter* r, SkICC* icc) {
    SkICC::Tables tables;
    bool result = icc->rawTransferFnData(&tables);
    REPORTER_ASSERT(r, result);

    REPORTER_ASSERT(r, 0.0f == tables.red()[0]);
    REPORTER_ASSERT(r, 0.0f == tables.green()[0]);
    REPORTER_ASSERT(r, 0.0f == tables.blue()[0]);
    REPORTER_ASSERT(r, 1.0f == tables.red()[tables.fRed.fCount - 1]);
    REPORTER_ASSERT(r, 1.0f == tables.green()[tables.fGreen.fCount - 1]);
    REPORTER_ASSERT(r, 1.0f == tables.blue()[tables.fBlue.fCount - 1]);
}

class ICCTest {
public:
    static sk_sp<SkICC> MakeICC(sk_sp<SkColorSpace> space) {
        return sk_sp<SkICC>(new SkICC(std::move(space)));
    }
    static sk_sp<SkICC> MakeICC(sk_sp<SkGammas> gammas) {
        return MakeICC(sk_sp<SkColorSpace>(new SkColorSpace_XYZ(
                kNonStandard_SkGammaNamed, std::move(gammas),
                SkMatrix44(SkMatrix44::kIdentity_Constructor), nullptr)));
    }
};

DEF_TEST(ICC_RawTransferFns, r) {
    sk_sp<SkICC> srgb = ICCTest::MakeICC(SkColorSpace::MakeSRGB());
    test_raw_transfer_fn(r, srgb.get());

    sk_sp<SkICC> adobe =
            ICCTest::MakeICC(SkColorSpace_Base::MakeNamed(SkColorSpace_Base::kAdobeRGB_Named));
    test_raw_transfer_fn(r, adobe.get());

    // Lookup-table based gamma curves
    constexpr size_t tableSize = 10;
    void* memory = sk_malloc_throw(sizeof(SkGammas) + sizeof(float) * tableSize);
    sk_sp<SkGammas> gammas = sk_sp<SkGammas>(new (memory) SkGammas(3));
    for (int i = 0; i < 3; ++i) {
        gammas->fType[i] = SkGammas::Type::kTable_Type;
        gammas->fData[i].fTable.fSize = tableSize;
        gammas->fData[i].fTable.fOffset = 0;
    }

    float* table = SkTAddOffset<float>(memory, sizeof(SkGammas));
    table[0] = 0.00f;
    table[1] = 0.05f;
    table[2] = 0.10f;
    table[3] = 0.15f;
    table[4] = 0.25f;
    table[5] = 0.35f;
    table[6] = 0.45f;
    table[7] = 0.60f;
    table[8] = 0.75f;
    table[9] = 1.00f;
    sk_sp<SkICC> tbl = ICCTest::MakeICC(gammas);
    test_raw_transfer_fn(r, tbl.get());

    // Parametric gamma curves
    memory = sk_malloc_throw(sizeof(SkGammas) + sizeof(SkColorSpaceTransferFn));
    gammas = sk_sp<SkGammas>(new (memory) SkGammas(3));
    for (int i = 0; i < 3; ++i) {
        gammas->fType[i] = SkGammas::Type::kParam_Type;
        gammas->fData[i].fParamOffset = 0;
    }

    SkColorSpaceTransferFn* params = SkTAddOffset<SkColorSpaceTransferFn>
            (memory, sizeof(SkGammas));

    // Interval.
    params->fD = 0.04045f;

    // First equation:
    params->fC = 1.0f / 12.92f;
    params->fF = 0.0f;

    // Second equation:
    // Note that the function is continuous (it's actually sRGB).
    params->fA = 1.0f / 1.055f;
    params->fB = 0.055f / 1.055f;
    params->fE = 0.0f;
    params->fG = 2.4f;
    sk_sp<SkICC> param = ICCTest::MakeICC(gammas);
    test_raw_transfer_fn(r, param.get());

    // Exponential gamma curves
    gammas = sk_sp<SkGammas>(new SkGammas(3));
    for (int i = 0; i < 3; ++i) {
        gammas->fType[i] = SkGammas::Type::kValue_Type;
        gammas->fData[i].fValue = 1.4f;
    }
    sk_sp<SkICC> exp = ICCTest::MakeICC(gammas);
    test_raw_transfer_fn(r, exp.get());

    gammas = sk_sp<SkGammas>(new SkGammas(3));
    gammas->fType[0] = gammas->fType[1] = gammas->fType[2] = SkGammas::Type::kNamed_Type;
    gammas->fData[0].fNamed = kSRGB_SkGammaNamed;
    gammas->fData[1].fNamed = k2Dot2Curve_SkGammaNamed;
    gammas->fData[2].fNamed = kLinear_SkGammaNamed;
    sk_sp<SkICC> named = ICCTest::MakeICC(gammas);
    test_raw_transfer_fn(r, named.get());

    memory = sk_malloc_throw(sizeof(SkGammas) + sizeof(float) * tableSize +
                                   sizeof(SkColorSpaceTransferFn));
    gammas = sk_sp<SkGammas>(new (memory) SkGammas(3));

    table = SkTAddOffset<float>(memory, sizeof(SkGammas));
    table[0] = 0.00f;
    table[1] = 0.15f;
    table[2] = 0.20f;
    table[3] = 0.25f;
    table[4] = 0.35f;
    table[5] = 0.45f;
    table[6] = 0.55f;
    table[7] = 0.70f;
    table[8] = 0.85f;
    table[9] = 1.00f;

    params = SkTAddOffset<SkColorSpaceTransferFn>(memory,
            sizeof(SkGammas) + sizeof(float) * tableSize);
    params->fA = 1.0f / 1.055f;
    params->fB = 0.055f / 1.055f;
    params->fC = 1.0f / 12.92f;
    params->fD = 0.04045f;
    params->fE = 0.0f;
    params->fF = 0.0f;
    params->fG = 2.4f;

    gammas->fType[0] = SkGammas::Type::kValue_Type;
    gammas->fData[0].fValue = 1.2f;

    gammas->fType[1] = SkGammas::Type::kTable_Type;
    gammas->fData[1].fTable.fSize = tableSize;
    gammas->fData[1].fTable.fOffset = 0;

    gammas->fType[2] = SkGammas::Type::kParam_Type;
    gammas->fData[2].fParamOffset = sizeof(float) * tableSize;
    sk_sp<SkICC> nonstd = ICCTest::MakeICC(gammas);
    test_raw_transfer_fn(r, nonstd.get());

    // Reverse order of table and exponent
    gammas->fType[1] = SkGammas::Type::kValue_Type;
    gammas->fData[1].fValue = 1.2f;

    gammas->fType[0] = SkGammas::Type::kTable_Type;
    gammas->fData[0].fTable.fSize = tableSize;
    gammas->fData[0].fTable.fOffset = 0;
    sk_sp<SkICC> nonstd2 = ICCTest::MakeICC(gammas);
    test_raw_transfer_fn(r, nonstd2.get());
}
