| /* |
| * 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 "SkSGGradient.h" |
| |
| #include "SkGradientShader.h" |
| #include "SkPaint.h" |
| |
| namespace sksg { |
| |
| void Gradient::onApplyToPaint(SkPaint* paint) const { |
| if (fColorStops.empty()) { |
| paint->setShader(nullptr); |
| return; |
| } |
| |
| std::vector<SkColor> 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. |
| paint->setShader(this->onMakeShader(colors, positions)); |
| } |
| |
| sk_sp<SkShader> LinearGradient::onMakeShader(const std::vector<SkColor>& colors, |
| const std::vector<SkScalar>& positions) const { |
| SkASSERT(colors.size() == positions.size()); |
| |
| const SkPoint pts[] = { fStartPoint, fEndPoint }; |
| return SkGradientShader::MakeLinear(pts, colors.data(), positions.data(), colors.size(), |
| this->getTileMode()); |
| } |
| |
| sk_sp<SkShader> RadialGradient::onMakeShader(const std::vector<SkColor>& colors, |
| const std::vector<SkScalar>& positions) const { |
| SkASSERT(colors.size() == positions.size()); |
| |
| return (fStartRadius <= 0 && fStartCenter == fEndCenter) |
| ? SkGradientShader::MakeRadial(fEndCenter, fEndRadius, |
| colors.data(), positions.data(), colors.size(), |
| this->getTileMode()) |
| : SkGradientShader::MakeTwoPointConical(fStartCenter, fStartRadius, |
| fEndCenter, fEndRadius, |
| colors.data(), positions.data(), colors.size(), |
| this->getTileMode()); |
| } |
| |
| } //namespace sksg |