(v string)
| 295 | } |
| 296 | |
| 297 | func (svg *svgParser) parseTransform(v string) Matrix { |
| 298 | i, j := 0, 0 |
| 299 | m := Identity |
| 300 | var fun string |
| 301 | for i < len(v) { |
| 302 | if v[i] == '(' { |
| 303 | fun = strings.ToLower(strings.TrimSpace(v[j:i])) |
| 304 | j = i + 1 |
| 305 | } else if v[i] == ')' { |
| 306 | d := svg.parsePoints(v[j:i]) |
| 307 | switch fun { |
| 308 | case "matrix": |
| 309 | if len(d) != 6 { |
| 310 | svg.err = parse.NewErrorLexer(svg.z, "bad transform matrix") |
| 311 | } else { |
| 312 | m = m.Mul(Matrix{{d[0], d[2], d[4]}, {d[1], d[3], d[5]}}) |
| 313 | } |
| 314 | case "translate": |
| 315 | if len(d) != 1 && len(d) != 2 { |
| 316 | svg.err = parse.NewErrorLexer(svg.z, "bad transform translate") |
| 317 | } else if len(d) == 1 { |
| 318 | m = m.Translate(d[0], 0.0) |
| 319 | } else { |
| 320 | m = m.Translate(d[0], d[1]) |
| 321 | } |
| 322 | case "scale": |
| 323 | if len(d) != 1 && len(d) != 2 { |
| 324 | svg.err = parse.NewErrorLexer(svg.z, "bad transform scale") |
| 325 | } else if len(d) == 1 { |
| 326 | m = m.Scale(d[0], d[0]) |
| 327 | } else { |
| 328 | m = m.Scale(d[0], d[1]) |
| 329 | } |
| 330 | case "rotate": |
| 331 | if len(d) != 1 && len(d) != 3 { |
| 332 | svg.err = parse.NewErrorLexer(svg.z, "bad transform rotate") |
| 333 | } else if len(d) == 1 { |
| 334 | m = m.Rotate(d[0]) |
| 335 | } else { |
| 336 | m = m.RotateAbout(d[0], d[1], d[2]) |
| 337 | } |
| 338 | case "skewx": |
| 339 | if len(d) != 1 { |
| 340 | svg.err = parse.NewErrorLexer(svg.z, "bad transform skewX") |
| 341 | } else { |
| 342 | m = m.Shear(math.Tan(d[0]*math.Pi/180), 0) |
| 343 | } |
| 344 | case "skewy": |
| 345 | if len(d) != 1 { |
| 346 | svg.err = parse.NewErrorLexer(svg.z, "bad transform skewY") |
| 347 | } else { |
| 348 | m = m.Shear(0, math.Tan(d[0]*math.Pi/180)) |
| 349 | } |
| 350 | } |
| 351 | j = i + 1 |
| 352 | } |
| 353 | i++ |
| 354 | } |
no test coverage detected