Update plotters-backend to 0.3.7
Test: m
Change-Id: I5a62d8e79e77b0d562deac6b00e6e6ef97aeff50
diff --git a/crates/plotters-backend/.android-checksum.json b/crates/plotters-backend/.android-checksum.json
new file mode 100644
index 0000000..1d77e47
--- /dev/null
+++ b/crates/plotters-backend/.android-checksum.json
@@ -0,0 +1 @@
+{"package":null,"files":{"MODULE_LICENSE_MIT":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","src/rasterizer/rect.rs":"557d17069969e025dd96887f289a305afef3532a92a26e3c456ca7affdb44d97","src/rasterizer/mod.rs":"ada18efe55aa77caa6dfd3fedb0a71792e34895376906af5f11f75b4827e19cd","src/rasterizer/circle.rs":"029380b58dca23548496b744c286c0dda5551e0a3d0817c40857a34b27a4f2bf","src/rasterizer/polygon.rs":"708a0a957faa34640e830f30daf4d92b94b458082f252bb6cdfd880649f3c182","src/rasterizer/path.rs":"6598e85abbb27cde66164af7959c7cbe04adae9196fdcaee62ebfdc39a6c723b","Android.bp":"24e9d64f8ff2073d9ca6a144fbb21d5e4d489de76481930c7c1882509758fdfb","src/rasterizer/line.rs":"9529f3b1f441de8059a1fd400c3196320fe47887147639d4d531fddc746f11bb","cargo_embargo.json":"aa45a963da01d3f018be316cd5b7646a5b413ce2611c5218f2914d2e8a9efd0e",".cargo-checksum.json":"63a3b88c05b612fd2f407670c726dd38c145eb8699a6290dcd5fcd371c4a6704","src/lib.rs":"d46ec0ca2033f24c643fa7804536c09eaf16915960227583b829a4455588fc60","Cargo.toml":"6fcc5e7747e6db8c06981e324d55e524deb8bf741dba1a249f95cf89537625dd","TEST_MAPPING":"5df47f5b5b7533d10aa6a3ecb9189615e716a8060f002faa2bf4c893c12f33f9","README.md":"ddb69f5e9834d1b328083ba0c2a06efafe474ab62d13cd83aa6a732fb17eeb69","src/style.rs":"cb87e4a8ec84192a80d853539d3d50d0a54bb7c75eae8818fbc0a59186e565db","METADATA":"8e945219f3c076e2b4f7ca6c8304d2a86f8d70925069a7813dbd5f25536920c9","LICENSE":"1c9a706701fabb4345eddbdf9e1b9b60668d05f9df8e0ec9bf4b6e08a15c4e33","src/text.rs":"09129853156a58d896ea920c45f97881f157a46088b8e1d8b014d2407988640e"}}
\ No newline at end of file
diff --git a/crates/plotters-backend/.cargo-checksum.json b/crates/plotters-backend/.cargo-checksum.json
index 3372831..f761140 100644
--- a/crates/plotters-backend/.cargo-checksum.json
+++ b/crates/plotters-backend/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"c8624ca3be0b538da30206d6e26e26a99231d406160330003fa628eab19cc59e","LICENSE":"1e881ecf2862d01e6e5bc2b861e46886d2a6fb01499c0c508a209a7271b13cf2","README.md":"4c2c30ecd493e140c61242f4d01a4561dce72ae2c1a9be7df442f2a06f3f1db8","src/lib.rs":"31fe4a889ee62a18ec4eab32e8260bcf11d30830ef490be936a113404aa5a187","src/rasterizer/circle.rs":"5228c47ce8401c728b2c5cf213507dfafbaee2242e9720b308489e7eb4b2b834","src/rasterizer/line.rs":"79690b46f3ef7164a9484a78279047d0f4c52b10585d72a232d38af96b37d094","src/rasterizer/mod.rs":"186e8f15667306a2335e780860f58932639735a0ea0022c5e761137162478be0","src/rasterizer/path.rs":"1031fbe7e0e271ca55ee1a65bb9b9a0e2ec548226e78d325a558d832e1e9025e","src/rasterizer/polygon.rs":"a287a9afa26372b529447234868f08d87d5f69815af834847840c7bcf8559b31","src/rasterizer/rect.rs":"eac6b60b15908677dd8672e30486b1242c74ff72ac3988d5a669e1e5c8e2a83e","src/style.rs":"f6c2f04bcdd556e500a5853d8948ebcfaf990c738678b603c859ba6ef298e5d6","src/text.rs":"cc7867192642837cb8d632474ce40a3dafe9323a80537de27611d48f76a93fce"},"package":"9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609"}
\ No newline at end of file
+{"files":{"Cargo.toml":"076fa714c75a56010f96b5ef56daa107a870ac686f3eb632069fbb7c610eb68f","LICENSE":"1e881ecf2862d01e6e5bc2b861e46886d2a6fb01499c0c508a209a7271b13cf2","README.md":"4c2c30ecd493e140c61242f4d01a4561dce72ae2c1a9be7df442f2a06f3f1db8","src/lib.rs":"9de243b1a98f1ba6d4a058312bb279a0dd485d6334f966766e428ff16191f6d2","src/rasterizer/circle.rs":"e142d47f7f9d6f68b3eba0fa75137a8a01a19a2b2eebb6e4be9e3c259236b029","src/rasterizer/line.rs":"d308950fac60df0dfb7b5d2e3a785b50e42deebcf3d7443456b412ef9c3003a6","src/rasterizer/mod.rs":"186e8f15667306a2335e780860f58932639735a0ea0022c5e761137162478be0","src/rasterizer/path.rs":"817cdc74b09d9814d90d99d6608b8f263c8e400f15691a7be08273c10c2cbfa5","src/rasterizer/polygon.rs":"fc61d3b65c3391fd134c2988dcad682890657abbc1dc87190555568ad5d3b686","src/rasterizer/rect.rs":"eac6b60b15908677dd8672e30486b1242c74ff72ac3988d5a669e1e5c8e2a83e","src/style.rs":"f6c2f04bcdd556e500a5853d8948ebcfaf990c738678b603c859ba6ef298e5d6","src/text.rs":"e8ec09054613ffd92579da201b959d75655db8a1e737aff01ece5e2114e1a611"},"package":"df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a"}
\ No newline at end of file
diff --git a/crates/plotters-backend/Android.bp b/crates/plotters-backend/Android.bp
index 8c50012..81820f1 100644
--- a/crates/plotters-backend/Android.bp
+++ b/crates/plotters-backend/Android.bp
@@ -18,7 +18,7 @@
host_supported: true,
crate_name: "plotters_backend",
cargo_env_compat: true,
- cargo_pkg_version: "0.3.5",
+ cargo_pkg_version: "0.3.7",
crate_root: "src/lib.rs",
edition: "2018",
apex_available: [
diff --git a/crates/plotters-backend/Cargo.toml b/crates/plotters-backend/Cargo.toml
index 7fd1039..09ed859 100644
--- a/crates/plotters-backend/Cargo.toml
+++ b/crates/plotters-backend/Cargo.toml
@@ -12,12 +12,21 @@
[package]
edition = "2018"
name = "plotters-backend"
-version = "0.3.5"
+version = "0.3.7"
authors = ["Hao Hou <haohou302@gmail.com>"]
+build = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
description = "Plotters Backend API"
homepage = "https://plotters-rs.github.io"
readme = "README.md"
license = "MIT"
repository = "https://github.com/plotters-rs/plotters"
+[lib]
+name = "plotters_backend"
+path = "src/lib.rs"
+
[dependencies]
diff --git a/crates/plotters-backend/METADATA b/crates/plotters-backend/METADATA
index 0a6b1f4..e11c6b5 100644
--- a/crates/plotters-backend/METADATA
+++ b/crates/plotters-backend/METADATA
@@ -1,17 +1,17 @@
name: "plotters-backend"
description: "Plotters Backend API"
third_party {
- version: "0.3.5"
+ version: "0.3.7"
license_type: NOTICE
last_upgrade_date {
year: 2024
- month: 2
- day: 5
+ month: 12
+ day: 20
}
homepage: "https://crates.io/crates/plotters-backend"
identifier {
type: "Archive"
- value: "https://static.crates.io/crates/plotters-backend/plotters-backend-0.3.5.crate"
- version: "0.3.5"
+ value: "https://static.crates.io/crates/plotters-backend/plotters-backend-0.3.7.crate"
+ version: "0.3.7"
}
}
diff --git a/crates/plotters-backend/src/lib.rs b/crates/plotters-backend/src/lib.rs
index d4fd904..0b35d1a 100644
--- a/crates/plotters-backend/src/lib.rs
+++ b/crates/plotters-backend/src/lib.rs
@@ -3,7 +3,7 @@
Plotters project, please check the [main crate](https://crates.io/crates/plotters).
This is the crate that used as the connector between Plotters and different backend crates. Since Plotters 0.3, all the backends has been
- hosted as seperate crates for the usability and maintainability reasons.
+ hosted as separate crates for the usability and maintainability reasons.
At the same time, Plotters is now supporting third-party backends and all the backends are now supports "plug-and-play":
To use a external backend, just depends on both the Plotters main crate and the third-party backend crate.
@@ -16,7 +16,7 @@
If the backend only implements [DrawingBackend::draw_pixel](trait.DrawingBackend.html#tymethod.draw_pixel), the default CPU rasterizer will be
used to give your backend ability of drawing different shapes. For those backend that supports advanced drawing instructions, such as, GPU
- acelerated shape drawing, all the provided trait method can be overriden from the specific backend code.
+ accelerated shape drawing, all the provided trait method can be overridden from the specific backend code.
If your backend have text rendering ability, you may want to override the [DrawingBackend::estimate_text_size](trait.DrawingBackend.html#tymethod.estimate_text_size)
to avoid wrong spacing, since the Plotters default text handling code may behaves differently from the backend in terms of text rendering.
@@ -33,7 +33,7 @@
```text
.ensure_prepared() &&
+-------------+ +-------------+ .draw_pixels() +--------------+ drop
- |Start drwaing|--->|Ready to draw| ------------------------+---->|Finish 1 frame| --------->
+ |Start drawing|--->|Ready to draw| ------------------------+---->|Finish 1 frame| --------->
+-------------+ +-------------+ | +--------------+
^ ^ | |
| +------------------------------- + |
@@ -48,12 +48,12 @@
- For dynamic drawing, frames are defined by invocation of `DrawingBackend::present`, everything prior the invocation should belongs to previous frame
# Compatibility Note
- Since Plotters v0.3, plotters use the "plug-and-play" schema to import backends, this requires both Plotters and the backend crates depdens on a
+ Since Plotters v0.3, plotters use the "plug-and-play" schema to import backends, this requires both Plotters and the backend crates depends on a
same version of `plotters-backend` crate. This crate (`plotters-backend`) will enforce that any revision (means the last number in a version number)
won't contains breaking change - both on the Plotters side and backend side.
Plotters main crate is always importing the backend crate with version specification `plotters-backend = "^<major>.<minor>*"`.
- It's highly recommended that all the external crates follows the same rule to import `plotters-backend` depdendency, to avoid protential breaking
+ It's highly recommended that all the external crates follows the same rule to import `plotters-backend` dependency, to avoid potential breaking
caused by `plotters-backend` crates gets a revision update.
We also impose a versioning rule with `plotters` and some backends:
@@ -233,8 +233,8 @@
.layout_box(text)
.map_err(|e| DrawingErrorKind::FontError(Box::new(e)))?;
let ((min_x, min_y), (max_x, max_y)) = layout;
- let width = (max_x - min_x) as i32;
- let height = (max_y - min_y) as i32;
+ let width = max_x - min_x;
+ let height = max_y - min_y;
let dx = match style.anchor().h_pos {
HPos::Left => 0,
HPos::Right => -width,
@@ -247,7 +247,7 @@
};
let trans = style.transform();
let (w, h) = self.get_size();
- match style.draw(text, (0, 0), |x, y, color| {
+ let drawing_result = style.draw(text, (0, 0), |x, y, color| {
let (x, y) = trans.transform(x + dx - min_x, y + dy - min_y);
let (x, y) = (pos.0 + x, pos.1 + y);
if x >= 0 && x < w as i32 && y >= 0 && y < h as i32 {
@@ -255,7 +255,8 @@
} else {
Ok(())
}
- }) {
+ });
+ match drawing_result {
Ok(drawing_result) => drawing_result,
Err(font_error) => Err(DrawingErrorKind::FontError(Box::new(font_error))),
}
@@ -308,9 +309,9 @@
break;
}
// FIXME: This assume we have RGB image buffer
- let r = src[(dx + dy * w) as usize * 3];
- let g = src[(dx + dy * w) as usize * 3 + 1];
- let b = src[(dx + dy * w) as usize * 3 + 2];
+ let r = src[(dx + dy * iw) as usize * 3];
+ let g = src[(dx + dy * iw) as usize * 3 + 1];
+ let b = src[(dx + dy * iw) as usize * 3 + 2];
let color = BackendColor {
alpha: 1.0,
rgb: (r, g, b),
diff --git a/crates/plotters-backend/src/rasterizer/circle.rs b/crates/plotters-backend/src/rasterizer/circle.rs
index 0584167..fa7fc50 100644
--- a/crates/plotters-backend/src/rasterizer/circle.rs
+++ b/crates/plotters-backend/src/rasterizer/circle.rs
@@ -53,9 +53,9 @@
let (x0, x1) = ((-half_size).ceil() as i32, half_size.floor() as i32);
for x in x0..x1 {
- let outter_y0 = ((r_limit as f64) * (r_limit as f64) - x as f64 * x as f64).sqrt();
+ let outer_y0 = ((r_limit as f64) * (r_limit as f64) - x as f64 * x as f64).sqrt();
let inner_y0 = r as f64 - 1.0;
- let mut y1 = outter_y0.min(inner_y0);
+ let mut y1 = outer_y0.min(inner_y0);
let y0 = ((r as f64) * (r as f64) - x as f64 * x as f64).sqrt();
if y0 > y1 {
@@ -69,9 +69,9 @@
}
for x in x1 + 1..r {
- let outter_y0 = ((r_limit as f64) * (r_limit as f64) - x as f64 * x as f64).sqrt();
+ let outer_y0 = ((r_limit as f64) * (r_limit as f64) - x as f64 * x as f64).sqrt();
let inner_y0 = r as f64 - 1.0;
- let y0 = outter_y0.min(inner_y0);
+ let y0 = outer_y0.min(inner_y0);
let y1 = x as f64;
if y1 < y0 {
@@ -168,7 +168,6 @@
radius.0 as f64 - a0,
a1.floor(),
|h, (f, t)| {
- let h = h as i32;
let f = f as i32;
let t = t as i32;
check_result!(b.draw_line(
@@ -220,8 +219,8 @@
));
let d_inner = ((radius.1 as f64) / (2f64).sqrt()) as i32;
- let d_outter = (((radius.0 as f64) / (2f64).sqrt()) as i32).min(radius.1 as i32 - 1);
- let d_outter_actually = (radius.1 as i32).min(
+ let d_outer = (((radius.0 as f64) / (2f64).sqrt()) as i32).min(radius.1 as i32 - 1);
+ let d_outer_actually = (radius.1 as i32).min(
(radius.0 as f64 * radius.0 as f64 - radius.1 as f64 * radius.1 as f64 / 2.0)
.sqrt()
.ceil() as i32,
@@ -229,43 +228,43 @@
check_result!(b.draw_line(
(center.0 - d_inner, center.1 - d_inner),
- (center.0 - d_outter, center.1 - d_outter),
+ (center.0 - d_outer, center.1 - d_outer),
&style.color()
));
check_result!(b.draw_line(
(center.0 + d_inner, center.1 - d_inner),
- (center.0 + d_outter, center.1 - d_outter),
+ (center.0 + d_outer, center.1 - d_outer),
&style.color()
));
check_result!(b.draw_line(
(center.0 - d_inner, center.1 + d_inner),
- (center.0 - d_outter, center.1 + d_outter),
+ (center.0 - d_outer, center.1 + d_outer),
&style.color()
));
check_result!(b.draw_line(
(center.0 + d_inner, center.1 + d_inner),
- (center.0 + d_outter, center.1 + d_outter),
+ (center.0 + d_outer, center.1 + d_outer),
&style.color()
));
check_result!(b.draw_line(
(center.0 - d_inner, center.1 + d_inner),
- (center.0 - d_outter_actually, center.1 + d_inner),
+ (center.0 - d_outer_actually, center.1 + d_inner),
&style.color()
));
check_result!(b.draw_line(
(center.0 + d_inner, center.1 - d_inner),
- (center.0 + d_inner, center.1 - d_outter_actually),
+ (center.0 + d_inner, center.1 - d_outer_actually),
&style.color()
));
check_result!(b.draw_line(
(center.0 + d_inner, center.1 + d_inner),
- (center.0 + d_inner, center.1 + d_outter_actually),
+ (center.0 + d_inner, center.1 + d_outer_actually),
&style.color()
));
check_result!(b.draw_line(
(center.0 + d_inner, center.1 + d_inner),
- (center.0 + d_outter_actually, center.1 + d_inner),
+ (center.0 + d_outer_actually, center.1 + d_inner),
&style.color()
));
diff --git a/crates/plotters-backend/src/rasterizer/line.rs b/crates/plotters-backend/src/rasterizer/line.rs
index 17836d9..ae1ddd4 100644
--- a/crates/plotters-backend/src/rasterizer/line.rs
+++ b/crates/plotters-backend/src/rasterizer/line.rs
@@ -110,7 +110,7 @@
}
if to.0 > batch_limit && y < f64::from(to.1) {
- let x = batch_limit as i32 + 1;
+ let x = batch_limit + 1;
if 1.0 + y.floor() - y > 1e-5 {
check_result!(put_pixel((x, y as i32), 1.0 + y.floor() - y));
}
diff --git a/crates/plotters-backend/src/rasterizer/path.rs b/crates/plotters-backend/src/rasterizer/path.rs
index eae0bfe..004461c 100644
--- a/crates/plotters-backend/src/rasterizer/path.rs
+++ b/crates/plotters-backend/src/rasterizer/path.rs
@@ -34,8 +34,8 @@
f64::from(triple[1].1) + d * b_n.1,
);
- // Check if 3 points are colinear. If so, just emit the point.
- if a_t.1 * b_t.0 == a_t.0 * b_t.1 {
+ // Check if 3 points are colinear, up to precision. If so, just emit the point.
+ if (a_t.1 * b_t.0 - a_t.0 * b_t.1).abs() <= f64::EPSILON {
buf.push((a_p.0 as i32, a_p.1 as i32));
return;
}
@@ -61,20 +61,14 @@
let b1 = -b_t.1;
let c1 = b_p.1 - a_p.1;
- let mut x = f64::INFINITY;
- let mut y = f64::INFINITY;
-
- // Well if the determinant is not 0, then we can actuall get a intersection point.
- if (a0 * b1 - a1 * b0).abs() > f64::EPSILON {
- let u = (c0 * b1 - c1 * b0) / (a0 * b1 - a1 * b0);
-
- x = a_p.0 + u * a_t.0;
- y = a_p.1 + u * a_t.1;
- }
+ // Since the points are not collinear, the determinant is not 0, and we can get a intersection point.
+ let u = (c0 * b1 - c1 * b0) / (a0 * b1 - a1 * b0);
+ let x = a_p.0 + u * a_t.0;
+ let y = a_p.1 + u * a_t.1;
let cross_product = a_t.0 * b_t.1 - a_t.1 * b_t.0;
if (cross_product < 0.0 && d < 0.0) || (cross_product > 0.0 && d > 0.0) {
- // Then we are at the outter side of the angle, so we need to consider a cap.
+ // Then we are at the outer side of the angle, so we need to consider a cap.
let dist_square = (x - triple[1].0 as f64).powi(2) + (y - triple[1].1 as f64).powi(2);
// If the point is too far away from the line, we need to cap it.
if dist_square > d * d * 16.0 {
@@ -149,3 +143,30 @@
ret
}
+
+#[cfg(test)]
+mod test {
+ use super::*;
+
+ /// Test for regression with respect to https://github.com/plotters-rs/plotters/issues/562
+ #[test]
+ fn test_no_inf_in_compute_polygon_vertex() {
+ let path = [(335, 386), (338, 326), (340, 286)];
+ let mut buf = Vec::new();
+ compute_polygon_vertex(&path, 2.0, buf.as_mut());
+ assert!(!buf.is_empty());
+ let nani32 = f64::INFINITY as i32;
+ assert!(!buf.iter().any(|&v| v.0 == nani32 || v.1 == nani32));
+ }
+
+ /// Correct 90 degree turn to the right
+ #[test]
+ fn standard_corner() {
+ let path = [(10, 10), (20, 10), (20, 20)];
+ let mut buf = Vec::new();
+ compute_polygon_vertex(&path, 2.0, buf.as_mut());
+ assert!(!buf.is_empty());
+ let buf2 = vec![(18, 12)];
+ assert_eq!(buf, buf2);
+ }
+}
diff --git a/crates/plotters-backend/src/rasterizer/polygon.rs b/crates/plotters-backend/src/rasterizer/polygon.rs
index ce33c5c..a91baf5 100644
--- a/crates/plotters-backend/src/rasterizer/polygon.rs
+++ b/crates/plotters-backend/src/rasterizer/polygon.rs
@@ -49,7 +49,7 @@
impl PartialOrd for Edge {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
- self.get_slave_pos().partial_cmp(&other.get_slave_pos())
+ Some(self.cmp(other))
}
}
diff --git a/crates/plotters-backend/src/text.rs b/crates/plotters-backend/src/text.rs
index 16e2c66..98fe4be 100644
--- a/crates/plotters-backend/src/text.rs
+++ b/crates/plotters-backend/src/text.rs
@@ -60,9 +60,10 @@
/// ```
pub mod text_anchor {
/// The horizontal position of the anchor point relative to the text.
- #[derive(Clone, Copy)]
+ #[derive(Clone, Copy, Default)]
pub enum HPos {
/// Anchor point is on the left side of the text
+ #[default]
Left,
/// Anchor point is on the right side of the text
Right,
@@ -71,9 +72,10 @@
}
/// The vertical position of the anchor point relative to the text.
- #[derive(Clone, Copy)]
+ #[derive(Clone, Copy, Default)]
pub enum VPos {
/// Anchor point is on the top of the text
+ #[default]
Top,
/// Anchor point is in the vertical center of the text
Center,
@@ -82,7 +84,7 @@
}
/// The text anchor position.
- #[derive(Clone, Copy)]
+ #[derive(Clone, Copy, Default)]
pub struct Pos {
/// The horizontal position of the anchor point
pub h_pos: HPos,
@@ -105,22 +107,6 @@
pub fn new(h_pos: HPos, v_pos: VPos) -> Self {
Pos { h_pos, v_pos }
}
-
- /// Create a default text anchor position (top left).
- ///
- /// - **returns** The default text anchor position
- ///
- /// ```rust
- /// use plotters_backend::text_anchor::{Pos, HPos, VPos};
- ///
- /// let pos = Pos::default();
- /// ```
- pub fn default() -> Self {
- Pos {
- h_pos: HPos::Left,
- v_pos: VPos::Top,
- }
- }
}
}
@@ -201,8 +187,8 @@
/// text drawing, those font information provides instructions about how the text should be
/// rendered: color, size, slant, anchor, font, etc.
///
-/// This trait decouples the detailed implementaiton about the font and the backend code which
-/// wants to perfome some operation on the font.
+/// This trait decouples the detailed implementation about the font and the backend code which
+/// wants to perform some operation on the font.
///
pub trait BackendTextStyle {
/// The error type of this text style implementation
diff --git a/pseudo_crate/Cargo.lock b/pseudo_crate/Cargo.lock
index 8b5def0..5b50301 100644
--- a/pseudo_crate/Cargo.lock
+++ b/pseudo_crate/Cargo.lock
@@ -3967,9 +3967,9 @@
[[package]]
name = "plotters-backend"
-version = "0.3.5"
+version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609"
+checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a"
[[package]]
name = "plotters-bitmap"
diff --git a/pseudo_crate/Cargo.toml b/pseudo_crate/Cargo.toml
index 6484aad..f4f5621 100644
--- a/pseudo_crate/Cargo.toml
+++ b/pseudo_crate/Cargo.toml
@@ -246,7 +246,7 @@
pkcs1 = "=0.7.5"
pkcs8 = "=0.10.2"
plotters = "=0.3.5"
-plotters-backend = "=0.3.5"
+plotters-backend = "=0.3.7"
plotters-svg = "=0.3.5"
poll_token_derive = "=0.1.0"
ppv-lite86 = "=0.2.17"