From d036e02bb007a6aeaff1beb12451d954a17d9b44 Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Thu, 10 Apr 2025 16:24:27 -0400 Subject: [PATCH] Fix panic when sampling across two coincident gradient stops Fixes #6162. --- .../typst-library/src/visualize/gradient.rs | 12 ++++++++ ...2-coincident-gradient-stops-export-png.png | Bin 0 -> 522 bytes tests/suite/visualize/gradient.typ | 26 ++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 tests/ref/issue-6162-coincident-gradient-stops-export-png.png diff --git a/crates/typst-library/src/visualize/gradient.rs b/crates/typst-library/src/visualize/gradient.rs index 45f388ccd..438ab66e9 100644 --- a/crates/typst-library/src/visualize/gradient.rs +++ b/crates/typst-library/src/visualize/gradient.rs @@ -1290,9 +1290,21 @@ fn sample_stops(stops: &[(Color, Ratio)], mixing_space: ColorSpace, t: f64) -> C if low == 0 { low = 1; } + if t == 1.0 { + while stops[low - 1].1 >= stops[low].1 { + low -= 1; + } + } else { + while stops[low - 1].1 >= stops[low].1 { + low += 1; + } + } let (col_0, pos_0) = stops[low - 1]; let (col_1, pos_1) = stops[low]; + debug_assert!(pos_0 < pos_1); + debug_assert!(pos_0.get() <= t); + debug_assert!(t <= pos_1.get()); let t = (t - pos_0.get()) / (pos_1.get() - pos_0.get()); Color::mix_iter( diff --git a/tests/ref/issue-6162-coincident-gradient-stops-export-png.png b/tests/ref/issue-6162-coincident-gradient-stops-export-png.png new file mode 100644 index 0000000000000000000000000000000000000000..d269342c7c6678e525f62b7d85b080e2fcfd812d GIT binary patch literal 522 zcmV+l0`>igP)ovZ+# zsQ{s;0HdS;q@e(&o&czu0IHY(td#(+k^rxc0I`bzvxoq-gaNjJ2Dp6-x_J=1brijE z7r$*A!Dt@BWFf>~BgR@L$5biFPAkesF3dnb%0NuWKv%{;VZ=Xa!as4pKX|=9e!D(| zxju@wK996Ml(IdUusxowJ)^5Vr>H%vraZ5tJhP!Zx1Kz^oIAdmJHnSc#gseAkvq(e zI?szb(ug|Mg*w=RIop3Z-h4UXcsb;CIp%RV>1{adX*lj>IPqaO^IbRgSU31nH~LLB z{YN(cK{fz)*Z)X7|5Qf*UQqvNS^sik|9flygmnLmegBk(|DBHirI-J#pZ~O||GcsP z#JT^=!vE9D|Ju|4;@tn~<^S;Q|M>PEWWQwq0044HL_t(|+U?k}4S+BVMZvHS3uOzY zVjd*+!IU&9Nax7+DtA|ZH%VHq?K}7QUq8WMFc=I5gTY`h7@QckcO|LRXRpUZHy8{C zgTY`h7z_r36T|kdB$fK?wIfDd&!_-{!C){L3