usvg/parser/
options.rs

1// Copyright 2018 the Resvg Authors
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3
4#[cfg(feature = "text")]
5use std::sync::Arc;
6
7#[cfg(feature = "text")]
8use crate::FontResolver;
9use crate::{ImageHrefResolver, ImageRendering, ShapeRendering, Size, TextRendering};
10
11/// Processing options.
12#[derive(Debug)]
13pub struct Options<'a> {
14    /// Directory that will be used during relative paths resolving.
15    ///
16    /// Expected to be the same as the directory that contains the SVG file,
17    /// but can be set to any.
18    ///
19    /// Default: `None`
20    pub resources_dir: Option<std::path::PathBuf>,
21
22    /// Target DPI.
23    ///
24    /// Impacts units conversion.
25    ///
26    /// Default: 96.0
27    pub dpi: f32,
28
29    /// A default font family.
30    ///
31    /// Will be used when no `font-family` attribute is set in the SVG.
32    ///
33    /// Default: Times New Roman
34    pub font_family: String,
35
36    /// A default font size.
37    ///
38    /// Will be used when no `font-size` attribute is set in the SVG.
39    ///
40    /// Default: 12
41    pub font_size: f32,
42
43    /// A list of languages.
44    ///
45    /// Will be used to resolve a `systemLanguage` conditional attribute.
46    ///
47    /// Format: en, en-US.
48    ///
49    /// Default: `[en]`
50    pub languages: Vec<String>,
51
52    /// Specifies the default shape rendering method.
53    ///
54    /// Will be used when an SVG element's `shape-rendering` property is set to `auto`.
55    ///
56    /// Default: GeometricPrecision
57    pub shape_rendering: ShapeRendering,
58
59    /// Specifies the default text rendering method.
60    ///
61    /// Will be used when an SVG element's `text-rendering` property is set to `auto`.
62    ///
63    /// Default: OptimizeLegibility
64    pub text_rendering: TextRendering,
65
66    /// Specifies the default image rendering method.
67    ///
68    /// Will be used when an SVG element's `image-rendering` property is set to `auto`.
69    ///
70    /// Default: OptimizeQuality
71    pub image_rendering: ImageRendering,
72
73    /// Default viewport size to assume if there is no `viewBox` attribute and
74    /// the `width` or `height` attributes are relative.
75    ///
76    /// Default: `(100, 100)`
77    pub default_size: Size,
78
79    /// Specifies the way `xlink:href` in `<image>` elements should be handled.
80    ///
81    /// Default: see type's documentation for details
82    pub image_href_resolver: ImageHrefResolver<'a>,
83
84    /// Specifies how fonts should be resolved and loaded.
85    #[cfg(feature = "text")]
86    pub font_resolver: FontResolver<'a>,
87
88    /// A database of fonts usable by text.
89    ///
90    /// This is a base database. If a custom `font_resolver` is specified,
91    /// additional fonts can be loaded during parsing. Those will be added to a
92    /// copy of this database. The full database containing all fonts referenced
93    /// in a `Tree` becomes available as [`Tree::fontdb`](crate::Tree::fontdb)
94    /// after parsing. If no fonts were loaded dynamically, that database will
95    /// be the same as this one.
96    #[cfg(feature = "text")]
97    pub fontdb: Arc<fontdb::Database>,
98    /// A CSS stylesheet that should be injected into the SVG. Can be used to overwrite
99    /// certain attributes.
100    pub style_sheet: Option<String>,
101}
102
103impl Default for Options<'_> {
104    fn default() -> Options<'static> {
105        Options {
106            resources_dir: None,
107            dpi: 96.0,
108            // Default font is user-agent dependent so we can use whichever we like.
109            font_family: "Times New Roman".to_owned(),
110            font_size: 12.0,
111            languages: vec!["en".to_string()],
112            shape_rendering: ShapeRendering::default(),
113            text_rendering: TextRendering::default(),
114            image_rendering: ImageRendering::default(),
115            default_size: Size::from_wh(100.0, 100.0).unwrap(),
116            image_href_resolver: ImageHrefResolver::default(),
117            #[cfg(feature = "text")]
118            font_resolver: FontResolver::default(),
119            #[cfg(feature = "text")]
120            fontdb: Arc::new(fontdb::Database::new()),
121            style_sheet: None,
122        }
123    }
124}
125
126impl Options<'_> {
127    /// Converts a relative path into absolute relative to the SVG file itself.
128    ///
129    /// If `Options::resources_dir` is not set, returns itself.
130    pub fn get_abs_path(&self, rel_path: &std::path::Path) -> std::path::PathBuf {
131        match self.resources_dir {
132            Some(ref dir) => dir.join(rel_path),
133            None => rel_path.into(),
134        }
135    }
136
137    /// Mutably acquires the database.
138    ///
139    /// This clones the database if it is currently shared.
140    #[cfg(feature = "text")]
141    pub fn fontdb_mut(&mut self) -> &mut fontdb::Database {
142        Arc::make_mut(&mut self.fontdb)
143    }
144}