mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-14 19:27:05 -04:00
Never crash: raster and path crates without expect()/unwrap()/unreachable!()
raster: the inpainting pyramid stops at a missing level, and video inpainting falls back to a plain patch fill if the previous frame is missing, instead of expect(). path: curve fitting of an empty point list returns a degenerate cubic instead of indexing/unwrapping, and Merge Paths no longer has an unreachable!() arm. Denies the panic lints in both crates. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
10644a83aa
commit
786e4e8b97
6 files changed
+17
-5
No files matched your search
@@ -0,0 +1,4 @@
|
||||
allow-unwrap-in-tests = true
|
||||
allow-expect-in-tests = true
|
||||
allow-panic-in-tests = true
|
||||
allow-indexing-slicing-in-tests = true
|
||||
@@ -72,8 +72,7 @@ fn bern(t: f64) -> [f64; 4] {
|
||||
|
||||
/// Solve the 2x2 normal equations for the handle lengths along the fixed tangents.
|
||||
fn generate(pts: &[Point], u: &[f64], t0: Vec2, t1: Vec2) -> CubicBez {
|
||||
let p0 = pts[0];
|
||||
let p3 = *pts.last().unwrap();
|
||||
let (Some(&p0), Some(&p3)) = (pts.first(), pts.last()) else { return CubicBez::new(Point::ZERO, Point::ZERO, Point::ZERO, Point::ZERO) };
|
||||
let dir_in = -t1; // handle at the end points backwards
|
||||
let (mut c00, mut c01, mut c11, mut x0, mut x1) = (0.0, 0.0, 0.0, 0.0, 0.0);
|
||||
for (p, &t) in pts.iter().zip(u) {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
//! pucker & bloat, zig zag, twist, wiggle, offset, merge) live in [`ops`]; curve-preserving booleans
|
||||
//! (for Merge Paths) in [`boolean`] and curve offsetting in [`offset`].
|
||||
|
||||
#![deny(clippy::unwrap_used, clippy::expect_used, clippy::panic, clippy::unimplemented, clippy::todo, clippy::unreachable)]
|
||||
|
||||
pub mod boolean;
|
||||
pub mod feather;
|
||||
mod fit;
|
||||
|
||||
@@ -651,7 +651,8 @@ pub fn merge(paths: &[BezPath], mode: MergeMode) -> BezPath {
|
||||
MergeMode::Subtract => crate::boolean::boolean_n(&inputs, |m| m[0] && !m[1..].iter().any(|&b| b)),
|
||||
MergeMode::Intersect => crate::boolean::boolean_n(&inputs, |m| m.iter().all(|&b| b)),
|
||||
MergeMode::Exclude => crate::boolean::boolean_n(&inputs, |m| m.iter().filter(|&&b| b).count() % 2 == 1),
|
||||
MergeMode::Merge => unreachable!(),
|
||||
// Handled above (no boolean operation).
|
||||
MergeMode::Merge => crate::boolean::boolean_n(&inputs, |m| m.iter().any(|&b| b)),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -497,7 +497,7 @@ pub fn patch_fill(img: &Image, hole: &[bool], init: Option<&Image>, patch: usize
|
||||
// Pyramid: stop while the image is still a few patches across.
|
||||
let mut levels = vec![fine];
|
||||
while levels.len() < 6 {
|
||||
let last = levels.last().expect("level");
|
||||
let Some(last) = levels.last() else { break };
|
||||
if last.w.min(last.h) / 2 < patch * 4 || !last.hole.iter().any(|b| *b) {
|
||||
break;
|
||||
}
|
||||
@@ -774,7 +774,11 @@ pub fn fill_sequence(input: &FillInput, o: &FillOpts, progress: &mut dyn FnMut(u
|
||||
out[t] = Some(img.clone());
|
||||
} else {
|
||||
// Warp the previous result here along the backward flow (t → t − 1).
|
||||
let prev = out[t - 1].as_ref().expect("previous frame");
|
||||
// Frames after `t0` are filled in order, so the previous one is set.
|
||||
let Some(prev) = out[t - 1].as_ref() else {
|
||||
out[t] = Some(patch_fill(img, left, None, o.patch, o.seed));
|
||||
continue;
|
||||
};
|
||||
let mut warped = img.clone();
|
||||
for i in 0..w * h {
|
||||
if left[i] {
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
//! [`Image`] stores premultiplied RGBA in `f32` (values may exceed 1.0 in 32 bpc projects). Every
|
||||
//! heavy operation is row-parallel with rayon.
|
||||
|
||||
#![deny(clippy::unwrap_used, clippy::expect_used, clippy::panic, clippy::unimplemented, clippy::todo, clippy::unreachable)]
|
||||
|
||||
pub mod blur;
|
||||
pub mod channels3d;
|
||||
pub mod cuts;
|
||||
|
||||
Reference in new issue
Block a user