lognplot 0.1.0

Log and plot data
Documentation
use super::Canvas;
use crate::geometry::Point;
use crate::style::Color;

pub struct CairoCanvas<'a> {
    cr: &'a cairo::Context,
}

impl<'a> CairoCanvas<'a> {
    pub fn new(cr: &'a cairo::Context) -> Self {
        Self { cr }
    }
}

impl<'a> CairoCanvas<'a> {
    fn make_path(&self, points: &[Point]) {
        let (first, rest) = points.split_first().unwrap();
        self.cr.move_to(first.x(), first.y());
        for p in rest {
            self.cr.line_to(p.x(), p.y());
        }
    }
}

impl<'a> Canvas for CairoCanvas<'a> {
    fn set_pen(&mut self, color: Color) {
        self.cr.set_source_rgb(
            color.r() as f64 / 255.0,
            color.g() as f64 / 255.0,
            color.b() as f64 / 255.0,
        );
    }

    fn print_text(&mut self, p: &Point, text: &str) {
        self.cr.move_to(p.x(), p.y());
        self.cr.show_text(text);
    }

    fn draw_line(&mut self, points: &[Point]) {
        self.cr.set_line_width(3.0);
        if points.len() > 1 {
            self.make_path(points);
            self.cr.stroke();
        }
    }

    fn draw_polygon(&mut self, points: &[Point]) {
        if points.len() > 1 {
            self.make_path(points);
            self.cr.close_path();
            self.cr.stroke();
        }
    }

    fn fill_polygon(&mut self, points: &[Point]) {
        if points.len() > 1 {
            self.make_path(points);
            self.cr.close_path();
            self.cr.fill();
        }
    }
}