From e9a0cf97419b3c7dac0ab74566a921ba255ead37 Mon Sep 17 00:00:00 2001 From: Pg Biel <9021226+PgBiel@users.noreply.github.com> Date: Sun, 23 Apr 2023 09:38:12 -0300 Subject: [PATCH] Fix 0pt strokes (#923) --- src/export/render.rs | 47 ++++++++++++++++++--------------- tests/ref/visualize/stroke.png | Bin 14835 -> 4382 bytes tests/typ/visualize/stroke.typ | 33 +++++++++++++++++++++++ 3 files changed, 59 insertions(+), 21 deletions(-) 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 312eabec6cee138becbf888d8cac12d61eb99db4..1c887070347137b8433725fab820444605764ef3 100644 GIT binary patch literal 4382 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 L%nb{%&f)(BR8Px{ literal 14835 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π-*WVq6N^1z?u{W?LFzBJe(aB~ZK?-JMv1fOur}^jU@*>4u*<9| zl|PY-w7(?9F$Ue!eQfTMH7?!ZB5k)M)`jvYC|>^@V?~B3KSsToZ_mEFg#Eo!DPu+F zi2{JuYXI}QjF;9~$Wv%@!B+zM34aV$G$1jRqb2Ucb-G8=c zT%G_rNwxIH07{|-JZFq8(wlo(S{}prnS_u$kLfTUS9^!&bz$kn{vc&Ix{PEm5aPaw zd$B^|w^zI>ZRL;)9Mhh-OJ>@(T6YFwf2IG#Je$_PZEQZgk07cWsvuigOFd1lOi(cq#aw++H?NiAQJ4N0~cJjOcQ3=mEK31 z0|ve-n}XA-M)}GI*Dg3E(g?xTTj zr|^Xzo#;}KJ-)MQrqv32vgDYNju5BsT z$Q28t6z33Di~6#y@J2FoyQ6)o;ryhbtUc#KmiF>!(AN6Le3*QPM4uaj$ST@W$L!}` z<_Y>0?Ijt7?DGkumgh}HJk2XNk3Oq%;7?iVSMYtv6Zwe)#Jgr^0uQODqeHsiR`~Md z+s0up^1x8P8pC_x(z)Ven0P*t-9uN^mPFx=0SfcO2fCOy7mD}fQ)q{z&=;fS+K)V3 zYS0cGYZ!SlR9~lR68Y%hn(FNKt?_5Gxvx=t_*43w_MZ&AyRgyOdo1P)F_*jVh_TvI zPi?nT^2dekf%C6j?3YVUvC=+n4~(Pd32)S@wR5+`%l9(l8Py~2@M)KNj$p?&C3~-9 zcFf+fpQm+y5Dvh{lD97B_>0~y37o038m;aEscLg1If0jCcfZc$W1H_Tnz+-Ip~yw6 z48PjA%_B~}nvqW`ltz1=+k19)`(_W>Oy#}qmqj{KCvmrmXAC2{{p*rVXT4rUc{&wz zpJE=tFlyaic3K1`+F{3%t<0soqNzO;H4{JlV82%HtQCF9G-T*DF23p7LUC5{0flgP z(LPk?4u<+Dp-oG8&iEJ6k!RXVX*2+|2)i@QjRBa(kU5#|eC;{8?s)CP81_f>oARFu zE;+hWebq34BgUql9zdq2TT}KaugSa2k92gKv+CVK3^MldsI@<4|LQ^p9wI$xKwS6U zNVJ*jIQOWocV>|Wx`EjZK9mIOFFM#K0m)|VVo-59Eo*+mC$WQNM@tL&ksn$=J4&J& zqQE5J_;j=l)CDG|#X|g|WQod#0ni~2q+Pp=^V|(j0NRw5!GsQreq}7eq1Sf-j7ggF zvb2<2QnrGIUG||^GrA4DD`;yBFF>msf(6G+_N3u*;jTZ$aJ=9MKam}D`<$1Zc0q18 zE60erd-q?uj6k`sYZ~}iGY}nu1|PBQMmnb73hgJ{Lx7IFa?2qJR1Ek|Ty}5#_m_-t k(f>BWauP(ELrWnBti%ruUGCt&I1z{gdrkDSbsaAMKZdc(asU7T 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%)), +)