/*
 * 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 "include/effects/SkOverdrawColorFilter.h"

#include "include/core/SkColorFilter.h"

#ifdef SK_ENABLE_SKSL
#include "include/core/SkAlphaType.h"
#include "include/core/SkData.h"
#include "include/effects/SkRuntimeEffect.h"
#include "include/private/SkColorData.h"
#include "src/core/SkRuntimeEffectPriv.h"

#include <utility>

sk_sp<SkColorFilter> SkOverdrawColorFilter::MakeWithSkColors(const SkColor colors[kNumColors]) {
    static const SkRuntimeEffect* effect = SkMakeCachedRuntimeEffect(
        SkRuntimeEffect::MakeForColorFilter,
        "uniform half4 color0;"
        "uniform half4 color1;"
        "uniform half4 color2;"
        "uniform half4 color3;"
        "uniform half4 color4;"
        "uniform half4 color5;"

        "half4 main(half4 color) {"
            "half alpha = 255.0 * color.a;"
            "color = alpha < 0.5 ? color0"
                  ": alpha < 1.5 ? color1"
                  ": alpha < 2.5 ? color2"
                  ": alpha < 3.5 ? color3"
                  ": alpha < 4.5 ? color4 : color5;"
            "return color;"
        "}"
    ).release();

    if (effect) {
        auto data = SkData::MakeUninitialized(kNumColors * sizeof(SkPMColor4f));
        SkPMColor4f* premul = (SkPMColor4f*)data->writable_data();
        for (int i = 0; i < kNumColors; ++i) {
            premul[i] = SkColor4f::FromColor(colors[i]).premul();
        }
        return effect->makeColorFilter(std::move(data));
    }
    return nullptr;
}
#else // SK_ENABLE_SKSL
sk_sp<SkColorFilter> SkOverdrawColorFilter::MakeWithSkColors(const SkColor colors[kNumColors]) {
    // TODO(skia:12197)
    return nullptr;
}
#endif
