| from __future__ import print_function, absolute_import, division |
| |
| from fontTools.misc.py23 import * |
| from fontTools.svgLib.path import shapes |
| from fontTools.misc import etree |
| import pytest |
| |
| |
| @pytest.mark.parametrize( |
| "svg_xml, expected_path, expected_transform", |
| [ |
| # path: direct passthrough |
| ( |
| "<path d='I love kittens'/>", |
| "I love kittens", |
| None |
| ), |
| # path no @d |
| ( |
| "<path duck='Mallard'/>", |
| None, |
| None |
| ), |
| # line |
| ( |
| '<line x1="10" x2="50" y1="110" y2="150"/>', |
| 'M10,110 L50,150', |
| None |
| ), |
| # line, decimal positioning |
| ( |
| '<line x1="10.0" x2="50.5" y1="110.2" y2="150.7"/>', |
| 'M10,110.2 L50.5,150.7', |
| None |
| ), |
| # rect: minimal valid example |
| ( |
| "<rect width='1' height='1'/>", |
| "M0,0 H1 V1 H0 V0 z", |
| None |
| ), |
| # rect: sharp corners |
| ( |
| "<rect x='10' y='11' width='17' height='11'/>", |
| "M10,11 H27 V22 H10 V11 z", |
| None |
| ), |
| # rect: round corners |
| ( |
| "<rect x='9' y='9' width='11' height='7' rx='2'/>", |
| "M11,9 H18 A2,2 0 0 1 20,11 V14 A2,2 0 0 1 18,16 H11" |
| " A2,2 0 0 1 9,14 V11 A2,2 0 0 1 11,9 z", |
| None |
| ), |
| # rect: simple |
| ( |
| "<rect x='11.5' y='16' width='11' height='2'/>", |
| "M11.5,16 H22.5 V18 H11.5 V16 z", |
| None |
| ), |
| # rect: the one above plus a rotation |
| ( |
| "<rect x='11.5' y='16' transform='matrix(0.7071 -0.7071 0.7071 0.7071 -7.0416 16.9999)' width='11' height='2'/>", |
| "M11.5,16 H22.5 V18 H11.5 V16 z", |
| (0.7071, -0.7071, 0.7071, 0.7071, -7.0416, 16.9999) |
| ), |
| # polygon |
| ( |
| "<polygon points='30,10 50,30 10,30'/>", |
| "M30,10 50,30 10,30 z", |
| None |
| ), |
| # polyline |
| ( |
| "<polyline points='30,10 50,30 10,30'/>", |
| "M30,10 50,30 10,30", |
| None |
| ), |
| # circle, minimal valid example |
| ( |
| "<circle r='1'/>", |
| "M-1,0 A1,1 0 1 1 1,0 A1,1 0 1 1 -1,0", |
| None |
| ), |
| # circle |
| ( |
| "<circle cx='600' cy='200' r='100'/>", |
| "M500,200 A100,100 0 1 1 700,200 A100,100 0 1 1 500,200", |
| None |
| ), |
| # circle, decimal positioning |
| ( |
| "<circle cx='12' cy='6.5' r='1.5'></circle>", |
| "M10.5,6.5 A1.5,1.5 0 1 1 13.5,6.5 A1.5,1.5 0 1 1 10.5,6.5", |
| None |
| ), |
| # circle, with transform |
| ( |
| '<circle transform="matrix(0.9871 -0.1602 0.1602 0.9871 -7.525 8.6516)" cx="49.9" cy="51" r="14.3"/>', |
| 'M35.6,51 A14.3,14.3 0 1 1 64.2,51 A14.3,14.3 0 1 1 35.6,51', |
| (0.9871, -0.1602, 0.1602, 0.9871, -7.525, 8.6516) |
| ), |
| # ellipse |
| ( |
| '<ellipse cx="100" cy="50" rx="100" ry="50"/>', |
| 'M0,50 A100,50 0 1 1 200,50 A100,50 0 1 1 0,50', |
| None |
| ), |
| # ellipse, decimal positioning |
| ( |
| '<ellipse cx="100.5" cy="50" rx="10" ry="50.5"/>', |
| 'M90.5,50 A10,50.5 0 1 1 110.5,50 A10,50.5 0 1 1 90.5,50', |
| None |
| ), |
| # ellipse, with transform |
| ( |
| '<ellipse transform="matrix(0.9557 -0.2945 0.2945 0.9557 -14.7694 20.1454)" cx="59.5" cy="59.1" rx="30.9" ry="11.9"/>', |
| 'M28.6,59.1 A30.9,11.9 0 1 1 90.4,59.1 A30.9,11.9 0 1 1 28.6,59.1', |
| (0.9557, -0.2945, 0.2945, 0.9557, -14.7694, 20.1454) |
| ), |
| ] |
| ) |
| def test_el_to_path(svg_xml, expected_path, expected_transform): |
| pb = shapes.PathBuilder() |
| pb.add_path_from_element(etree.fromstring(svg_xml)) |
| if expected_path: |
| expected_paths = [expected_path] |
| expected_transforms = [expected_transform] |
| else: |
| expected_paths = [] |
| expected_transforms = [] |
| assert pb.paths == expected_paths |
| assert pb.transforms == expected_transforms |