Skip to content

Commit 83b38e4

Browse files
committed
fix: printing, formatting
1 parent 636c336 commit 83b38e4

File tree

4 files changed

+71
-83
lines changed

4 files changed

+71
-83
lines changed

src/render.rs

+32-21
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,8 @@ impl Renderer {
175175
let rtree =
176176
usvg::Tree::from_data(svg.svg_data.as_bytes(), &self.usvg_options.to_ref())?;
177177

178-
resvg::render(
179-
&rtree,
180-
usvg::FitTo::Zoom(zoom as f32),
181-
pixmap.as_mut(),
182-
)
183-
.ok_or_else(|| anyhow::Error::msg("resvg::render failed in gen_image_resvg."))?;
178+
resvg::render(&rtree, usvg::FitTo::Zoom(zoom as f32), pixmap.as_mut())
179+
.ok_or_else(|| anyhow::Error::msg("resvg::render failed in gen_image_resvg."))?;
184180
}
185181

186182
let bytes = pixmap.data();
@@ -268,6 +264,34 @@ pub fn rendernode_to_texture(
268264
Ok(None)
269265
}
270266

267+
pub fn draw_svgs_to_cairo_context(
268+
zoom: f64,
269+
svgs: &[Svg],
270+
cx: &cairo::Context,
271+
) -> Result<(), anyhow::Error> {
272+
for svg in svgs {
273+
let stream =
274+
gio::MemoryInputStream::from_bytes(&glib::Bytes::from(svg.svg_data.as_bytes()));
275+
276+
let librsvg_handle = librsvg::Loader::new()
277+
.read_stream::<gio::MemoryInputStream, gio::File, gio::Cancellable>(
278+
&stream, None, None,
279+
)?;
280+
281+
let librsvg_renderer = librsvg::CairoRenderer::new(&librsvg_handle);
282+
librsvg_renderer.render_document(
283+
&cx,
284+
&cairo::Rectangle {
285+
x: (svg.bounds.mins[0].floor() * zoom),
286+
y: (svg.bounds.mins[1].floor() * zoom),
287+
width: ((svg.bounds.extents()[0]).ceil() * zoom),
288+
height: ((svg.bounds.extents()[1]).ceil() * zoom),
289+
},
290+
)?;
291+
}
292+
293+
Ok(())
294+
}
271295
#[allow(dead_code)]
272296
fn gen_caironode_librsvg(zoom: f64, svg: &Svg) -> Result<gsk::CairoNode, anyhow::Error> {
273297
if svg.bounds.extents()[0] < 0.0 || svg.bounds.extents()[1] < 0.0 {
@@ -288,20 +312,7 @@ fn gen_caironode_librsvg(zoom: f64, svg: &Svg) -> Result<gsk::CairoNode, anyhow:
288312
.draw_context()
289313
.context("failed to get cairo draw_context() from new_caironode")?;
290314

291-
let stream = gio::MemoryInputStream::from_bytes(&glib::Bytes::from(svg.svg_data.as_bytes()));
292-
293-
let librsvg_handle = librsvg::Loader::new()
294-
.read_stream::<gio::MemoryInputStream, gio::File, gio::Cancellable>(&stream, None, None)?;
295-
296-
let librsvg_renderer = librsvg::CairoRenderer::new(&librsvg_handle);
297-
librsvg_renderer.render_document(
298-
&cx,
299-
&cairo::Rectangle {
300-
x: (svg.bounds.mins[0].floor() * zoom),
301-
y: (svg.bounds.mins[1].floor() * zoom),
302-
width: ((svg.bounds.extents()[0]).ceil() * zoom),
303-
height: ((svg.bounds.extents()[1]).ceil() * zoom),
304-
},
305-
)?;
315+
draw_svgs_to_cairo_context(zoom, &vec![svg.to_owned()], &cx)?;
316+
306317
Ok(new_caironode)
307318
}

src/strokes/bitmapimage.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::io;
22

3-
use crate::{compose, render, geometry};
3+
use crate::{compose, geometry, render};
44
use anyhow::Context;
55
use image::{io::Reader, GenericImageView};
66
use serde::{Deserialize, Serialize};

src/strokes/vectorimage.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::path::Path;
22

3-
use crate::{compose, render, geometry};
3+
use crate::{compose, geometry, render};
44

55
use anyhow::Context;
66
use serde::{Deserialize, Serialize};

src/ui/actions.rs

+37-60
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::{
99
};
1010
use gtk4::{
1111
gdk, gio, glib, glib::clone, prelude::*, ArrowType, CornerType, PackType, PositionType,
12-
PrintOperation, PrintOperationAction, Snapshot, Unit,
12+
PrintOperation, PrintOperationAction, Unit,
1313
};
1414

1515
/* Actions follow this principle:
@@ -558,77 +558,54 @@ pub fn setup_actions(appwindow: &RnoteAppWindow) {
558558
.allow_async(true)
559559
.build();
560560

561-
/* print_op.connect_begin_print(clone!(@weak appwindow => move |print_op, print_cx| {
562-
print_op.set_n_pages(appwindow.canvas().sheet().calc_n_pages());
563-
})); */
564-
565-
print_op.connect_draw_page(clone!(@weak appwindow => move |_print_op, print_cx, page_nr| {
566-
let cx = match print_cx.cairo_context() {
567-
None => {
568-
log::error!("failed to get cairo context in print_op.connect_draw_page().");
569-
return;
570-
}
571-
Some(cx) => { cx }
572-
};
573-
574-
let (margin_top, margin_bottom, margin_left, margin_right) = print_cx.hard_margins().unwrap_or( (0.0, 0.0, 0.0, 0.0) );
575-
576-
let width_scale = (print_cx.width() + margin_left + margin_right) / f64::from(appwindow.canvas().sheet().format().width());
577-
let height_scale = (print_cx.height() + margin_top + margin_bottom) / f64::from(appwindow.canvas().sheet().format().height());
578-
let print_zoom = width_scale.min(height_scale);
579-
let y_offset = - (f64::from(page_nr * appwindow.canvas().sheet().format().height()) * print_zoom);
580-
581-
let snapshot = Snapshot::new();
582-
583-
let format_bounds_scaled = p2d::bounding_volume::AABB::new(
584-
na::point![0.0, 0.0],
585-
na::point![f64::from(appwindow.canvas().sheet().format().width()) * print_zoom,f64::from(appwindow.canvas().sheet().format().height()) * print_zoom]
586-
);
587-
let sheet_bounds= p2d::bounding_volume::AABB::new(
588-
na::point![0.0, 0.0],
589-
na::point![
590-
f64::from(appwindow.canvas().sheet().width()),
591-
f64::from(appwindow.canvas().sheet().height())
592-
]
593-
);
594-
561+
let sheet_bounds= appwindow.canvas().sheet().bounds();
595562
match appwindow.canvas().sheet().gen_svg() {
596563
Ok(svg_data) => {
597564
let svg = render::Svg {
598565
bounds: sheet_bounds,
599566
svg_data,
600567
};
568+
print_op.connect_draw_page(clone!(@weak appwindow => move |_print_op, print_cx, page_nr| {
569+
let cx = match print_cx.cairo_context() {
570+
None => {
571+
log::error!("failed to get cairo context in print_op.connect_draw_page().");
572+
return;
573+
}
574+
Some(cx) => { cx }
575+
};
576+
577+
let (margin_top, margin_bottom, margin_left, margin_right) = print_cx.hard_margins().unwrap_or( (0.0, 0.0, 0.0, 0.0) );
578+
579+
let width_scale = (print_cx.width() + margin_left + margin_right) / f64::from(appwindow.canvas().sheet().format().width());
580+
let height_scale = (print_cx.height() + margin_top + margin_bottom) / f64::from(appwindow.canvas().sheet().format().height());
581+
let print_zoom = width_scale.min(height_scale);
582+
let y_offset = - (f64::from(page_nr * appwindow.canvas().sheet().format().height()) * print_zoom);
583+
584+
let format_bounds_scaled = p2d::bounding_volume::AABB::new(
585+
na::point![0.0, 0.0],
586+
na::point![f64::from(appwindow.canvas().sheet().format().width()) * print_zoom,f64::from(appwindow.canvas().sheet().format().height()) * print_zoom]
587+
);
588+
589+
cx.rectangle(
590+
format_bounds_scaled.mins[0],
591+
format_bounds_scaled.mins[1],
592+
format_bounds_scaled.extents()[0],
593+
format_bounds_scaled.extents()[1]
594+
);
595+
cx.clip();
596+
cx.translate(0.0, y_offset);
597+
598+
if let Err(e) = render::draw_svgs_to_cairo_context(print_zoom, &vec![svg.clone()], &cx) {
599+
log::error!("render::draw_svgs_to_cairo_context() failed in draw_page() callback while printing page: {}, {}", page_nr, e);
601600

602-
match appwindow.canvas().sheet().strokes_state().borrow().renderer.read().unwrap().gen_image(print_zoom, &vec![svg], sheet_bounds) {
603-
Ok(image) => {
604-
snapshot.append_node(&render::image_to_rendernode(&image, print_zoom));
605601
}
606-
Err(e) => {
607-
log::error!("renderer.gen_rendernode() failed in draw_page() callback while printing page: {}, {}", page_nr, e);
608-
}
609-
}
610-
},
602+
}));
603+
},
611604
Err(e) => {
612-
log::error!("gen_svg() failed in draw_page() callback while printing page: {}, {}", page_nr, e);
605+
log::error!("gen_svg() failed in print-sheet action with Err {}", e);
613606
}
614607
}
615608

616-
cx.rectangle(
617-
format_bounds_scaled.mins[0],
618-
format_bounds_scaled.mins[1],
619-
format_bounds_scaled.extents()[0],
620-
format_bounds_scaled.extents()[1]
621-
);
622-
cx.clip();
623-
cx.translate(0.0, y_offset);
624-
625-
if let Some(node) = snapshot.to_node() {
626-
node.draw(&cx);
627-
} else {
628-
log::error!("snapshot.to_node() for created snapshot while printing page: {}", page_nr);
629-
};
630-
}));
631-
632609
if let Err(e) = print_op.run(PrintOperationAction::PrintDialog, Some(&appwindow)){
633610
log::error!("print_op.run() failed with Err, {}", e);
634611
};

0 commit comments

Comments
 (0)