/*
 * 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 GrSRGBEffect_DEFINED
#define GrSRGBEffect_DEFINED

#include "GrFragmentProcessor.h"

class GrSRGBEffect : public GrFragmentProcessor {
public:
    enum class Mode {
        kLinearToSRGB,
        kSRGBToLinear,
    };

    enum class Alpha {
        kPremul,
        kOpaque,
    };

    /**
     * Creates an effect that applies the sRGB transfer function (or its inverse)
     */
    static std::unique_ptr<GrFragmentProcessor> Make(Mode mode, Alpha alpha) {
        return std::unique_ptr<GrFragmentProcessor>(new GrSRGBEffect(mode, alpha));
    }

    const char* name() const override { return "sRGB"; }

    Mode mode() const { return fMode; }
    Alpha alpha() const { return fAlpha; }

    std::unique_ptr<GrFragmentProcessor> clone() const override;

private:
    GrSRGBEffect(Mode mode, Alpha);

    GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
    void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
    bool onIsEqual(const GrFragmentProcessor&) const override;

    SkPMColor4f constantOutputForConstantInput(const SkPMColor4f& input) const override;

    Mode fMode;
    Alpha fAlpha;

    GR_DECLARE_FRAGMENT_PROCESSOR_TEST

    typedef GrFragmentProcessor INHERITED;
};

#endif
