summaryrefslogtreecommitdiff
path: root/src/export/render.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-09-19 17:44:40 +0200
committerLaurenz <laurmaedje@gmail.com>2022-09-19 17:44:40 +0200
commite29f55bb294cc298daad97accf6d8a76976b409c (patch)
treecc4db3b61fa23e13f781e992c63427d36e77ef8c /src/export/render.rs
parent59f67b79c7ff50f0bc9a27373d0fa36d1523e08a (diff)
Remove font store
Diffstat (limited to 'src/export/render.rs')
-rw-r--r--src/export/render.rs39
1 files changed, 14 insertions, 25 deletions
diff --git a/src/export/render.rs b/src/export/render.rs
index 688cf979..bf735ded 100644
--- a/src/export/render.rs
+++ b/src/export/render.rs
@@ -13,7 +13,6 @@ use crate::geom::{
self, Geometry, Length, Paint, PathElement, Shape, Size, Stroke, Transform,
};
use crate::image::{DecodedImage, Image};
-use crate::Context;
/// Export a frame into a rendered image.
///
@@ -22,7 +21,7 @@ use crate::Context;
///
/// In addition to the frame, you need to pass in the context used during
/// compilation so that fonts and images can be rendered.
-pub fn render(ctx: &Context, frame: &Frame, pixel_per_pt: f32) -> sk::Pixmap {
+pub fn render(frame: &Frame, pixel_per_pt: f32) -> sk::Pixmap {
let size = frame.size();
let pxw = (pixel_per_pt * size.x.to_f32()).round().max(1.0) as u32;
let pxh = (pixel_per_pt * size.y.to_f32()).round().max(1.0) as u32;
@@ -31,7 +30,7 @@ pub fn render(ctx: &Context, frame: &Frame, pixel_per_pt: f32) -> sk::Pixmap {
canvas.fill(sk::Color::WHITE);
let ts = sk::Transform::from_scale(pixel_per_pt, pixel_per_pt);
- render_frame(&mut canvas, ts, None, ctx, frame);
+ render_frame(&mut canvas, ts, None, frame);
canvas
}
@@ -41,7 +40,6 @@ fn render_frame(
canvas: &mut sk::Pixmap,
ts: sk::Transform,
mask: Option<&sk::ClipMask>,
- ctx: &Context,
frame: &Frame,
) {
for (pos, element) in frame.elements() {
@@ -51,10 +49,10 @@ fn render_frame(
match element {
Element::Group(group) => {
- render_group(canvas, ts, mask, ctx, group);
+ render_group(canvas, ts, mask, group);
}
Element::Text(text) => {
- render_text(canvas, ts, mask, ctx, text);
+ render_text(canvas, ts, mask, text);
}
Element::Shape(shape) => {
render_shape(canvas, ts, mask, shape);
@@ -72,7 +70,6 @@ fn render_group(
canvas: &mut sk::Pixmap,
ts: sk::Transform,
mask: Option<&sk::ClipMask>,
- ctx: &Context,
group: &Group,
) {
let ts = ts.pre_concat(group.transform.into());
@@ -107,7 +104,7 @@ fn render_group(
}
}
- render_frame(canvas, ts, mask, ctx, &group.frame);
+ render_frame(canvas, ts, mask, &group.frame);
}
/// Render a text run into the canvas.
@@ -115,7 +112,6 @@ fn render_text(
canvas: &mut sk::Pixmap,
ts: sk::Transform,
mask: Option<&sk::ClipMask>,
- ctx: &Context,
text: &Text,
) {
let mut x = 0.0;
@@ -124,9 +120,9 @@ fn render_text(
let offset = x + glyph.x_offset.at(text.size).to_f32();
let ts = ts.pre_translate(offset, 0.0);
- render_svg_glyph(canvas, ts, mask, ctx, text, id)
- .or_else(|| render_bitmap_glyph(canvas, ts, mask, ctx, text, id))
- .or_else(|| render_outline_glyph(canvas, ts, mask, ctx, text, id));
+ render_svg_glyph(canvas, ts, mask, text, id)
+ .or_else(|| render_bitmap_glyph(canvas, ts, mask, text, id))
+ .or_else(|| render_outline_glyph(canvas, ts, mask, text, id));
x += glyph.x_advance.at(text.size).to_f32();
}
@@ -137,12 +133,10 @@ fn render_svg_glyph(
canvas: &mut sk::Pixmap,
ts: sk::Transform,
_: Option<&sk::ClipMask>,
- ctx: &Context,
text: &Text,
id: GlyphId,
) -> Option<()> {
- let font = ctx.fonts.get(text.font_id);
- let mut data = font.ttf().glyph_svg_image(id)?;
+ let mut data = text.font.ttf().glyph_svg_image(id)?;
// Decompress SVGZ.
let mut decoded = vec![];
@@ -164,7 +158,7 @@ fn render_svg_glyph(
// If there's no viewbox defined, use the em square for our scale
// transformation ...
- let upem = font.units_per_em() as f32;
+ let upem = text.font.units_per_em() as f32;
let (mut width, mut height) = (upem, upem);
// ... but if there's a viewbox or width, use that.
@@ -188,14 +182,12 @@ fn render_bitmap_glyph(
canvas: &mut sk::Pixmap,
ts: sk::Transform,
mask: Option<&sk::ClipMask>,
- ctx: &Context,
text: &Text,
id: GlyphId,
) -> Option<()> {
let size = text.size.to_f32();
let ppem = size * ts.sy;
- let font = ctx.fonts.get(text.font_id);
- let raster = font.ttf().glyph_raster_image(id, ppem as u16)?;
+ let raster = text.font.ttf().glyph_raster_image(id, ppem as u16)?;
let ext = match raster.format {
ttf_parser::RasterImageFormat::PNG => "png",
};
@@ -217,7 +209,6 @@ fn render_outline_glyph(
canvas: &mut sk::Pixmap,
ts: sk::Transform,
mask: Option<&sk::ClipMask>,
- ctx: &Context,
text: &Text,
id: GlyphId,
) -> Option<()> {
@@ -227,10 +218,9 @@ fn render_outline_glyph(
// rasterization can't be used due to very large text size or weird
// scale/skewing transforms.
if ppem > 100.0 || ts.kx != 0.0 || ts.ky != 0.0 || ts.sx != ts.sy {
- let font = ctx.fonts.get(text.font_id);
let path = {
let mut builder = WrappedPathBuilder(sk::PathBuilder::new());
- font.ttf().outline_glyph(id, &mut builder)?;
+ text.font.ttf().outline_glyph(id, &mut builder)?;
builder.0.finish()?
};
@@ -239,7 +229,7 @@ fn render_outline_glyph(
// Flip vertically because font design coordinate
// system is Y-up.
- let scale = text.size.to_f32() / font.units_per_em() as f32;
+ let scale = text.size.to_f32() / text.font.units_per_em() as f32;
let ts = ts.pre_scale(scale, -scale);
canvas.fill_path(&path, &paint, rule, ts, mask)?;
return Some(());
@@ -248,9 +238,8 @@ fn render_outline_glyph(
// Rasterize the glyph with `pixglyph`.
// Try to retrieve a prepared glyph or prepare it from scratch if it
// doesn't exist, yet.
- let glyph = pixglyph::Glyph::load(ctx.fonts.get(text.font_id).ttf(), id)?;
+ let glyph = pixglyph::Glyph::load(text.font.ttf(), id)?;
let bitmap = glyph.rasterize(ts.tx, ts.ty, ppem);
-
let cw = canvas.width() as i32;
let ch = canvas.height() as i32;
let mw = bitmap.width as i32;