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

#include "modules/sksg/include/SkSGGradient.h"

#include "include/core/SkPaint.h"
#include "include/effects/SkGradientShader.h"
#include "include/private/SkTPin.h"

namespace sksg {

sk_sp<SkShader> Gradient::onRevalidateShader() {
    if (fColorStops.empty()) {
        return nullptr;
    }

    std::vector<SkColor4f> colors;
    std::vector<SkScalar>  positions;
    colors.reserve(fColorStops.size());
    positions.reserve(fColorStops.size());

    SkScalar position = 0;
    for (const auto& stop : fColorStops) {
        colors.push_back(stop.fColor);
        position = SkTPin(stop.fPosition, position, 1.0f);
        positions.push_back(position);
    }

    // TODO: detect even stop distributions, pass null for positions.
    return this->onMakeShader(colors, positions);
}

sk_sp<SkShader> LinearGradient::onMakeShader(const std::vector<SkColor4f>& colors,
                                             const std::vector<SkScalar >& positions) const {
    SkASSERT(colors.size() == positions.size());

    const SkPoint pts[] = { fStartPoint, fEndPoint };
    return SkGradientShader::MakeLinear(pts, colors.data(), nullptr, positions.data(),
                                        SkToInt(colors.size()), this->getTileMode());
}

sk_sp<SkShader> RadialGradient::onMakeShader(const std::vector<SkColor4f>& colors,
                                             const std::vector<SkScalar >& positions) const {
    SkASSERT(colors.size() == positions.size());

    return (fStartRadius <= 0 && fStartCenter == fEndCenter)
        ? SkGradientShader::MakeRadial(fEndCenter, fEndRadius,
                                       colors.data(), nullptr, positions.data(),
                                       SkToInt(colors.size()), this->getTileMode())
        : SkGradientShader::MakeTwoPointConical(fStartCenter, fStartRadius,
                                                fEndCenter, fEndRadius,
                                                colors.data(), nullptr, positions.data(),
                                                SkToInt(colors.size()), this->getTileMode());
}

} //namespace sksg
