SVG parser - add ignore_ member variable to allow skipping of unsupported elements, currently clipPath (#3818)

This commit is contained in:
Artem Pavlenko 2018-01-09 15:19:52 +00:00
parent a04ca98c6b
commit ff31c6d6eb
2 changed files with 15 additions and 3 deletions

View file

@ -74,6 +74,7 @@ public:
svg_converter_type & path_; svg_converter_type & path_;
bool is_defs_; bool is_defs_;
bool strict_; bool strict_;
bool ignore_;
std::map<std::string, gradient> gradient_map_; std::map<std::string, gradient> gradient_map_;
std::map<std::string, boost::property_tree::detail::rapidxml::xml_node<char> const*> node_cache_; std::map<std::string, boost::property_tree::detail::rapidxml::xml_node<char> const*> node_cache_;
agg::trans_affine viewbox_tr_{}; agg::trans_affine viewbox_tr_{};

View file

@ -368,6 +368,7 @@ bool parse_id_from_url (char const* str, std::string & id)
void traverse_tree(svg_parser & parser, rapidxml::xml_node<char> const* node) void traverse_tree(svg_parser & parser, rapidxml::xml_node<char> const* node)
{ {
if (parser.ignore_) return;
auto const* name = node->name(); auto const* name = node->name();
switch (node->type()) switch (node->type())
{ {
@ -383,6 +384,11 @@ void traverse_tree(svg_parser & parser, rapidxml::xml_node<char> const* node)
} }
break; break;
} }
case "clipPath"_case:
{
parser.ignore_ = true;
break;
}
// the gradient tags *should* be in defs, but illustrator seems not to put them in there so // the gradient tags *should* be in defs, but illustrator seems not to put them in there so
// accept them anywhere // accept them anywhere
case "linearGradient"_case: case "linearGradient"_case:
@ -467,21 +473,25 @@ void traverse_tree(svg_parser & parser, rapidxml::xml_node<char> const* node)
void end_element(svg_parser & parser, rapidxml::xml_node<char> const* node) void end_element(svg_parser & parser, rapidxml::xml_node<char> const* node)
{ {
auto const* name = node->name(); auto name = name_to_int(node->name());
if (!parser.is_defs_ && std::strcmp(name, "g") == 0) if (!parser.is_defs_ && (name == "g"_case))
{ {
if (node->first_node() != nullptr) if (node->first_node() != nullptr)
{ {
parser.path_.pop_attr(); parser.path_.pop_attr();
} }
} }
else if (std::strcmp(name, "defs") == 0) else if (name == "defs"_case)
{ {
if (node->first_node() != nullptr) if (node->first_node() != nullptr)
{ {
parser.is_defs_ = false; parser.is_defs_ = false;
} }
} }
else if(name == "clipPath"_case)
{
parser.ignore_ = false;
}
} }
void parse_element(svg_parser & parser, char const* name, rapidxml::xml_node<char> const* node) void parse_element(svg_parser & parser, char const* name, rapidxml::xml_node<char> const* node)
@ -1414,6 +1424,7 @@ void parse_linear_gradient(svg_parser & parser, rapidxml::xml_node<char> const*
svg_parser::svg_parser(svg_converter_type & path, bool strict) svg_parser::svg_parser(svg_converter_type & path, bool strict)
: path_(path), : path_(path),
is_defs_(false), is_defs_(false),
ignore_(false),
err_handler_(strict) {} err_handler_(strict) {}
svg_parser::~svg_parser() {} svg_parser::~svg_parser() {}