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

#ifndef SkColorSpaceXformPriv_DEFINED
#define SkColorSpaceXformPriv_DEFINED

#include "SkColorSpace_Base.h"
#include "SkHalf.h"
#include "SkSRGB.h"

#define SkCSXformPrintfDefined 0
#define SkCSXformPrintf(...)

// Interpolating lookup in a variably sized table.
static inline float interp_lut(float input, const float* table, int tableSize) {
    float index = input * (tableSize - 1);
    float diff = index - sk_float_floor2int(index);
    return table[(int) sk_float_floor2int(index)] * (1.0f - diff) +
           table[(int) sk_float_ceil2int(index)] * diff;
}

// Expand range from 0-1 to 0-255, then convert.
static inline uint8_t clamp_normalized_float_to_byte(float v) {
    // The ordering of the logic is a little strange here in order
    // to make sure we convert NaNs to 0.
    v = v * 255.0f;
    if (v >= 254.5f) {
        return 255;
    } else if (v >= 0.5f) {
        return (uint8_t) (v + 0.5f);
    } else {
        return 0;
    }
}

static inline float clamp_0_1(float v) {
    if (v >= 1.0f) {
        return 1.0f;
    } else if (v >= 0.0f) {
        return v;
    } else {
        return 0.0f;
    }
}

/**
 *  Invert table lookup.  Ex: what indices corresponds to the input values?
 *  This will have strange results when the table is not increasing.
 *  But any sane gamma function will be increasing.
 *  @param outTableFloat Destination table for float (0-1) results. Can be nullptr if not wanted.
 *  @param outTableByte  Destination table for byte (0-255) results. Can be nullptr if not wanted.
 *  @param outTableSize  Number of elements in |outTableFloat| or |outTableBytes|
 *  @param inTable       The source table to invert
 *  @param inTableSize   The number of elements in |inTable|
 */
static inline void invert_table_gamma(float* outTableFloat, uint8_t* outTableByte,
                                      int outTableSize, const float* inTable, int inTableSize) {
    // should never have a gamma table this small anyway, 0/1 are either not allowed
    // or imply a non-table gamma such as linear/exponential
    SkASSERT(inTableSize >= 2);
    int inIndex = 1;
    for (int outIndex = 0; outIndex < outTableSize; ++outIndex) {
        const float input = outIndex / (outTableSize - 1.0f);
        while (inIndex < inTableSize - 1 && inTable[inIndex] < input) {
            ++inIndex;
        }
        const float diff            = input - inTable[inIndex - 1];
        const float distance        = inTable[inIndex] - inTable[inIndex - 1];
        const float normalizedIndex = (inIndex - 1) + diff / distance;
        const float index           = normalizedIndex / (inTableSize - 1);
        if (outTableByte) {
            outTableByte[outIndex] = clamp_normalized_float_to_byte(index);
        }
        if (outTableFloat) {
            outTableFloat[outIndex] = clamp_0_1(index);
        }
    }
}

static inline SkColorSpaceXform::ColorFormat select_xform_format(SkColorType colorType) {
    switch (colorType) {
        case kRGBA_8888_SkColorType:
            return SkColorSpaceXform::kRGBA_8888_ColorFormat;
        case kBGRA_8888_SkColorType:
            return SkColorSpaceXform::kBGRA_8888_ColorFormat;
        case kRGBA_F16_SkColorType:
            return SkColorSpaceXform::kRGBA_F16_ColorFormat;
        case kIndex_8_SkColorType:
#ifdef SK_PMCOLOR_IS_RGBA
            return SkColorSpaceXform::kRGBA_8888_ColorFormat;
#else
            return SkColorSpaceXform::kBGRA_8888_ColorFormat;
#endif
        default:
            SkASSERT(false);
            return SkColorSpaceXform::kRGBA_8888_ColorFormat;
    }
}

#endif
