mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-01 05:37:23 -06:00
#1007: Reverse Gradient mirrors off-centre midpoints
Reversal read the midpoints after Gradient::reverse had reordered the stops, so each stop took the wrong segment's midpoint: red-to-blue with its midpoint at 20% reversed to a 50% midpoint instead of 80%, moving the transition. Gradient::reverse now mirrors each segment's midpoint with it, so a reversed gradient is the same ramp the other way round; paint.editGradient's own (wrong) pass is gone, and the SVG importer's reflect spread, which had a correct copy of the same mirroring, uses it too. Tests: two- and three-stop gradients with off-centre midpoints sample the same reversed (t vs 1 - t) and come back after two reversals; paint.editGradient reverse turns a 0.2 midpoint into 0.8. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # ROADMAP.md
This commit is contained in:
@@ -270,13 +270,8 @@ pub(crate) fn apply_gradient_edit_in(
|
||||
gp.swatch = None;
|
||||
}
|
||||
if bool_or(p, "reverse", false) {
|
||||
// Midpoints mirrored with their segments.
|
||||
gp.gradient.reverse();
|
||||
// Midpoints belong to the segment to the right; mirror them.
|
||||
let n = gp.gradient.stops.len();
|
||||
let mids: Vec<f32> = gp.gradient.stops.iter().map(|s| s.midpoint).collect();
|
||||
for i in 0..n {
|
||||
gp.gradient.stops[i].midpoint = if i + 1 < n { 1.0 - mids[n - 2 - i] } else { 0.5 };
|
||||
}
|
||||
}
|
||||
// Angle and aspect edits keep the focal point in its place in the extent ellipse.
|
||||
let before = gp.geom;
|
||||
|
||||
Reference in New Issue
Block a user