[skotty] Add ellipse support

TBR=
Change-Id: I48bbc6aabaab1c3ab5cc9fb19c87ad1f5606eb54
Reviewed-on: https://skia-review.googlesource.com/90900
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Florin Malita <fmalita@chromium.org>
diff --git a/experimental/skotty/Skotty.cpp b/experimental/skotty/Skotty.cpp
index 47ff828..093d7f6 100644
--- a/experimental/skotty/Skotty.cpp
+++ b/experimental/skotty/Skotty.cpp
@@ -158,12 +158,39 @@
     auto s_attached = AttachProperty<VectorValue, SkSize>(jrect["s"], ctx, composite,
             [](const sk_sp<CompositeRRect>& node, const SkSize& sz) { node->setSize(sz); });
     auto r_attached = AttachProperty<ScalarValue, SkScalar>(jrect["r"], ctx, composite,
-            [](const sk_sp<CompositeRRect>& node, SkScalar radius) { node->setRadius(radius); });
+            [](const sk_sp<CompositeRRect>& node, SkScalar radius) {
+                node->setRadius(SkSize::Make(radius, radius));
+            });
 
     if (!p_attached && !s_attached && !r_attached) {
         return nullptr;
     }
 
+    LOG("** Attached (r)rect geometry\n");
+
+    return rect_node;
+}
+
+sk_sp<sksg::GeometryNode> AttachEllipseGeometry(const Json::Value& jellipse, AttachContext* ctx) {
+    SkASSERT(jellipse.isObject());
+
+    auto rect_node = sksg::RRect::Make();
+    auto composite = sk_make_sp<CompositeRRect>(rect_node);
+
+    auto p_attached = AttachProperty<VectorValue, SkPoint>(jellipse["p"], ctx, composite,
+            [](const sk_sp<CompositeRRect>& node, const SkPoint& pos) { node->setPosition(pos); });
+    auto s_attached = AttachProperty<VectorValue, SkSize>(jellipse["s"], ctx, composite,
+            [](const sk_sp<CompositeRRect>& node, const SkSize& sz) {
+                node->setSize(sz);
+                node->setRadius(SkSize::Make(sz.width() / 2, sz.height() / 2));
+            });
+
+    if (!p_attached && !s_attached) {
+        return nullptr;
+    }
+
+    LOG("** Attached ellipse geometry\n");
+
     return rect_node;
 }
 
@@ -250,6 +277,7 @@
 static constexpr GeometryAttacherT gGeometryAttachers[] = {
     AttachPathGeometry,
     AttachRRectGeometry,
+    AttachEllipseGeometry,
 };
 
 using PaintAttacherT = sk_sp<sksg::PaintNode> (*)(const Json::Value&, AttachContext*);
@@ -293,6 +321,7 @@
 
 const ShapeInfo* FindShapeInfo(const Json::Value& shape) {
     static constexpr ShapeInfo gShapeInfo[] = {
+        { "el", ShapeType::kGeometry      , 2 }, // ellipse   -> AttachEllipseGeometry
         { "fl", ShapeType::kPaint         , 0 }, // fill      -> AttachFillPaint
         { "gr", ShapeType::kGroup         , 0 }, // group     -> AttachShapeGroup
         { "mm", ShapeType::kGeometryEffect, 0 }, // merge     -> AttachMergeGeometryEffect
diff --git a/experimental/skotty/SkottyProperties.cpp b/experimental/skotty/SkottyProperties.cpp
index 5d94d73..241b659 100644
--- a/experimental/skotty/SkottyProperties.cpp
+++ b/experimental/skotty/SkottyProperties.cpp
@@ -166,8 +166,8 @@
     auto rr = SkRRect::MakeRectXY(SkRect::MakeXYWH(fPosition.x() - fSize.width() / 2,
                                                    fPosition.y() - fSize.height() / 2,
                                                    fSize.width(), fSize.height()),
-                                  fRadius,
-                                  fRadius);
+                                  fRadius.width(),
+                                  fRadius.height());
    fRRectNode->setRRect(rr);
 }
 
diff --git a/experimental/skotty/SkottyProperties.h b/experimental/skotty/SkottyProperties.h
index 990862f..6147dd4 100644
--- a/experimental/skotty/SkottyProperties.h
+++ b/experimental/skotty/SkottyProperties.h
@@ -101,7 +101,7 @@
 
     COMPOSITE_PROPERTY(Position, SkPoint , SkPoint::Make(0, 0))
     COMPOSITE_PROPERTY(Size    , SkSize  , SkSize::Make(0, 0))
-    COMPOSITE_PROPERTY(Radius  , SkScalar, 0)
+    COMPOSITE_PROPERTY(Radius  , SkSize  , SkSize::Make(0, 0))
 
 private:
     void apply();