diff --git a/src/export/render.rs b/src/export/render.rs index b3a8f5ce8..fa7c94548 100644 --- a/src/export/render.rs +++ b/src/export/render.rs @@ -402,28 +402,33 @@ fn render_shape( miter_limit, }) = &shape.stroke { - let dash = dash_pattern.as_ref().and_then(|pattern| { - // tiny-skia only allows dash patterns with an even number of elements, - // while pdf allows any number. - let len = if pattern.array.len() % 2 == 1 { - pattern.array.len() * 2 - } else { - pattern.array.len() - }; - let dash_array = - pattern.array.iter().map(|l| l.to_f32()).cycle().take(len).collect(); + let width = thickness.to_f32(); - sk::StrokeDash::new(dash_array, pattern.phase.to_f32()) - }); - let paint = paint.into(); - let stroke = sk::Stroke { - width: thickness.to_f32(), - line_cap: line_cap.into(), - line_join: line_join.into(), - dash, - miter_limit: miter_limit.0 as f32, - }; - canvas.stroke_path(&path, &paint, &stroke, ts, mask); + // Don't draw zero-pt stroke. + if width > 0.0 { + let dash = dash_pattern.as_ref().and_then(|pattern| { + // tiny-skia only allows dash patterns with an even number of elements, + // while pdf allows any number. + let len = if pattern.array.len() % 2 == 1 { + pattern.array.len() * 2 + } else { + pattern.array.len() + }; + let dash_array = + pattern.array.iter().map(|l| l.to_f32()).cycle().take(len).collect(); + + sk::StrokeDash::new(dash_array, pattern.phase.to_f32()) + }); + let paint = paint.into(); + let stroke = sk::Stroke { + width, + line_cap: line_cap.into(), + line_join: line_join.into(), + dash, + miter_limit: miter_limit.0 as f32, + }; + canvas.stroke_path(&path, &paint, &stroke, ts, mask); + } } Some(()) diff --git a/tests/ref/visualize/stroke.png b/tests/ref/visualize/stroke.png index 312eabec6..1c8870703 100644 Binary files a/tests/ref/visualize/stroke.png and b/tests/ref/visualize/stroke.png differ diff --git a/tests/typ/visualize/stroke.typ b/tests/typ/visualize/stroke.typ index 2443d27a9..60733d783 100644 --- a/tests/typ/visualize/stroke.typ +++ b/tests/typ/visualize/stroke.typ @@ -69,3 +69,36 @@ // Error: 29-55 expected "solid", "dotted", "densely-dotted", "loosely-dotted", "dashed", "densely-dashed", "loosely-dashed", "dashdotted", "densely-dashdotted", "loosely-dashdotted", array, dictionary, dash pattern, or none #line(length: 60pt, stroke: (color: red, dash: "dash")) + +--- +// 0pt strokes must function exactly like 'none' strokes and not draw anything +#rect(width: 10pt, height: 10pt, stroke: none) +#rect(width: 10pt, height: 10pt, stroke: 0pt) + +#rect(width: 10pt, height: 10pt, stroke: none, fill: blue) +#rect(width: 10pt, height: 10pt, stroke: 0pt + red, fill: blue) + +#line(length: 30pt, stroke: 0pt) +#line(length: 30pt, stroke: (color: red, thickness: 0pt, dash: ("dot", 1pt))) + +#table(columns: 2, stroke: none)[A][B] +#table(columns: 2, stroke: 0pt)[A][B] + +#path( + fill: red, + stroke: none, + closed: true, + ((0%, 0%), (4%, -4%)), + ((50%, 50%), (4%, -4%)), + ((0%, 50%), (4%, 4%)), + ((50%, 0%), (4%, 4%)), +) +#path( + fill: red, + stroke: 0pt, + closed: true, + ((0%, 0%), (4%, -4%)), + ((50%, 50%), (4%, -4%)), + ((0%, 50%), (4%, 4%)), + ((50%, 0%), (4%, 4%)), +)