• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 "SkCanvas.h"
9 #include "SkSVGLine.h"
10 #include "SkSVGRenderContext.h"
11 #include "SkSVGValue.h"
12 
SkSVGLine()13 SkSVGLine::SkSVGLine() : INHERITED(SkSVGTag::kLine) {}
14 
setX1(const SkSVGLength & x1)15 void SkSVGLine::setX1(const SkSVGLength& x1) {
16     fX1 = x1;
17 }
18 
setY1(const SkSVGLength & y1)19 void SkSVGLine::setY1(const SkSVGLength& y1) {
20     fY1 = y1;
21 }
22 
setX2(const SkSVGLength & x2)23 void SkSVGLine::setX2(const SkSVGLength& x2) {
24     fX2 = x2;
25 }
26 
setY2(const SkSVGLength & y2)27 void SkSVGLine::setY2(const SkSVGLength& y2) {
28     fY2 = y2;
29 }
30 
onSetAttribute(SkSVGAttribute attr,const SkSVGValue & v)31 void SkSVGLine::onSetAttribute(SkSVGAttribute attr, const SkSVGValue& v) {
32     switch (attr) {
33     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 
resolve(const SkSVGLengthContext & lctx) const58 std::tuple<SkPoint, SkPoint> SkSVGLine::resolve(const SkSVGLengthContext& lctx) const {
59     return std::make_tuple(
60         SkPoint::Make(lctx.resolve(fX1, SkSVGLengthContext::LengthType::kHorizontal),
61                       lctx.resolve(fY1, SkSVGLengthContext::LengthType::kVertical)),
62         SkPoint::Make(lctx.resolve(fX2, SkSVGLengthContext::LengthType::kHorizontal),
63                       lctx.resolve(fY2, SkSVGLengthContext::LengthType::kVertical)));
64 }
65 
onDraw(SkCanvas * canvas,const SkSVGLengthContext & lctx,const SkPaint & paint,SkPath::FillType) const66 void SkSVGLine::onDraw(SkCanvas* canvas, const SkSVGLengthContext& lctx,
67                        const SkPaint& paint, SkPath::FillType) const {
68     SkPoint p0, p1;
69     std::tie(p0, p1) = this->resolve(lctx);
70 
71     canvas->drawLine(p0, p1, paint);
72 }
73 
onAsPath(const SkSVGRenderContext & ctx) const74 SkPath SkSVGLine::onAsPath(const SkSVGRenderContext& ctx) const {
75     SkPoint p0, p1;
76     std::tie(p0, p1) = this->resolve(ctx.lengthContext());
77 
78     SkPath path;
79     path.moveTo(p0);
80     path.lineTo(p1);
81     this->mapToParent(&path);
82 
83     return path;
84 }
85