Tidying up
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -183,6 +183,7 @@ dependencies = [
|
|||||||
"image",
|
"image",
|
||||||
"imageproc",
|
"imageproc",
|
||||||
"rppal",
|
"rppal",
|
||||||
|
"rusttype",
|
||||||
"text_io",
|
"text_io",
|
||||||
"xml-rs",
|
"xml-rs",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -14,4 +14,6 @@ arrayref = "*"
|
|||||||
euclid = "*"
|
euclid = "*"
|
||||||
xml-rs = "0.8"
|
xml-rs = "0.8"
|
||||||
text_io = "0.1.8"
|
text_io = "0.1.8"
|
||||||
|
rusttype = "0.8.3"
|
||||||
|
serde_json = "*"
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
113
src/forms.rs
113
src/forms.rs
@@ -1,7 +1,7 @@
|
|||||||
use std::cmp;
|
use std::cmp;
|
||||||
use euclid::{Angle, Scale, Transform2D, Vector2D};
|
use euclid::{Angle, Scale, Transform2D, Vector2D};
|
||||||
use image::{Rgb, RgbImage};
|
use image::{Rgb, RgbImage};
|
||||||
use imageproc::drawing::draw_line_segment_mut;
|
use imageproc::drawing::{draw_line_segment_mut, draw_text_mut};
|
||||||
|
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::f32;
|
use std::f32;
|
||||||
@@ -10,8 +10,11 @@ use std::error::Error;
|
|||||||
|
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::BufReader;
|
use std::io::BufReader;
|
||||||
|
use std::io::Read;
|
||||||
|
use std::fs;
|
||||||
use xml::reader::{EventReader, XmlEvent};
|
use xml::reader::{EventReader, XmlEvent};
|
||||||
use euclid::Point2D;
|
use euclid::Point2D;
|
||||||
|
use rusttype::Font;
|
||||||
|
|
||||||
use text_io::scan;
|
use text_io::scan;
|
||||||
|
|
||||||
@@ -25,6 +28,80 @@ pub struct Screen {
|
|||||||
pub image : RgbImage,
|
pub image : RgbImage,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct Loader {
|
||||||
|
base_path: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Loader {
|
||||||
|
pub fn new(base_path: String) -> Loader {
|
||||||
|
Loader { base_path }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn verify_path (&mut self, path: &str) -> bool {
|
||||||
|
if path.contains("/") { return false; }
|
||||||
|
if path.contains("..") { return false; }
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_path (&mut self, path: &str) -> Option<String> {
|
||||||
|
if self.verify_path(path) {
|
||||||
|
Some(format!("{}/{}", self.base_path, path))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_file(&mut self, path: &str) -> Option<File> {
|
||||||
|
let fullpath = match self.make_path(path) {
|
||||||
|
Some(p) => p,
|
||||||
|
None => return None,
|
||||||
|
};
|
||||||
|
let metadata = match fs::metadata(&fullpath) {
|
||||||
|
Ok(m) => m,
|
||||||
|
Err(_) => return None,
|
||||||
|
};
|
||||||
|
if !metadata.is_file() { return None };
|
||||||
|
if metadata.len() > 10*1024*1024 { return None; };
|
||||||
|
let file = match File::open(fullpath) {
|
||||||
|
Ok(file) => file,
|
||||||
|
Err(_) => return None,
|
||||||
|
};
|
||||||
|
Some(file)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pub fn load_font (&mut self, path: &str) -> Option<Font> {
|
||||||
|
let mut file = match self.make_file(path) {
|
||||||
|
Some(f) => f,
|
||||||
|
None => return None,
|
||||||
|
};
|
||||||
|
let mut data = Vec::new();
|
||||||
|
if file.read_to_end(&mut data).is_err() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
let font = match Font::from_bytes(data) {
|
||||||
|
Ok(data) => data,
|
||||||
|
Err(_) => return None,
|
||||||
|
};
|
||||||
|
Some(font)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn load_form(&mut self, path: &str) -> Option<Form> {
|
||||||
|
let mut file = match self.make_file(path) {
|
||||||
|
Some(f) => f,
|
||||||
|
None => return None,
|
||||||
|
};
|
||||||
|
match Form::load(file) {
|
||||||
|
Ok(f) => Some(f),
|
||||||
|
Err(_) => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
impl Screen {
|
impl Screen {
|
||||||
pub fn new (width: u32, height: u32) -> Screen {
|
pub fn new (width: u32, height: u32) -> Screen {
|
||||||
let image = RgbImage::new(width, height);
|
let image = RgbImage::new(width, height);
|
||||||
@@ -48,11 +125,6 @@ impl Screen {
|
|||||||
}
|
}
|
||||||
last = pn;
|
last = pn;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
let p0 = screen_points[indices[0] as usize].to_tuple();
|
|
||||||
let p1 = screen_points[indices[1] as usize].to_tuple();
|
|
||||||
draw_line_segment_mut(&mut self.image, p0, p1, Rgb([*r, *g, *b]));
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,10 +155,9 @@ pub struct Form {
|
|||||||
impl Form {
|
impl Form {
|
||||||
|
|
||||||
|
|
||||||
pub fn load (filename: &str) -> Result<Form, Box<dyn Error>> {
|
pub fn load (file: File) -> Result<Form, Box<dyn Error>> {
|
||||||
let file = File::open(filename)?;
|
let reader = BufReader::new(file);
|
||||||
let file = BufReader::new(file);
|
let parser = EventReader::new(reader);
|
||||||
let parser = EventReader::new(file);
|
|
||||||
let mut points = Vec::new(); // rust compiler will figure out types :-) neat
|
let mut points = Vec::new(); // rust compiler will figure out types :-) neat
|
||||||
let mut lines = Vec::new();
|
let mut lines = Vec::new();
|
||||||
|
|
||||||
@@ -134,7 +205,7 @@ impl Form {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
println!("Error parsing file '{}': {}", filename, e);
|
println!("Error parsing file {}", e);
|
||||||
break;
|
break;
|
||||||
},
|
},
|
||||||
_ => {}
|
_ => {}
|
||||||
@@ -145,23 +216,3 @@ impl Form {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// load the compass rose
|
|
||||||
pub fn load_compass_rose () -> Form {
|
|
||||||
let form = Form::load("/root/forms/compass-rose.svg").unwrap();
|
|
||||||
form
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn load_boat () -> Form {
|
|
||||||
let form = Form::load("/root/forms/boat.svg").unwrap();
|
|
||||||
form
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn load_cog () -> Form {
|
|
||||||
let form = Form::load("/root/forms/cog.svg").unwrap();
|
|
||||||
form
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn load_wind () -> Form {
|
|
||||||
let form = Form::load("/root/forms/wind.svg").unwrap();
|
|
||||||
form
|
|
||||||
}
|
|
||||||
|
|||||||
10
src/main.rs
10
src/main.rs
@@ -19,10 +19,12 @@ mod forms;
|
|||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
|
||||||
let mut screen = forms::Screen::new(200, 200);
|
let mut screen = forms::Screen::new(200, 200);
|
||||||
let c = forms::load_compass_rose();
|
let mut loader = forms::Loader::new("/root/helms-display".to_string());
|
||||||
let b = forms::load_boat();
|
let c = loader.load_form("compass-rose.svg").unwrap();
|
||||||
let cog = forms::load_cog();
|
let b = loader.load_form("boat.svg").unwrap();
|
||||||
let wind = forms::load_wind();
|
let cog = loader.load_form("cog.svg").unwrap();
|
||||||
|
let wind = loader.load_form("wind.svg").unwrap();
|
||||||
|
let font = loader.load_font("font.ttf").unwrap();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
let mut img = RgbImage::new(480, 320);
|
let mut img = RgbImage::new(480, 320);
|
||||||
|
|||||||
Reference in New Issue
Block a user