svg_loader: deeper search for postponed nodes

Till now the proper node was searched only among children,
now all the nodes are checked.
This commit is contained in:
Mira Grudzinska 2022-09-01 01:15:59 +02:00 committed by Hermet Park
parent 313a4d1562
commit c93c2d3100

View file

@ -1803,19 +1803,10 @@ static SvgNode* _getDefsNode(SvgNode* node)
} }
static SvgNode* _findChildById(const SvgNode* node, const char* id) static SvgNode* _findNodeById(SvgNode *node, const char* id)
{ {
if (!node) return nullptr; if (!node) return nullptr;
auto child = node->child.data;
for (uint32_t i = 0; i < node->child.count; ++i, ++child) {
if (((*child)->id) && !strcmp((*child)->id, id)) return (*child);
}
return nullptr;
}
static SvgNode* _findNodeById(SvgNode *node, const char* id)
{
SvgNode* result = nullptr; SvgNode* result = nullptr;
if (node->id && !strcmp(node->id, id)) return node; if (node->id && !strcmp(node->id, id)) return node;
@ -1829,6 +1820,7 @@ static SvgNode* _findNodeById(SvgNode *node, const char* id)
return result; return result;
} }
static void _cloneGradStops(Array<Fill::ColorStop>& dst, const Array<Fill::ColorStop>& src) static void _cloneGradStops(Array<Fill::ColorStop>& dst, const Array<Fill::ColorStop>& src)
{ {
for (uint32_t i = 0; i < src.count; ++i) { for (uint32_t i = 0; i < src.count; ++i) {
@ -2117,8 +2109,8 @@ static void _clonePostponedNodes(Array<SvgNodeIdPair>* cloneNodes, SvgNode* doc)
for (uint32_t i = 0; i < cloneNodes->count; ++i) { for (uint32_t i = 0; i < cloneNodes->count; ++i) {
auto nodeIdPair = cloneNodes->data[i]; auto nodeIdPair = cloneNodes->data[i];
auto defs = _getDefsNode(nodeIdPair.node); auto defs = _getDefsNode(nodeIdPair.node);
auto nodeFrom = _findChildById(defs, nodeIdPair.id); auto nodeFrom = _findNodeById(defs, nodeIdPair.id);
if (!nodeFrom) nodeFrom = _findChildById(doc, nodeIdPair.id); if (!nodeFrom) nodeFrom = _findNodeById(doc, nodeIdPair.id);
_cloneNode(nodeFrom, nodeIdPair.node, 0); _cloneNode(nodeFrom, nodeIdPair.node, 0);
if (nodeFrom && nodeFrom->type == SvgNodeType::Symbol && nodeIdPair.node->type == SvgNodeType::Use) { if (nodeFrom && nodeFrom->type == SvgNodeType::Symbol && nodeIdPair.node->type == SvgNodeType::Use) {
nodeIdPair.node->node.use.symbol = nodeFrom; nodeIdPair.node->node.use.symbol = nodeFrom;
@ -2165,7 +2157,7 @@ static bool _attrParseUseNode(void* data, const char* key, const char* value)
if (!strcmp(key, "href") || !strcmp(key, "xlink:href")) { if (!strcmp(key, "href") || !strcmp(key, "xlink:href")) {
id = _idFromHref(value); id = _idFromHref(value);
defs = _getDefsNode(node); defs = _getDefsNode(node);
nodeFrom = _findChildById(defs, id); nodeFrom = _findNodeById(defs, id);
if (nodeFrom) { if (nodeFrom) {
_cloneNode(nodeFrom, node, 0); _cloneNode(nodeFrom, node, 0);
if (nodeFrom->type == SvgNodeType::Symbol) use->symbol = nodeFrom; if (nodeFrom->type == SvgNodeType::Symbol) use->symbol = nodeFrom;