diff options
Diffstat (limited to 'modules/sksg/src/SkSGGradient.cpp')
-rw-r--r-- | modules/sksg/src/SkSGGradient.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/modules/sksg/src/SkSGGradient.cpp b/modules/sksg/src/SkSGGradient.cpp new file mode 100644 index 0000000000..98e7f395f8 --- /dev/null +++ b/modules/sksg/src/SkSGGradient.cpp @@ -0,0 +1,60 @@ +/* + * 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 |