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&);