aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/svg/model/SkSVGLinearGradient.cpp
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2017-10-09 15:14:13 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-10-09 19:36:44 +0000
commitdf007e1a7ae808ad41eb2bd01f6a658c5b438285 (patch)
tree708f8fba7bc23a2e4b8740ade111f4607bead8c1 /experimental/svg/model/SkSVGLinearGradient.cpp
parent7fc1d12e67d381a401555d5a7a1fa6af1eb8d7d6 (diff)
[SVGDom] Factor out common gradient logic
In preparation of radial gradient support, move common logic into an abstract base class (SkSVGGradient). Change-Id: Ie5361048ca8fddd9070c573c8daef0d0f57dc95e Reviewed-on: https://skia-review.googlesource.com/57108 Commit-Queue: Florin Malita <fmalita@chromium.org> Reviewed-by: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'experimental/svg/model/SkSVGLinearGradient.cpp')
-rw-r--r--experimental/svg/model/SkSVGLinearGradient.cpp83
1 files changed, 5 insertions, 78 deletions
diff --git a/experimental/svg/model/SkSVGLinearGradient.cpp b/experimental/svg/model/SkSVGLinearGradient.cpp
index 4bbed1c354..14939d1371 100644
--- a/experimental/svg/model/SkSVGLinearGradient.cpp
+++ b/experimental/svg/model/SkSVGLinearGradient.cpp
@@ -8,23 +8,10 @@
#include "SkGradientShader.h"
#include "SkSVGLinearGradient.h"
#include "SkSVGRenderContext.h"
-#include "SkSVGStop.h"
#include "SkSVGValue.h"
SkSVGLinearGradient::SkSVGLinearGradient() : INHERITED(SkSVGTag::kLinearGradient) {}
-void SkSVGLinearGradient::setHref(const SkSVGStringType& href) {
- fHref = std::move(href);
-}
-
-void SkSVGLinearGradient::setGradientTransform(const SkSVGTransformType& t) {
- fGradientTransform = t;
-}
-
-void SkSVGLinearGradient::setSpreadMethod(const SkSVGSpreadMethod& spread) {
- fSpreadMethod = spread;
-}
-
void SkSVGLinearGradient::setX1(const SkSVGLength& x1) {
fX1 = x1;
}
@@ -43,21 +30,6 @@ void SkSVGLinearGradient::setY2(const SkSVGLength& y2) {
void SkSVGLinearGradient::onSetAttribute(SkSVGAttribute attr, const SkSVGValue& v) {
switch (attr) {
- case SkSVGAttribute::kGradientTransform:
- if (const auto* t = v.as<SkSVGTransformValue>()) {
- this->setGradientTransform(*t);
- }
- break;
- case SkSVGAttribute::kHref:
- if (const auto* href = v.as<SkSVGStringValue>()) {
- 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);
@@ -83,36 +55,10 @@ void SkSVGLinearGradient::onSetAttribute(SkSVGAttribute attr, const SkSVGValue&
}
}
-// https://www.w3.org/TR/SVG/pservers.html#LinearGradientElementHrefAttribute
-void SkSVGLinearGradient::collectColorStops(const SkSVGRenderContext& ctx,
- SkSTArray<2, SkScalar, true>* pos,
- SkSTArray<2, SkColor, true>* colors) const {
- // Used to resolve percentage offsets.
- const SkSVGLengthContext ltx(SkSize::Make(1, 1));
-
- for (const auto& child : fChildren) {
- if (child->tag() != SkSVGTag::kStop) {
- continue;
- }
-
- const auto& stop = static_cast<const SkSVGStop&>(*child);
- colors->push_back(SkColorSetA(stop.stopColor(),
- SkScalarRoundToInt(stop.stopOpacity() * 255)));
- pos->push_back(SkTPin(ltx.resolve(stop.offset(), SkSVGLengthContext::LengthType::kOther),
- 0.f, 1.f));
- }
-
- SkASSERT(colors->count() == pos->count());
-
- if (pos->empty() && !fHref.value().isEmpty()) {
- const auto* ref = ctx.findNodeById(fHref);
- if (ref && ref->tag() == SkSVGTag::kLinearGradient) {
- static_cast<const SkSVGLinearGradient*>(ref)->collectColorStops(ctx, pos, colors);
- }
- }
-}
-
-bool SkSVGLinearGradient::onAsPaint(const SkSVGRenderContext& ctx, SkPaint* paint) const {
+sk_sp<SkShader> SkSVGLinearGradient::onMakeShader(const SkSVGRenderContext& ctx,
+ const SkColor* colors, const SkScalar* pos,
+ int count, SkShader::TileMode tm,
+ const SkMatrix& localMatrix) const {
const auto& lctx = ctx.lengthContext();
const auto x1 = lctx.resolve(fX1, SkSVGLengthContext::LengthType::kHorizontal);
const auto y1 = lctx.resolve(fY1, SkSVGLengthContext::LengthType::kVertical);
@@ -120,25 +66,6 @@ bool SkSVGLinearGradient::onAsPaint(const SkSVGRenderContext& ctx, SkPaint* pain
const auto y2 = lctx.resolve(fY2, SkSVGLengthContext::LengthType::kVertical);
const SkPoint pts[2] = { {x1, y1}, {x2, y2}};
- SkSTArray<2, SkColor , true> colors;
- SkSTArray<2, SkScalar, true> pos;
-
- this->collectColorStops(ctx, &pos, &colors);
- // TODO:
- // * stop (lazy?) sorting
- // * href loop detection
- // * href attribute inheritance (not just color stops)
- // * 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(),
- tileMode, 0, &fGradientTransform.value()));
- return true;
+ return SkGradientShader::MakeLinear(pts, colors, pos, count, tm, 0, &localMatrix);
}