From 82ffe3187a32bad4ecca0736882a23793a800822 Mon Sep 17 00:00:00 2001 From: Minijackson Date: Fri, 3 Feb 2023 19:59:43 +0100 Subject: add support for images, and some chores - SVG files not yet supported - Remove dead commented code - Add inherent constraints for text, path, and images - Formatting --- cairo-renderer/Cargo.toml | 1 + cairo-renderer/src/lib.rs | 43 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 5 deletions(-) (limited to 'cairo-renderer') diff --git a/cairo-renderer/Cargo.toml b/cairo-renderer/Cargo.toml index ebef7d5..53f95be 100644 --- a/cairo-renderer/Cargo.toml +++ b/cairo-renderer/Cargo.toml @@ -10,5 +10,6 @@ edition = "2021" diaphragm-core = { path = "../core" } cairo-rs = { version = "0.16", features = ["svg", "png"] } +gdk = "0.16" pango = "0.16" pangocairo = "0.16" diff --git a/cairo-renderer/src/lib.rs b/cairo-renderer/src/lib.rs index 40d24d1..5a730f4 100644 --- a/cairo-renderer/src/lib.rs +++ b/cairo-renderer/src/lib.rs @@ -1,3 +1,10 @@ +use std::{ + collections::HashMap, + path::{Path, PathBuf}, +}; + +use gdk::{gdk_pixbuf::Pixbuf, prelude::GdkContextExt}; + use diaphragm_core::{ styles::{DefinedDashStyle, Pattern}, text::{DefinedFontDescription, FontDescription}, @@ -6,6 +13,7 @@ use diaphragm_core::{ pub struct CairoRenderer { ctx: cairo::Context, + loaded_images: HashMap, } impl CairoRenderer { @@ -15,7 +23,17 @@ impl CairoRenderer { let surface = cairo::SvgSurface::for_stream(1920., 1080., std::io::sink()).unwrap(); let ctx = cairo::Context::new(&surface).unwrap(); - Self { ctx } + Self { + ctx, + loaded_images: HashMap::new(), + } + } + + fn get_image(&mut self, path: &Path) -> &Pixbuf { + let path = path.to_owned(); + self.loaded_images + .entry(path.clone()) + .or_insert_with(|| Pixbuf::from_file(path).unwrap()) } } @@ -102,9 +120,6 @@ impl Renderer for CairoRenderer { extents.width() as f64 / TEST_ABSOLUTE_SIZE, extents.height() as f64 / TEST_ABSOLUTE_SIZE, ) - - //let (width, height) = layout.get_pixel_size(); - //(width as f64, height as f64) } fn show_text(&mut self, text: &str, font: &DefinedFontDescription) { @@ -115,7 +130,25 @@ impl Renderer for CairoRenderer { layout.set_font_description(Some(&font_desc)); layout.set_markup(text); - //self.ctx.set_font_size(dbg!(font.size)); pangocairo::show_layout(&self.ctx, &layout); } + + fn show_image(&mut self, path: &Path, x: f64, y: f64, width: f64, height: f64) { + let image = self.get_image(path).clone(); + + self.ctx.save().unwrap(); + + self.ctx + .scale(width / image.width() as f64, height / image.height() as f64); + + self.ctx.set_source_pixbuf(&image, x, y); + self.ctx.paint().unwrap(); + + self.ctx.restore().unwrap(); + } + + fn geometry_for_image(&mut self, path: &Path) -> (f64, f64) { + let image = self.get_image(path); + (image.width() as f64, image.height() as f64) + } } -- cgit v1.2.3