in src/ras.rs [556:605]
fn remove_obtuse_angle(outline: &Outline) -> Outline {
let mut segments: Vec<Segment> = vec![];
let mut head_index: usize = 0;
for contour in outline.contours() {
for (index, segment) in contour
.iter(ContourIterFlags::IGNORE_CLOSE_SEGMENT)
.enumerate()
{
if index == 0 {
head_index = segments.len();
segments.push(Segment {
baseline: segment.baseline,
ctrl: segment.ctrl,
kind: SegmentKind::None,
flags: SegmentFlags::FIRST_IN_SUBPATH,
});
}
let from = segment.baseline.from();
let to = segment.baseline.to();
if segment.is_quadratic() {
let ctrl = segment.ctrl.from();
let d = segment.baseline.square_length().sqrt();
let d1 = calc_distance(ctrl, from);
let d2 = calc_distance(ctrl, to);
if d1 <= 10.0 || d2 <= 10.0 {
let mut cos = (d1 * d1 + d * d - d2 * d2) / 2.0 * d1 * d;
if cos > 0.0 {
cos = (d2 * d2 + d * d - d1 * d1) / 2.0 * d2 * d;
}
if cos <= 0.0 {
segments.push(Segment::line(LineSegment2F::new(from, to)));
continue;
}
}
}
if segment.is_cubic() {
// TODO
}
segments.push(segment)
}
let mut last_seg = segments.last().unwrap().clone();
let first_seg_pos = segments[head_index].baseline.from();
if last_seg.kind == SegmentKind::Line && first_seg_pos == last_seg.baseline.to() {
segments.pop();
}
last_seg.flags = SegmentFlags::CLOSES_SUBPATH;
segments.push(last_seg);
}
Outline::from_segments(segments.into_iter())
}