From 8469bad7487e111c8e5a0ec542f0232a0ebb4bdc Mon Sep 17 00:00:00 2001 From: Martin Haug Date: Thu, 4 Feb 2021 21:30:18 +0100 Subject: =?UTF-8?q?Add=20rectangle=20function=20=F0=9F=8E=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/export/pdf.rs | 70 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 17 deletions(-) (limited to 'src/export/pdf.rs') diff --git a/src/export/pdf.rs b/src/export/pdf.rs index 03c9ae95..7556e370 100644 --- a/src/export/pdf.rs +++ b/src/export/pdf.rs @@ -13,9 +13,10 @@ use pdf_writer::{ }; use ttf_parser::{name_id, GlyphId}; +use crate::color::Color; use crate::env::{Env, ImageResource, ResourceId}; use crate::geom::Length; -use crate::layout::{Element, Frame}; +use crate::layout::{Element, Fill, Frame, Shape}; /// Export a collection of frames into a _PDF_ document. /// @@ -57,6 +58,7 @@ impl<'a> PdfExporter<'a> { } images.insert(image.res); } + Element::Geometry(_) => {} } } } @@ -127,6 +129,56 @@ impl<'a> PdfExporter<'a> { fn write_page(&mut self, id: Ref, page: &'a Frame) { let mut content = Content::new(); + for (pos, element) in &page.elements { + match element { + Element::Image(image) => { + let name = format!("Im{}", self.images.map(image.res)); + let size = image.size; + let x = pos.x.to_pt() as f32; + let y = (page.size.height - pos.y - size.height).to_pt() as f32; + let w = size.width.to_pt() as f32; + let h = size.height.to_pt() as f32; + + content.save_state(); + content.matrix(w, 0.0, 0.0, h, x, y); + content.x_object(Name(name.as_bytes())); + content.restore_state(); + } + + Element::Geometry(geometry) => { + content.save_state(); + + match geometry.fill { + Fill::Color(Color::Rgba(c)) => { + content.fill_rgb( + c.r as f32 / 255., + c.g as f32 / 255., + c.b as f32 / 255., + ); + } + Fill::Image(_) => unimplemented!(), + } + + match &geometry.shape { + Shape::Rect(r) => { + content.rect( + pos.x.to_pt() as f32, + (page.size.height - pos.y - r.size.height).to_pt() as f32, + r.size.width.to_pt() as f32, + r.size.height.to_pt() as f32, + false, + true, + ); + } + } + + content.restore_state(); + } + + _ => {} + } + } + // We only write font switching actions when the used face changes. To // do that, we need to remember the active face. let mut face = FaceId::MAX; @@ -153,22 +205,6 @@ impl<'a> PdfExporter<'a> { drop(text); - for (pos, element) in &page.elements { - if let Element::Image(image) = element { - let name = format!("Im{}", self.images.map(image.res)); - let size = image.size; - let x = pos.x.to_pt() as f32; - let y = (page.size.height - pos.y - size.height).to_pt() as f32; - let w = size.width.to_pt() as f32; - let h = size.height.to_pt() as f32; - - content.save_state(); - content.matrix(w, 0.0, 0.0, h, x, y); - content.x_object(Name(name.as_bytes())); - content.restore_state(); - } - } - self.writer.stream(id, &content.finish()); } -- cgit v1.2.3 From 80e076814dde330fb2136172580f11e939bc6601 Mon Sep 17 00:00:00 2001 From: Martin Haug Date: Sat, 6 Feb 2021 12:30:44 +0100 Subject: =?UTF-8?q?Merge=20`rect`=20and=20`box`=20=F0=9F=A6=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/export/pdf.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'src/export/pdf.rs') diff --git a/src/export/pdf.rs b/src/export/pdf.rs index 7556e370..e5124c21 100644 --- a/src/export/pdf.rs +++ b/src/export/pdf.rs @@ -156,19 +156,19 @@ impl<'a> PdfExporter<'a> { c.b as f32 / 255., ); } - Fill::Image(_) => unimplemented!(), + Fill::Image(_) => todo!(), } + let x = pos.x.to_pt() as f32; + match &geometry.shape { Shape::Rect(r) => { - content.rect( - pos.x.to_pt() as f32, - (page.size.height - pos.y - r.size.height).to_pt() as f32, - r.size.width.to_pt() as f32, - r.size.height.to_pt() as f32, - false, - true, - ); + let w = r.width.to_pt() as f32; + let h = r.height.to_pt() as f32; + let y = (page.size.height - pos.y - r.height).to_pt() as f32; + if w > 0.0 && h > 0.0 { + content.rect(x, y, w, h, false, true); + } } } -- cgit v1.2.3