1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
use crate::dot::DotString;
use std::borrow::Cow;
/// Sets the aspect ratio (drawing height/drawing width) for the drawing.
/// Note that this is adjusted before the size attribute constraints are enforced.
/// In addition, the calculations usually ignore the node sizes, so the final drawing size may only
/// approximate what is desired.
pub enum Ratio {
/// Ratio is taken as the desired aspect ratio.
/// Then, if the actual aspect ratio is less than the desired ratio, the drawing height is
/// scaled up to achieve the desired ratio; if the actual ratio is greater than that desired
/// ratio, the drawing width is scaled up.
Aspect(f32),
/// If fill and the size attribute is set, node positions are scaled, separately in both x and y,
/// so that the final drawing exactly fills the specified size.
/// If both size values exceed the width and height of the drawing, then both coordinate values
/// of each node are scaled up accordingly. However, if either size dimension is smaller than
/// the corresponding dimension in the drawing, one dimension is scaled up so that the
/// final drawing has the same aspect ratio as specified by size.
/// Then, when rendered, the layout will be scaled down uniformly in both dimensions to fit
/// the given size, which may cause nodes and text to shrink as well. This may not be what
/// the user wants, but it avoids the hard problem of how to reposition the nodes in an
/// acceptable fashion to reduce the drawing size.
Fill,
/// If compress and the size attribute is set, dot attempts to compress the initial
/// layout to fit in the given size. This achieves a tighter packing of nodes but reduces
/// the balance and symmetry.
Compress,
/// the size attribute is set, and both the width and the height of the graph are less than
/// the value in size, node positions are scaled uniformly until at least one dimension
/// fits size exactly.
/// Note that this is distinct from using size as the desired size, as here the drawing is
/// expanded before edges are generated and all node and text sizes remain unchanged.
Expand,
/// the page attribute is set and the graph cannot be drawn on a single page,
/// then size is set to an “ideal” value.
Auto,
}
impl<'a> DotString<'a> for Ratio {
fn dot_string(&self) -> Cow<'a, str> {
match self {
Ratio::Aspect(aspect) => aspect.to_string().into(),
Ratio::Fill => "fill".into(),
Ratio::Compress => "compress".into(),
Ratio::Expand => "expand".into(),
Ratio::Auto => "auto".into(),
}
}
}
|