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

#include "include/core/SkString.h"
#include "include/effects/SkHighContrastFilter.h"
#include "include/effects/SkRuntimeEffect.h"
#include "include/private/SkTPin.h"
#include "src/core/SkRuntimeEffectPriv.h"

sk_sp<SkColorFilter> SkHighContrastFilter::Make(const SkHighContrastConfig& config) {
    if (!config.isValid()) {
        return nullptr;
    }

    struct Uniforms { float grayscale, invertStyle, contrast; };

    SkString code{R"(
        uniform half grayscale, invertStyle, contrast;
    )"};
    code += kRGB_to_HSL_sksl;
    code += kHSL_to_RGB_sksl;
    code += R"(
        half4 main(half4 inColor) {
            half4 c = inColor;  // linear unpremul RGBA in dst gamut.
            if (grayscale == 1) {
                c.rgb = dot(half3(0.2126, 0.7152, 0.0722), c.rgb).rrr;
            }
            if (invertStyle == 1/*brightness*/) {
                c.rgb = 1 - c.rgb;
            } else if (invertStyle == 2/*lightness*/) {
                c.rgb = rgb_to_hsl(c.rgb);
                c.b = 1 - c.b;
                c.rgb = hsl_to_rgb(c.rgb);
            }
            c.rgb = mix(half3(0.5), c.rgb, contrast);
            return half4(saturate(c.rgb), c.a);
        }
    )";

    sk_sp<SkRuntimeEffect> effect = SkMakeCachedRuntimeEffect(SkRuntimeEffect::MakeForColorFilter,
                                                              std::move(code));
    SkASSERT(effect);

    // A contrast setting of exactly +1 would divide by zero (1+c)/(1-c), so pull in to +1-ε.
    // I'm not exactly sure why we've historically pinned -1 up to -1+ε, maybe just symmetry?
    float c = SkTPin(config.fContrast,
                     -1.0f + FLT_EPSILON,
                     +1.0f - FLT_EPSILON);

    Uniforms uniforms = {
        config.fGrayscale ? 1.0f : 0.0f,
        (float)config.fInvertStyle,  // 0.0f for none, 1.0f for brightness, 2.0f for lightness
        (1+c)/(1-c),
    };

    skcms_TransferFunction linear = SkNamedTransferFn::kLinear;
    SkAlphaType          unpremul = kUnpremul_SkAlphaType;
    return SkColorFilters::WithWorkingFormat(
            effect->makeColorFilter(SkData::MakeWithCopy(&uniforms,sizeof(uniforms))),
            &linear, nullptr/*use dst gamut*/, &unpremul);
}

