deeplook / svglib

Read SVG files and convert them to other formats.
GNU Lesser General Public License v3.0
320 stars 80 forks source link

Transform on clipPath does not work #366

Open blayzen-w opened 1 year ago

blayzen-w commented 1 year ago

When clipPaths contain a path with a transform, the path is ignored and discarded with the error message Unsupported shape type Group for clipping.

The svg I am testing with is the following:

<svg namespace="http://www.w3.org/XML/1998/namespace" version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <defs>
        <clipPath id="clip-1">
            <path transform="scale(0.5, 0.5)" d="M 50, 50 m -50, 0 a 50,50 0 1,0 100,0 a 50,50 0 1,0 -100,0"/>
        </clipPath>
    </defs>
    <g>
        <g clip-path="url(#clip-1)">
            <path d="M25,25h-50v-50h50V25z"/>
        </g>
    </g>
</svg>

I don't believe this was happening with earlier versions so I decided to do some digging and narrowed the problem down.

The error that is displayed starts here, when the detected shape from the node is neither a Path or a Rect despite the svg using a path element. https://github.com/deeplook/svglib/blob/9a43d4f71a483f844b905d12682d35b18d9099a7/svglib/svglib.py#L655-L656

This is caused from the convertShape function where, if there is a transform, then it will add the shape to a group and apply the transform to the group instead of the shape. https://github.com/deeplook/svglib/blob/9a43d4f71a483f844b905d12682d35b18d9099a7/svglib/svglib.py#L895-L916

I did a quick test and applied the transform directly on the path element ~and everything seemed to work fine~, however I'm not sure if there are any unintended side effects from doing it this way. Is this an intended feature or could I work on a patch to add an optional argument to apply the transformation directly for this use case?

Edit: I doubled checked the output and the transformed path was not placed or transformed correctly so additional work may be needed with this part.

github-actions[bot] commented 1 year ago

Thank you for raising your first issue! Your help to improve svglib is much appreciated!

claudep commented 1 year ago

I don't remember if the fact to apply transforms only on shapes was a conveniency, or if it was required. Feel free to experiment and suggest changes if they are successful.