aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental
diff options
context:
space:
mode:
authorGravatar fmalita <fmalita@chromium.org>2016-08-17 08:38:15 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-08-17 08:38:15 -0700
commitd24ee1419f17fe3ac70373ca74136a766522e399 (patch)
treeb70f2c4ad0c3afc0fd77e2df46506db2c4710782 /experimental
parent4c56b9fa714d1bee54666adf7e5e1db5fb398dc7 (diff)
[SVGDom] Add <line> support
R=robertphillips@google.com,stephana@google.com GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2244223005 Review-Url: https://codereview.chromium.org/2244223005
Diffstat (limited to 'experimental')
-rw-r--r--experimental/svg/model/SkSVGAttribute.h4
-rw-r--r--experimental/svg/model/SkSVGDOM.cpp6
-rw-r--r--experimental/svg/model/SkSVGLine.cpp66
-rw-r--r--experimental/svg/model/SkSVGLine.h40
-rw-r--r--experimental/svg/model/SkSVGNode.h1
5 files changed, 117 insertions, 0 deletions
diff --git a/experimental/svg/model/SkSVGAttribute.h b/experimental/svg/model/SkSVGAttribute.h
index c94a239712..196575de0b 100644
--- a/experimental/svg/model/SkSVGAttribute.h
+++ b/experimental/svg/model/SkSVGAttribute.h
@@ -34,7 +34,11 @@ enum class SkSVGAttribute {
kViewBox,
kWidth,
kX,
+ kX1, // <line>: first endpoint x
+ kX2, // <line>: second endpoint x
kY,
+ kY1, // <line>: first endpoint y
+ kY2, // <line>: second endpoint y
kUnknown,
};
diff --git a/experimental/svg/model/SkSVGDOM.cpp b/experimental/svg/model/SkSVGDOM.cpp
index ef1bb0d0ae..c123bc6bfb 100644
--- a/experimental/svg/model/SkSVGDOM.cpp
+++ b/experimental/svg/model/SkSVGDOM.cpp
@@ -14,6 +14,7 @@
#include "SkSVGDOM.h"
#include "SkSVGEllipse.h"
#include "SkSVGG.h"
+#include "SkSVGLine.h"
#include "SkSVGNode.h"
#include "SkSVGPath.h"
#include "SkSVGPoly.h"
@@ -236,13 +237,18 @@ SortedDictionaryEntry<AttrParseInfo> gAttributeParseInfo[] = {
{ "viewBox" , { SkSVGAttribute::kViewBox , SetViewBoxAttribute }},
{ "width" , { SkSVGAttribute::kWidth , SetLengthAttribute }},
{ "x" , { SkSVGAttribute::kX , SetLengthAttribute }},
+ { "x1" , { SkSVGAttribute::kX1 , SetLengthAttribute }},
+ { "x2" , { SkSVGAttribute::kX2 , SetLengthAttribute }},
{ "y" , { SkSVGAttribute::kY , SetLengthAttribute }},
+ { "y1" , { SkSVGAttribute::kY1 , SetLengthAttribute }},
+ { "y2" , { SkSVGAttribute::kY2 , SetLengthAttribute }},
};
SortedDictionaryEntry<sk_sp<SkSVGNode>(*)()> gTagFactories[] = {
{ "circle" , []() -> sk_sp<SkSVGNode> { return SkSVGCircle::Make(); }},
{ "ellipse" , []() -> sk_sp<SkSVGNode> { return SkSVGEllipse::Make(); }},
{ "g" , []() -> sk_sp<SkSVGNode> { return SkSVGG::Make(); }},
+ { "line" , []() -> sk_sp<SkSVGNode> { return SkSVGLine::Make(); }},
{ "path" , []() -> sk_sp<SkSVGNode> { return SkSVGPath::Make(); }},
{ "polygon" , []() -> sk_sp<SkSVGNode> { return SkSVGPoly::MakePolygon(); }},
{ "polyline", []() -> sk_sp<SkSVGNode> { return SkSVGPoly::MakePolyline(); }},
diff --git a/experimental/svg/model/SkSVGLine.cpp b/experimental/svg/model/SkSVGLine.cpp
new file mode 100644
index 0000000000..030aad8db4
--- /dev/null
+++ b/experimental/svg/model/SkSVGLine.cpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkCanvas.h"
+#include "SkSVGLine.h"
+#include "SkSVGRenderContext.h"
+#include "SkSVGValue.h"
+
+SkSVGLine::SkSVGLine() : INHERITED(SkSVGTag::kLine) {}
+
+void SkSVGLine::setX1(const SkSVGLength& x1) {
+ fX1 = x1;
+}
+
+void SkSVGLine::setY1(const SkSVGLength& y1) {
+ fY1 = y1;
+}
+
+void SkSVGLine::setX2(const SkSVGLength& x2) {
+ fX2 = x2;
+}
+
+void SkSVGLine::setY2(const SkSVGLength& y2) {
+ fY2 = y2;
+}
+
+void SkSVGLine::onSetAttribute(SkSVGAttribute attr, const SkSVGValue& v) {
+ switch (attr) {
+ case SkSVGAttribute::kX1:
+ if (const auto* x1 = v.as<SkSVGLengthValue>()) {
+ this->setX1(*x1);
+ }
+ break;
+ case SkSVGAttribute::kY1:
+ if (const auto* y1 = v.as<SkSVGLengthValue>()) {
+ this->setY1(*y1);
+ }
+ break;
+ case SkSVGAttribute::kX2:
+ if (const auto* x2 = v.as<SkSVGLengthValue>()) {
+ this->setX2(*x2);
+ }
+ break;
+ case SkSVGAttribute::kY2:
+ if (const auto* y2 = v.as<SkSVGLengthValue>()) {
+ this->setY2(*y2);
+ }
+ break;
+ default:
+ this->INHERITED::onSetAttribute(attr, v);
+ }
+}
+
+void SkSVGLine::onDraw(SkCanvas* canvas, const SkSVGLengthContext& lctx,
+ const SkPaint& paint) const {
+ const auto x1 = lctx.resolve(fX1, SkSVGLengthContext::LengthType::kHorizontal);
+ const auto y1 = lctx.resolve(fY1, SkSVGLengthContext::LengthType::kVertical);
+ const auto x2 = lctx.resolve(fX2, SkSVGLengthContext::LengthType::kHorizontal);
+ const auto y2 = lctx.resolve(fY2, SkSVGLengthContext::LengthType::kVertical);
+
+ canvas->drawLine(x1, y1, x2, y2, paint);
+}
diff --git a/experimental/svg/model/SkSVGLine.h b/experimental/svg/model/SkSVGLine.h
new file mode 100644
index 0000000000..c2716e00e2
--- /dev/null
+++ b/experimental/svg/model/SkSVGLine.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkSVGLine_DEFINED
+#define SkSVGLine_DEFINED
+
+#include "SkSVGShape.h"
+#include "SkSVGTypes.h"
+
+class SkSVGLine final : public SkSVGShape {
+public:
+ virtual ~SkSVGLine() = default;
+ static sk_sp<SkSVGLine> Make() { return sk_sp<SkSVGLine>(new SkSVGLine()); }
+
+ void setX1(const SkSVGLength&);
+ void setY1(const SkSVGLength&);
+ void setX2(const SkSVGLength&);
+ void setY2(const SkSVGLength&);
+
+protected:
+ void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
+
+ void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&) const override;
+
+private:
+ SkSVGLine();
+
+ SkSVGLength fX1 = SkSVGLength(0);
+ SkSVGLength fY1 = SkSVGLength(0);
+ SkSVGLength fX2 = SkSVGLength(0);
+ SkSVGLength fY2 = SkSVGLength(0);
+
+ typedef SkSVGShape INHERITED;
+};
+
+#endif // SkSVGLine_DEFINED
diff --git a/experimental/svg/model/SkSVGNode.h b/experimental/svg/model/SkSVGNode.h
index 01ecdbe985..c02fd3a214 100644
--- a/experimental/svg/model/SkSVGNode.h
+++ b/experimental/svg/model/SkSVGNode.h
@@ -20,6 +20,7 @@ enum class SkSVGTag {
kCircle,
kEllipse,
kG,
+ kLine,
kPath,
kPolygon,
kPolyline,