151#define BOOST_SPIRIT_DEBUG 1
157 namespace qi = boost::spirit::qi;
158 namespace ascii = boost::spirit::ascii;
160 template <
typename Iterator>
161 struct transform_unit_parser : qi::grammar<Iterator, std::vector<transform_unit>(), ascii::space_type>
163 transform_unit_parser() : transform_unit_parser::base_type(start)
165 namespace phoenix = boost::phoenix;
171 using phoenix::push_back;
172 using namespace qi::labels;
175 comma %= -char_(
',');
190 >>
'(' >> double_ >> comma >> -double_ >>
')';
196 >> -double_ [at_c<2>(_val) =
true]
205 >> double_ [at_c<0>(_val) = _1]
207 >> -(double_ [at_c<1>(_val) = _1]
209 >> double_ [at_c<2>(_val) = _1])
212 skewX_rule %= lit(
"skewX") >>
'(' >> double_ >>
')';
213 skewY_rule %= lit(
"skewY") >>
'(' >> double_ >>
')';
216 (matrix_rule | translate_rule | scale_rule |
217 rotate_rule | skewX_rule | skewY_rule) %
221 qi::rule<Iterator, std::vector<transform_unit>(), ascii::space_type> start;
222 qi::rule<Iterator, translate(), ascii::space_type> translate_rule;
223 qi::rule<Iterator, matrix(), ascii::space_type> matrix_rule;
224 qi::rule<Iterator, scale(), ascii::space_type> scale_rule;
225 qi::rule<Iterator, rotate(), ascii::space_type> rotate_rule;
226 qi::rule<Iterator, skewX(), ascii::space_type> skewX_rule;
227 qi::rule<Iterator, skewY(), ascii::space_type> skewY_rule;
228 qi::rule<Iterator> comma;
236 using boost::spirit::ascii::space;
237 typedef std::string::const_iterator iterator_type;
238 typedef Private::transform_unit_parser<iterator_type> transform_unit_parser;
240 transform_unit_parser g;
241 const std::string str = _str.toStdString();
243 std::vector<Private::transform_unit> transforms;
244 iterator_type iter = str.begin();
245 iterator_type end = str.end();
246 bool r = phrase_parse(iter, end, g, space, transforms);
248 if (r && iter == end) {
252 m_transform = t.transform * m_transform;