usvg

usvg (micro SVG) is an SVG parser that tries to solve most of SVG complexity.

SVG is notoriously hard to parse. usvg presents a layer between an XML library and
a potential SVG rendering library. It will parse an input SVG into a strongly-typed tree structure
were all the elements, attributes, references and other SVG features are already resolved
and presented in the simplest way possible.
So a caller doesn't have to worry about most of the issues related to SVG parsing
and can focus just on the rendering part.

Features

  - All supported attributes are resolved.
    No need to worry about inheritable, implicit and default attributes
  - CSS will be applied
  - Only simple paths
      - Basic shapes (like rect and circle) will be converted into paths
      - Paths contain only absolute MoveTo, LineTo, QuadTo, CurveTo and ClosePath segments.
        ArcTo, implicit and relative segments will be converted
  - use will be resolved and replaced with the reference content
  - Nested svg will be resolved
  - Invalid, malformed elements will be removed
  - Relative length units (mm, em, etc.) will be converted into pixels/points
  - External images will be loaded
  - Internal, base64 images will be decoded
  - All references (like #elem and url(#elem)) will be resolved
  - switch will be resolved
  - Text elements, which are probably the hardest part of SVG, will be completely resolved.
    This includes all the attributes resolving, whitespaces preprocessing (xml:space),
    text chunks and spans resolving
  - Markers will be converted into regular elements. No need to place them manually
  - All filters are supported. Including filter functions, like filter="contrast(50%)"
  - Recursive elements will be detected and removed
  - objectBoundingBox will be replaced with userSpaceOnUse

Limitations

  - Unsupported SVG features will be ignored
  - CSS support is minimal
  - Only static SVG features,
    e.g. no a, view, cursor, script, no events and no animations

License

Licensed under either of

  - Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
  - MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)

at your option.

Contribution

Contributions are welcome by pull request.
The Rust code of conduct applies.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be licensed as above, without any additional terms or conditions.
