blob: 14939d1371992ee9cba897219091990825e02ce7 [file] [log] [blame]
fmalita28d5b722016-09-12 17:06:47 -07001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkGradientShader.h"
9#include "SkSVGLinearGradient.h"
10#include "SkSVGRenderContext.h"
fmalita28d5b722016-09-12 17:06:47 -070011#include "SkSVGValue.h"
12
13SkSVGLinearGradient::SkSVGLinearGradient() : INHERITED(SkSVGTag::kLinearGradient) {}
14
fmalita28d5b722016-09-12 17:06:47 -070015void SkSVGLinearGradient::setX1(const SkSVGLength& x1) {
16 fX1 = x1;
17}
18
19void SkSVGLinearGradient::setY1(const SkSVGLength& y1) {
20 fY1 = y1;
21}
22
23void SkSVGLinearGradient::setX2(const SkSVGLength& x2) {
24 fX2 = x2;
25}
26
27void SkSVGLinearGradient::setY2(const SkSVGLength& y2) {
28 fY2 = y2;
29}
30
31void SkSVGLinearGradient::onSetAttribute(SkSVGAttribute attr, const SkSVGValue& v) {
32 switch (attr) {
fmalita28d5b722016-09-12 17:06:47 -070033 case SkSVGAttribute::kX1:
34 if (const auto* x1 = v.as<SkSVGLengthValue>()) {
35 this->setX1(*x1);
36 }
37 break;
38 case SkSVGAttribute::kY1:
39 if (const auto* y1 = v.as<SkSVGLengthValue>()) {
40 this->setY1(*y1);
41 }
42 break;
43 case SkSVGAttribute::kX2:
44 if (const auto* x2 = v.as<SkSVGLengthValue>()) {
45 this->setX2(*x2);
46 }
47 break;
48 case SkSVGAttribute::kY2:
49 if (const auto* y2 = v.as<SkSVGLengthValue>()) {
50 this->setY2(*y2);
51 }
52 break;
53 default:
54 this->INHERITED::onSetAttribute(attr, v);
55 }
56}
57
Florin Malitadf007e12017-10-09 15:14:13 -040058sk_sp<SkShader> SkSVGLinearGradient::onMakeShader(const SkSVGRenderContext& ctx,
59 const SkColor* colors, const SkScalar* pos,
60 int count, SkShader::TileMode tm,
61 const SkMatrix& localMatrix) const {
fmalita28d5b722016-09-12 17:06:47 -070062 const auto& lctx = ctx.lengthContext();
63 const auto x1 = lctx.resolve(fX1, SkSVGLengthContext::LengthType::kHorizontal);
64 const auto y1 = lctx.resolve(fY1, SkSVGLengthContext::LengthType::kVertical);
65 const auto x2 = lctx.resolve(fX2, SkSVGLengthContext::LengthType::kHorizontal);
66 const auto y2 = lctx.resolve(fY2, SkSVGLengthContext::LengthType::kVertical);
67
68 const SkPoint pts[2] = { {x1, y1}, {x2, y2}};
fmalita28d5b722016-09-12 17:06:47 -070069
Florin Malitadf007e12017-10-09 15:14:13 -040070 return SkGradientShader::MakeLinear(pts, colors, pos, count, tm, 0, &localMatrix);
fmalita28d5b722016-09-12 17:06:47 -070071}