Added setNodeAttribute to SkSVGDom

Change-Id: Ib96c185aab9167116d20ca8d91a1703683cbf7dc
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/288620
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Florin Malita <fmalita@chromium.org>
diff --git a/experimental/svg/model/SkSVGDOM.cpp b/experimental/svg/model/SkSVGDOM.cpp
index fdd78ac..f29e655 100644
--- a/experimental/svg/model/SkSVGDOM.cpp
+++ b/experimental/svg/model/SkSVGDOM.cpp
@@ -296,7 +296,7 @@
     const char* fPos;
 };
 
-void set_string_attribute(const sk_sp<SkSVGNode>& node, const char* name, const char* value);
+bool set_string_attribute(const sk_sp<SkSVGNode>& node, const char* name, const char* value);
 
 bool SetStyleAttributes(const sk_sp<SkSVGNode>& node, SkSVGAttribute,
                         const char* stringValue) {
@@ -408,7 +408,7 @@
     SkSVGIDMapper*   fIDMapper;
 };
 
-void set_string_attribute(const sk_sp<SkSVGNode>& node, const char* name, const char* value) {
+bool set_string_attribute(const sk_sp<SkSVGNode>& node, const char* name, const char* value) {
     const int attrIndex = SkStrSearch(&gAttributeParseInfo[0].fKey,
                                       SkTo<int>(SK_ARRAY_COUNT(gAttributeParseInfo)),
                                       name, sizeof(gAttributeParseInfo[0]));
@@ -416,7 +416,7 @@
 #if defined(SK_VERBOSE_SVG_PARSING)
         SkDebugf("unhandled attribute: %s\n", name);
 #endif
-        return;
+        return false;
     }
 
     SkASSERT(SkTo<size_t>(attrIndex) < SK_ARRAY_COUNT(gAttributeParseInfo));
@@ -425,7 +425,10 @@
 #if defined(SK_VERBOSE_SVG_PARSING)
         SkDebugf("could not parse attribute: '%s=\"%s\"'\n", name, value);
 #endif
+        return false;
     }
+
+    return true;
 }
 
 void parse_node_attributes(const SkDOM& xmlDom, const SkDOM::Node* xmlNode,
@@ -535,6 +538,16 @@
     fContainerSize = containerSize;
 }
 
+sk_sp<SkSVGNode>* SkSVGDOM::findNodeById(const char* id) {
+    SkString idStr(id);
+    return this->fIDMapper.find(idStr);
+}
+
 void SkSVGDOM::setRoot(sk_sp<SkSVGNode> root) {
     fRoot = std::move(root);
 }
+
+// TODO(fuego): move this to SkSVGNode or its own CU.
+bool SkSVGNode::setAttribute(const char* attributeName, const char* attributeValue) {
+    return set_string_attribute(sk_ref_sp(this), attributeName, attributeValue);
+}
diff --git a/experimental/svg/model/SkSVGDOM.h b/experimental/svg/model/SkSVGDOM.h
index 3d097cc..c565913 100644
--- a/experimental/svg/model/SkSVGDOM.h
+++ b/experimental/svg/model/SkSVGDOM.h
@@ -31,6 +31,9 @@
 
     void setRoot(sk_sp<SkSVGNode>);
 
+    // Returns the node with the given id, or nullptr if not found.
+    sk_sp<SkSVGNode>* findNodeById(const char* id);
+
     void render(SkCanvas*) const;
 
 private:
diff --git a/experimental/svg/model/SkSVGNode.h b/experimental/svg/model/SkSVGNode.h
index 446ae8a..aa37e02 100644
--- a/experimental/svg/model/SkSVGNode.h
+++ b/experimental/svg/model/SkSVGNode.h
@@ -51,6 +51,7 @@
     SkPath asPath(const SkSVGRenderContext&) const;
 
     void setAttribute(SkSVGAttribute, const SkSVGValue&);
+    bool setAttribute(const char* attributeName, const char* attributeValue);
 
     void setClipPath(const SkSVGClip&);
     void setClipRule(const SkSVGFillRule&);