diff options
author | fmalita <fmalita@chromium.org> | 2016-09-13 12:56:11 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-09-13 12:56:11 -0700 |
commit | cecd617a4297ffdcec632ca7e2ed1e6b61665e04 (patch) | |
tree | 48e32288114528e7085bf6aa0190653e7ad0bf99 /experimental/svg/model/SkSVGLinearGradient.cpp | |
parent | 649985a530c39afcda23d1f188fa2fc92df3ac56 (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.cpp | 20 |
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; } |