• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use super::color::{Color, RGBAColor};
2 use plotters_backend::{BackendColor, BackendStyle};
3 
4 /// Style for any shape
5 #[derive(Copy, Clone)]
6 pub struct ShapeStyle {
7     /// Specification of the color.
8     pub color: RGBAColor,
9     /// Whether the style is filled with color.
10     pub filled: bool,
11     /// Stroke width.
12     pub stroke_width: u32,
13 }
14 
15 impl ShapeStyle {
16     /**
17     Returns a filled style with the same color and stroke width.
18 
19     # Example
20 
21     ```
22     use plotters::prelude::*;
23     let original_style = ShapeStyle {
24         color: BLUE.mix(0.6),
25         filled: false,
26         stroke_width: 2,
27     };
28     let filled_style = original_style.filled();
29     let drawing_area = SVGBackend::new("shape_style_filled.svg", (400, 200)).into_drawing_area();
30     drawing_area.fill(&WHITE).unwrap();
31     drawing_area.draw(&Circle::new((150, 100), 90, original_style));
32     drawing_area.draw(&Circle::new((250, 100), 90, filled_style));
33     ```
34 
35     The result is a figure with two circles, one of them filled:
36 
37     ![](https://cdn.jsdelivr.net/gh/facorread/plotters-doc-data@b0b94d5/apidoc/shape_style_filled.svg)
38     */
filled(&self) -> Self39     pub fn filled(&self) -> Self {
40         Self {
41             color: self.color.to_rgba(),
42             filled: true,
43             stroke_width: self.stroke_width,
44         }
45     }
46 
47     /**
48     Returns a new style with the same color and the specified stroke width.
49 
50     # Example
51 
52     ```
53     use plotters::prelude::*;
54     let original_style = ShapeStyle {
55         color: BLUE.mix(0.6),
56         filled: false,
57         stroke_width: 2,
58     };
59     let new_style = original_style.stroke_width(5);
60     let drawing_area = SVGBackend::new("shape_style_stroke_width.svg", (400, 200)).into_drawing_area();
61     drawing_area.fill(&WHITE).unwrap();
62     drawing_area.draw(&Circle::new((150, 100), 90, original_style));
63     drawing_area.draw(&Circle::new((250, 100), 90, new_style));
64     ```
65 
66     The result is a figure with two circles, one of them thicker than the other:
67 
68     ![](https://cdn.jsdelivr.net/gh/facorread/plotters-doc-data@b0b94d5/apidoc/shape_style_stroke_width.svg)
69     */
stroke_width(&self, width: u32) -> Self70     pub fn stroke_width(&self, width: u32) -> Self {
71         Self {
72             color: self.color.to_rgba(),
73             filled: self.filled,
74             stroke_width: width,
75         }
76     }
77 }
78 
79 impl<T: Color> From<T> for ShapeStyle {
from(f: T) -> Self80     fn from(f: T) -> Self {
81         ShapeStyle {
82             color: f.to_rgba(),
83             filled: false,
84             stroke_width: 1,
85         }
86     }
87 }
88 
89 impl BackendStyle for ShapeStyle {
90     /// Returns the color as interpreted by the backend.
color(&self) -> BackendColor91     fn color(&self) -> BackendColor {
92         self.color.to_backend_color()
93     }
94     /// Returns the stroke width.
stroke_width(&self) -> u3295     fn stroke_width(&self) -> u32 {
96         self.stroke_width
97     }
98 }
99