[SVGDom] Add <line> support
authorfmalita <fmalita@chromium.org>
Wed, 17 Aug 2016 15:38:15 +0000 (08:38 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 17 Aug 2016 15:38:15 +0000 (08:38 -0700)
R=robertphillips@google.com,stephana@google.com
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2244223005

Review-Url: https://codereview.chromium.org/2244223005

BUILD.gn
experimental/svg/model/SkSVGAttribute.h
experimental/svg/model/SkSVGDOM.cpp
experimental/svg/model/SkSVGLine.cpp [new file with mode: 0644]
experimental/svg/model/SkSVGLine.h [new file with mode: 0644]
experimental/svg/model/SkSVGNode.h
gyp/svg.gyp

index 1f43ca1..b18cdd4 100644 (file)
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -534,6 +534,7 @@ test_lib("experimental_svg_model") {
     "experimental/svg/model/SkSVGCircle.cpp",
     "experimental/svg/model/SkSVGDOM.cpp",
     "experimental/svg/model/SkSVGEllipse.cpp",
+    "experimental/svg/model/SkSVGLine.cpp",
     "experimental/svg/model/SkSVGNode.cpp",
     "experimental/svg/model/SkSVGPath.cpp",
     "experimental/svg/model/SkSVGPoly.cpp",
index c94a239..196575d 100644 (file)
@@ -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,
 };
index ef1bb0d..c123bc6 100644 (file)
@@ -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 (file)
index 0000000..030aad8
--- /dev/null
@@ -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 (file)
index 0000000..c2716e0
--- /dev/null
@@ -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
index 01ecdbe..c02fd3a 100644 (file)
@@ -20,6 +20,7 @@ enum class SkSVGTag {
     kCircle,
     kEllipse,
     kG,
+    kLine,
     kPath,
     kPolygon,
     kPolyline,
index 0006903..158a399 100644 (file)
@@ -57,6 +57,8 @@
         '../experimental/svg/model/SkSVGEllipse.h',
         '../experimental/svg/model/SkSVGEllipse.cpp',
         '../experimental/svg/model/SkSVGG.h',
+        '../experimental/svg/model/SkSVGLine.h',
+        '../experimental/svg/model/SkSVGLine.cpp',
         '../experimental/svg/model/SkSVGNode.h',
         '../experimental/svg/model/SkSVGNode.cpp',
         '../experimental/svg/model/SkSVGPath.h',