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

#ifdef SK_SUPPORT_GPU

#include "include/core/SkColorFilter.h"
#include "include/core/SkString.h"

using SkRuntimeColorFilterFn = void(*)(float[4], const void*);

class SK_API SkRuntimeColorFilterFactory {
public:
    /**
     * Creates a factory which creates runtime color filters. The SkSL must define a 'main' function
     * with the signature 'void main(inout half4 color)'. The SkSL will be used when rendering in
     * GPU mode, with the 'color' parameter providing the current value on input and receiving the
     * new color value on exit. In software mode, the cpuFunc will be called with the current color
     * and a pointer to the 'inputs' bytes. cpuFunc may be left null, in which case only GPU
     * rendering is supported.
     */
    SkRuntimeColorFilterFactory(SkString sksl, SkRuntimeColorFilterFn cpuFunc = nullptr);

    /**
     * Creates a color filter instance with the specified inputs. In GPU rendering, the inputs are
     * used to populate the values of 'in' variables. For instance, given the color filter:
     *    in uniform float x;
     *    in uniform float y;
     *    void main(inout half4 color) {
     *        ...
     *    }
     * The values of the x and y inputs come from the 'inputs' SkData, which are laid out as a
     * struct with two float elements. If there are no inputs, the 'inputs' parameter may be null.
     *
     * In CPU rendering, a pointer to the input bytes is passed as the second parameter to
     * 'cpuFunc'.
     */
    sk_sp<SkColorFilter> make(sk_sp<SkData> inputs);

private:
    int fIndex;
    SkString fSkSL;
    SkRuntimeColorFilterFn fCpuFunc;
};

#endif // SK_SUPPORT_GPU

#endif  // SkColorFilterPriv_DEFINED
