mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-30 20:38:12 +08:00
Fix Smoothing on Close Path (#867)
This commit is contained in:
committed by
Keavon Chambers
parent
3dd9e88655
commit
89a431e084
@@ -358,10 +358,17 @@ impl ShapeEditor {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let (in_handle, out_handle) = if already_sharp {
|
let (in_handle, out_handle) = if already_sharp {
|
||||||
|
let is_closed = manipulator_groups.last().filter(|group| group.is_close()).is_some();
|
||||||
|
|
||||||
// Grab the next and previous manipulator groups by simply looking at the next / previous index
|
// Grab the next and previous manipulator groups by simply looking at the next / previous index
|
||||||
// TODO: Wrapping around on a closed path
|
let mut previous_position = index.checked_sub(1).and_then(|index| manipulator_groups.by_index(index)).and_then(|group| group.points[0].as_ref());
|
||||||
let previous_position = index.checked_sub(1).and_then(|index| manipulator_groups.by_index(index)).and_then(|group| group.points[0].as_ref());
|
let mut next_position = manipulator_groups.by_index(index + 1).and_then(|group| group.points[0].as_ref());
|
||||||
let next_position = manipulator_groups.by_index(index + 1).and_then(|group| group.points[0].as_ref());
|
|
||||||
|
// Wrapping around closed path (assuming format is point elements then a single close path)
|
||||||
|
if is_closed {
|
||||||
|
previous_position = previous_position.or_else(|| manipulator_groups.iter().nth_back(1).and_then(|group| group.points[0].as_ref()));
|
||||||
|
next_position = next_position.or_else(|| manipulator_groups.first().and_then(|group| group.points[0].as_ref()));
|
||||||
|
}
|
||||||
|
|
||||||
// To find the length of the new tangent we just take the distance to the anchor and divide by 3 (pretty arbitrary)
|
// To find the length of the new tangent we just take the distance to the anchor and divide by 3 (pretty arbitrary)
|
||||||
let length_previous = previous_position.map(|point| (point.position - anchor_position).length() / 3.);
|
let length_previous = previous_position.map(|point| (point.position - anchor_position).length() / 3.);
|
||||||
|
|||||||
@@ -616,10 +616,17 @@ impl<T: Iterator<Item = PathEl>> From<T> for Subpath {
|
|||||||
/// Create a Subpath from a [BezPath].
|
/// Create a Subpath from a [BezPath].
|
||||||
fn from(path: T) -> Self {
|
fn from(path: T) -> Self {
|
||||||
let mut subpath = Subpath::new();
|
let mut subpath = Subpath::new();
|
||||||
|
let mut closed = false;
|
||||||
for path_el in path {
|
for path_el in path {
|
||||||
|
if closed {
|
||||||
|
warn!("Verbs appear after the close path in a subpath. This will probably cause crashes.");
|
||||||
|
}
|
||||||
match path_el {
|
match path_el {
|
||||||
PathEl::MoveTo(p) => {
|
PathEl::MoveTo(p) => {
|
||||||
subpath.manipulator_groups_mut().push_end(ManipulatorGroup::new_with_anchor(kurbo_point_to_dvec2(p)));
|
subpath.manipulator_groups_mut().push_end(ManipulatorGroup::new_with_anchor(kurbo_point_to_dvec2(p)));
|
||||||
|
if !subpath.0.is_empty() {
|
||||||
|
warn!("A move to path element appears part way through a subpath. This will be treated as a line to verb.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
PathEl::LineTo(p) => {
|
PathEl::LineTo(p) => {
|
||||||
subpath.manipulator_groups_mut().push_end(ManipulatorGroup::new_with_anchor(kurbo_point_to_dvec2(p)));
|
subpath.manipulator_groups_mut().push_end(ManipulatorGroup::new_with_anchor(kurbo_point_to_dvec2(p)));
|
||||||
@@ -635,6 +642,7 @@ impl<T: Iterator<Item = PathEl>> From<T> for Subpath {
|
|||||||
}
|
}
|
||||||
PathEl::ClosePath => {
|
PathEl::ClosePath => {
|
||||||
subpath.manipulator_groups_mut().push_end(ManipulatorGroup::closed());
|
subpath.manipulator_groups_mut().push_end(ManipulatorGroup::closed());
|
||||||
|
closed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user