svg_parser - use parse_svg_value

This commit is contained in:
artemp 2016-01-14 11:03:55 +00:00
parent 8ab10d0231
commit cc635df7bc
2 changed files with 12 additions and 34 deletions

View file

@ -133,28 +133,6 @@ double parse_double(T & error_messages, const char* str)
return val; return val;
} }
// parse a double that might end with a %
// if it does then set the ref bool true and divide the result by 100
template <typename T>
double parse_double_optional_percent(T & error_messages, const char* str, bool &percent)
{
using namespace boost::spirit::qi;
using boost::phoenix::ref;
_1_type _1;
double_type double_;
char_type char_;
double val = 0.0;
if (!parse(str, str + std::strlen(str),double_[ref(val)=_1, ref(percent) = false]
> -char_('%')[ref(val) /= 100.0, ref(percent) = true]))
{
error_messages.emplace_back("Failed to parse double (optional %) from " + std::string(str));
}
return val;
}
// https://www.w3.org/TR/SVG/coords.html#Units // https://www.w3.org/TR/SVG/coords.html#Units
template <typename T> template <typename T>
double parse_svg_value(T & error_messages, const char* str, bool & percent) double parse_svg_value(T & error_messages, const char* str, bool & percent)
@ -538,12 +516,12 @@ void parse_dimensions(svg_parser & parser, rapidxml::xml_node<char> const* node)
auto const* width_attr = node->first_attribute("width"); auto const* width_attr = node->first_attribute("width");
if (width_attr) if (width_attr)
{ {
width = parse_double_optional_percent(parser.error_messages_, width_attr->value(), has_percent_width); width = parse_svg_value(parser.error_messages_, width_attr->value(), has_percent_width);
} }
auto const* height_attr = node->first_attribute("height"); auto const* height_attr = node->first_attribute("height");
if (height_attr) if (height_attr)
{ {
height = parse_double_optional_percent(parser.error_messages_, height_attr->value(), has_percent_height); height = parse_svg_value(parser.error_messages_, height_attr->value(), has_percent_height);
} }
auto const* viewbox_attr = node->first_attribute("viewBox"); auto const* viewbox_attr = node->first_attribute("viewBox");
if (viewbox_attr) if (viewbox_attr)
@ -969,19 +947,19 @@ void parse_radial_gradient(svg_parser & parser, rapidxml::xml_node<char> const*
auto * attr = node->first_attribute("cx"); auto * attr = node->first_attribute("cx");
if (attr != nullptr) if (attr != nullptr)
{ {
cx = parse_double_optional_percent(parser.error_messages_, attr->value(), has_percent); cx = parse_svg_value(parser.error_messages_, attr->value(), has_percent);
} }
attr = node->first_attribute("cy"); attr = node->first_attribute("cy");
if (attr != nullptr) if (attr != nullptr)
{ {
cy = parse_double_optional_percent(parser.error_messages_, attr->value(), has_percent); cy = parse_svg_value(parser.error_messages_, attr->value(), has_percent);
} }
attr = node->first_attribute("fx"); attr = node->first_attribute("fx");
if (attr != nullptr) if (attr != nullptr)
{ {
fx = parse_double_optional_percent(parser.error_messages_,attr->value(), has_percent); fx = parse_svg_value(parser.error_messages_,attr->value(), has_percent);
} }
else else
fx = cx; fx = cx;
@ -989,7 +967,7 @@ void parse_radial_gradient(svg_parser & parser, rapidxml::xml_node<char> const*
attr = node->first_attribute("fy"); attr = node->first_attribute("fy");
if (attr != nullptr) if (attr != nullptr)
{ {
fy = parse_double_optional_percent(parser.error_messages_, attr->value(), has_percent); fy = parse_svg_value(parser.error_messages_, attr->value(), has_percent);
} }
else else
fy = cy; fy = cy;
@ -997,7 +975,7 @@ void parse_radial_gradient(svg_parser & parser, rapidxml::xml_node<char> const*
attr = node->first_attribute("r"); attr = node->first_attribute("r");
if (attr != nullptr) if (attr != nullptr)
{ {
r = parse_double_optional_percent(parser.error_messages_, attr->value(), has_percent); r = parse_svg_value(parser.error_messages_, attr->value(), has_percent);
} }
// this logic for detecting %'s will not support mixed coordinates. // this logic for detecting %'s will not support mixed coordinates.
if (has_percent && parser.temporary_gradient_.second.get_units() == USER_SPACE_ON_USE) if (has_percent && parser.temporary_gradient_.second.get_units() == USER_SPACE_ON_USE)
@ -1026,25 +1004,25 @@ void parse_linear_gradient(svg_parser & parser, rapidxml::xml_node<char> const*
auto * attr = node->first_attribute("x1"); auto * attr = node->first_attribute("x1");
if (attr != nullptr) if (attr != nullptr)
{ {
x1 = parse_double_optional_percent(parser.error_messages_, attr->value(), has_percent); x1 = parse_svg_value(parser.error_messages_, attr->value(), has_percent);
} }
attr = node->first_attribute("x2"); attr = node->first_attribute("x2");
if (attr != nullptr) if (attr != nullptr)
{ {
x2 = parse_double_optional_percent(parser.error_messages_, attr->value(), has_percent); x2 = parse_svg_value(parser.error_messages_, attr->value(), has_percent);
} }
attr = node->first_attribute("y1"); attr = node->first_attribute("y1");
if (attr != nullptr) if (attr != nullptr)
{ {
y1 = parse_double_optional_percent(parser.error_messages_, attr->value(), has_percent); y1 = parse_svg_value(parser.error_messages_, attr->value(), has_percent);
} }
attr = node->first_attribute("y2"); attr = node->first_attribute("y2");
if (attr != nullptr) if (attr != nullptr)
{ {
y2 = parse_double_optional_percent(parser.error_messages_, attr->value(), has_percent); y2 = parse_svg_value(parser.error_messages_, attr->value(), has_percent);
} }
// this logic for detecting %'s will not support mixed coordinates. // this logic for detecting %'s will not support mixed coordinates.
if (has_percent && parser.temporary_gradient_.second.get_units() == USER_SPACE_ON_USE) if (has_percent && parser.temporary_gradient_.second.get_units() == USER_SPACE_ON_USE)

View file

@ -200,7 +200,7 @@ TEST_CASE("SVG parser") {
{ {
auto const& errors = p.error_messages(); auto const& errors = p.error_messages();
REQUIRE(errors.size() == 1); REQUIRE(errors.size() == 1);
REQUIRE(errors[0] == "Failed to parse double (optional %) from FAIL"); REQUIRE(errors[0] == "Failed to parse SVG value: \"FAIL\"");
} }
} }