| 1 | // Copyright 2018 the Resvg Authors |
| 2 | // SPDX-License-Identifier: Apache-2.0 OR MIT |
| 3 | |
| 4 | /*! |
| 5 | `usvg` (micro SVG) is an [SVG] parser that tries to solve most of SVG complexity. |
| 6 | |
| 7 | SVG is notoriously hard to parse. `usvg` presents a layer between an XML library and |
| 8 | a potential SVG rendering library. It will parse an input SVG into a strongly-typed tree structure |
| 9 | were all the elements, attributes, references and other SVG features are already resolved |
| 10 | and presented in the simplest way possible. |
| 11 | So a caller doesn't have to worry about most of the issues related to SVG parsing |
| 12 | and can focus just on the rendering part. |
| 13 | |
| 14 | ## Features |
| 15 | |
| 16 | - All supported attributes are resolved. |
| 17 | No need to worry about inheritable, implicit and default attributes |
| 18 | - CSS will be applied |
| 19 | - Only simple paths |
| 20 | - Basic shapes (like `rect` and `circle`) will be converted into paths |
| 21 | - Paths contain only absolute *MoveTo*, *LineTo*, *QuadTo*, *CurveTo* and *ClosePath* segments. |
| 22 | ArcTo, implicit and relative segments will be converted |
| 23 | - `use` will be resolved and replaced with the reference content |
| 24 | - Nested `svg` will be resolved |
| 25 | - Invalid, malformed elements will be removed |
| 26 | - Relative length units (mm, em, etc.) will be converted into pixels/points |
| 27 | - External images will be loaded |
| 28 | - Internal, base64 images will be decoded |
| 29 | - All references (like `#elem` and `url(#elem)`) will be resolved |
| 30 | - `switch` will be resolved |
| 31 | - Text elements, which are probably the hardest part of SVG, will be completely resolved. |
| 32 | This includes all the attributes resolving, whitespaces preprocessing (`xml:space`), |
| 33 | text chunks and spans resolving |
| 34 | - Markers will be converted into regular elements. No need to place them manually |
| 35 | - All filters are supported. Including filter functions, like `filter="contrast(50%)"` |
| 36 | - Recursive elements will be detected and removed |
| 37 | - `objectBoundingBox` will be replaced with `userSpaceOnUse` |
| 38 | |
| 39 | ## Limitations |
| 40 | |
| 41 | - Unsupported SVG features will be ignored |
| 42 | - CSS support is minimal |
| 43 | - Only [static](http://www.w3.org/TR/SVG11/feature#SVG-static) SVG features, |
| 44 | e.g. no `a`, `view`, `cursor`, `script`, no events and no animations |
| 45 | |
| 46 | [SVG]: https://en.wikipedia.org/wiki/Scalable_Vector_Graphics |
| 47 | */ |
| 48 | |
| 49 | #![forbid (unsafe_code)] |
| 50 | #![warn (missing_docs)] |
| 51 | #![warn (missing_debug_implementations)] |
| 52 | #![warn (missing_copy_implementations)] |
| 53 | |
| 54 | mod parser; |
| 55 | #[cfg (feature = "text" )] |
| 56 | mod text; |
| 57 | mod tree; |
| 58 | mod writer; |
| 59 | |
| 60 | pub use parser::*; |
| 61 | #[cfg (feature = "text" )] |
| 62 | pub use text::*; |
| 63 | pub use tree::*; |
| 64 | |
| 65 | pub use roxmltree; |
| 66 | |
| 67 | #[cfg (feature = "text" )] |
| 68 | pub use fontdb; |
| 69 | |
| 70 | pub use writer::WriteOptions; |
| 71 | pub use xmlwriter::Indent; |
| 72 | |