summaryrefslogtreecommitdiff
path: root/src/export/render.rs
diff options
context:
space:
mode:
authorMartin Haug <mhaug@live.de>2022-04-30 21:59:34 +0200
committerMartin Haug <mhaug@live.de>2022-05-01 11:50:34 +0200
commit5f1499d380e223e7e1b2a8a96eb99e3ec95a56ac (patch)
tree44945bc35618c9ce10380016200309e42c2b5ed4 /src/export/render.rs
parentf9e115daf54c29358f890b137f50a33a781af680 (diff)
Add round corners and change arguments
Diffstat (limited to 'src/export/render.rs')
-rw-r--r--src/export/render.rs38
1 files changed, 25 insertions, 13 deletions
diff --git a/src/export/render.rs b/src/export/render.rs
index c3b92d31..9c674acb 100644
--- a/src/export/render.rs
+++ b/src/export/render.rs
@@ -8,8 +8,9 @@ use ttf_parser::{GlyphId, OutlineBuilder};
use usvg::FitTo;
use crate::frame::{Element, Frame, Geometry, Group, Shape, Text};
-use crate::geom::{self, Length, Paint, PathElement, Size, Stroke, Transform};
+use crate::geom::{self, Length, Paint, PathElement, Sides, Size, Stroke, Transform};
use crate::image::{Image, RasterImage, Svg};
+use crate::library::prelude::{rect_path, rect_paths};
use crate::Context;
/// Export a frame into a rendered image.
@@ -298,12 +299,7 @@ fn render_shape(
shape: &Shape,
) -> Option<()> {
let path = match shape.geometry {
- Geometry::Rect(size) => {
- let w = size.x.to_f32();
- let h = size.y.to_f32();
- let rect = sk::Rect::from_xywh(0.0, 0.0, w, h)?;
- sk::PathBuilder::from_rect(rect)
- }
+ Geometry::Rect(size, radius) => convert_path(&rect_path(size, radius))?,
Geometry::Ellipse(size) => convert_path(&geom::Path::ellipse(size))?,
Geometry::Line(target) => {
let mut builder = sk::PathBuilder::new();
@@ -315,7 +311,7 @@ fn render_shape(
if let Some(fill) = shape.fill {
let mut paint: sk::Paint = fill.into();
- if matches!(shape.geometry, Geometry::Rect(_)) {
+ if matches!(shape.geometry, Geometry::Rect(_, _)) {
paint.anti_alias = false;
}
@@ -323,11 +319,27 @@ fn render_shape(
canvas.fill_path(&path, &paint, rule, ts, mask);
}
- if let Some(Stroke { paint, thickness }) = shape.stroke {
- let paint = paint.into();
- let mut stroke = sk::Stroke::default();
- stroke.width = thickness.to_f32();
- canvas.stroke_path(&path, &paint, &stroke, ts, mask);
+ if shape.stroke.is_uniform() || !matches!(shape.geometry, Geometry::Rect(_, _)) {
+ if let Some(Stroke { paint, thickness }) = shape.stroke.top {
+ let paint = paint.into();
+ let mut stroke = sk::Stroke::default();
+ stroke.width = thickness.to_f32();
+ canvas.stroke_path(&path, &paint, &stroke, ts, mask);
+ }
+ } else {
+ if let Geometry::Rect(size, radius) = shape.geometry {
+ for (path, stroke) in rect_paths(size, radius, Some(shape.stroke)) {
+ if let Some(stroke) = stroke {
+ render_shape(canvas, ts, mask, &Shape {
+ geometry: Geometry::Path(path),
+ fill: None,
+ stroke: Sides::splat(Some(stroke)),
+ })?;
+ } else {
+ continue;
+ }
+ }
+ }
}
Some(())