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}