TinyVG / sdk

TinyVG software development kit
https://tinyvg.tech/
MIT License
268 stars 15 forks source link

Port svg2tvgt to Rust based on resvg #3

Open ikskuh opened 2 years ago

ikskuh commented 2 years ago

The author of https://github.com/RazrFalcon/resvg said it might be easier to use resvg as a code base for the SVG converter:

https://news.ycombinator.com/item?id=29637778

This is something that would allow tvg-text to also implement the svg => tvg conversion by linking the Rust code as an object file

RazrFalcon commented 2 years ago

Hi! I wrote an initial prototype that converts SVG to tvg-text (text, not bin) and it works mostly fine. Need some additional tweaks. And I have some questions:

  1. How can I render tvg/tvgt to png? I guess I can write a render in a day (in Rust), judging by formats complexity. But I was looking for a reference implementation.
  2. TinyVG doesn't support a lot. Like a lot. How we should handle unsupported features? Specifically:
    • Filling and stroking with patterns. Should it be replaced with a fixed color or ignored completely?
    • What to do with gradients that have more than two points?
    • What to do with gradients with non 0/1 stop offsets?
    • What to do with gradient transform (this is an additional post-transform for gradients)? We can flatten scale/translate one, but not rotate/skew one.
    • No focal points on radial gradients?
    • How to implement group opacity? By ignoring or flattening it we will get an incorrect results (or at least not lossless).
    • No filters, masks, clippaths and images/bitmaps?
    • No fill rules?
    • No stroke dashing and line joins/caps? Should we convert stroke into fill path?
  3. Currently, resvg/usvg doesn't preserve original shapes, meaning svg2tvgt will produce only paths. No lines and rectangles. But we could try autodetecting those.
  4. Do I understand correctly that Y axis is flipped in TinyVG? At least compared to SVG.
ikskuh commented 2 years ago

Hi! I wrote an initial prototype that converts SVG to tvg-text (text, not bin) and it works mostly fine.

Very nice!

How can I render tvg/tvgt to png?

You can download the SDK on the website and use tvg-text to convert the text format to binary, then use tvg-render to create a .tga file. I didn't implement any PNG writer as we don't have a pure Zig implementation right now and i would've needed that to ship the code without libc. I usually use convert from ImageMagick for the .tga to .png conversion.

Currently, resvg/usvg doesn't preserve original shapes, meaning svg2tvgt will produce only paths. No lines and rectangles. But we could try autodetecting those.

I am fine with this for now, this is something that can be improved upon later.

Do I understand correctly that Y axis is flipped in TinyVG? At least compared to SVG.

It should not? :thinking: Both use a X-right, Y-down coordinate system. See also the original converter

TinyVG doesn't support a lot. Like a lot. How we should handle unsupported features?

For most of them, i would provide a --sloppy mode that will just convert what is possible and try best effort while --strict will just reject the conversion and tell you that the file uses a non-supported feature.

Group opacity might come into TinyVG, but i have to figure out what the implications of adding it are.

I will think about each of these points if it would be reasonable to add them to TinyVG or not.

But many thanks for implementing this! Can i see the source somewhere? Do we want to integrate that into this repository so i can link the Rust and Zig code together?

RazrFalcon commented 2 years ago

It should not? 🤔 Both use a X-right, Y-down coordinate system.

My bad. I was confused.

Group opacity might come into TinyVG, but I have to figure out what the implications of adding it are.

The easiest one is https://github.com/RazrFalcon/resvg-test-suite/blob/master/svg/a-opacity-001.svg This is currently impossible to implement.

while --strict will just reject the conversion and tell you that the file uses a non-supported feature.

It would reject 99% of the files... Will take a look.

Can i see the source somewhere?

I will plan to send you a pull request today.

ikskuh commented 2 years ago

The easiest one is https://github.com/RazrFalcon/resvg-test-suite/blob/master/svg/a-opacity-001.svg This is currently impossible to implement.

Ah, i see. Yes, right now, such an example would require performing some kind of CSG on the paths. I have to think about that.

I will plan to send you a pull request today.

Very sweet!