aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/svg/model/SkSVGLinearGradient.cpp
diff options
context:
space:
mode:
authorGravatar fmalita <fmalita@chromium.org>2016-09-13 12:56:11 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-09-13 12:56:11 -0700
commitcecd617a4297ffdcec632ca7e2ed1e6b61665e04 (patch)
tree48e32288114528e7085bf6aa0190653e7ad0bf99 /experimental/svg/model/SkSVGLinearGradient.cpp
parent649985a530c39afcda23d1f188fa2fc92df3ac56 (diff)
[SVGDom] Linear gradient 'spreadMethod' support
R=stephana@google.com,robertphillips@google.com GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2337203002 Review-Url: https://codereview.chromium.org/2337203002
Diffstat (limited to 'experimental/svg/model/SkSVGLinearGradient.cpp')
-rw-r--r--experimental/svg/model/SkSVGLinearGradient.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/experimental/svg/model/SkSVGLinearGradient.cpp b/experimental/svg/model/SkSVGLinearGradient.cpp
index 20c27f540c..289c5e3276 100644
--- a/experimental/svg/model/SkSVGLinearGradient.cpp
+++ b/experimental/svg/model/SkSVGLinearGradient.cpp
@@ -17,6 +17,10 @@ void SkSVGLinearGradient::setHref(const SkSVGStringType& href) {
fHref = std::move(href);
}
+void SkSVGLinearGradient::setSpreadMethod(const SkSVGSpreadMethod& spread) {
+ fSpreadMethod = spread;
+}
+
void SkSVGLinearGradient::setX1(const SkSVGLength& x1) {
fX1 = x1;
}
@@ -40,6 +44,11 @@ void SkSVGLinearGradient::onSetAttribute(SkSVGAttribute attr, const SkSVGValue&
this->setHref(*href);
}
break;
+ case SkSVGAttribute::kSpreadMethod:
+ if (const auto* spread = v.as<SkSVGSpreadMethodValue>()) {
+ this->setSpreadMethod(*spread);
+ }
+ break;
case SkSVGAttribute::kX1:
if (const auto* x1 = v.as<SkSVGLengthValue>()) {
this->setX1(*x1);
@@ -110,10 +119,17 @@ bool SkSVGLinearGradient::onAsPaint(const SkSVGRenderContext& ctx, SkPaint* pain
// * stop (lazy?) sorting
// * href loop detection
// * href attribute inheritance (not just color stops)
- // * spreadMethods support
// * objectBoundingBox units support
+ static_assert(static_cast<SkShader::TileMode>(SkSVGSpreadMethod::Type::kPad) ==
+ SkShader::kClamp_TileMode, "SkSVGSpreadMethod::Type is out of sync");
+ static_assert(static_cast<SkShader::TileMode>(SkSVGSpreadMethod::Type::kRepeat) ==
+ SkShader::kRepeat_TileMode, "SkSVGSpreadMethod::Type is out of sync");
+ static_assert(static_cast<SkShader::TileMode>(SkSVGSpreadMethod::Type::kReflect) ==
+ SkShader::kMirror_TileMode, "SkSVGSpreadMethod::Type is out of sync");
+ const auto tileMode = static_cast<SkShader::TileMode>(fSpreadMethod.type());
+
paint->setShader(SkGradientShader::MakeLinear(pts, colors.begin(), pos.begin(), colors.count(),
- SkShader::kClamp_TileMode));
+ tileMode));
return true;
}