Merge pull request #2118 from ChristopherLinnett/fix/issue-2092-camera-focus-crash

fix: bound Classic 3D depth-of-field blur and reject non-finite focus distances (#2092)
This commit is contained in:
BFlat
2026-10-30 05:09:17 +07:00
committed by GitHub
9 changed files with 403 additions and 53 deletions
+20 -5
View File
@@ -312,14 +312,15 @@ impl Buf {
self.offset[0] += l as f64;
self.offset[1] += t as f64;
}
/// Grow by `pad` transparent pixels on every side.
/// Grow by `pad` transparent pixels on every side (as clamped by [`Image::effective_pad`]).
pub fn pad(&mut self, pad: u32) {
if pad == 0 {
let eff = self.img.effective_pad(pad);
if eff == 0 {
return;
}
self.img = self.img.padded(pad);
self.offset[0] += pad as f64;
self.offset[1] += pad as f64;
self.img = self.img.padded(eff);
self.offset[0] += eff as f64;
self.offset[1] += eff as f64;
}
}
@@ -1351,6 +1352,20 @@ mod tests {
assert_eq!(out.img.data, img.data);
}
#[test]
fn pad_offset_follows_the_clamped_pad() {
// Image::padded clamps a hostile pad to keep each side within MAX_PADDED_SIDE; the offset
// must move by the pad actually applied, or the content drifts from its layer position.
let mut img = Image::new(29_990, 2);
img.set(0, 0, [1.0, 0.0, 0.0, 1.0]);
let mut buf = Buf { img, offset: [3.0, 4.0], scale: 1.0 };
buf.pad(u32::MAX);
// Width binds: (MAX_PADDED_SIDE - 29 990) / 2 = 5.
assert_eq!(buf.offset, [8.0, 9.0]);
let (x, y) = buf.to_px([-3.0, -4.0]);
assert_eq!(buf.img.get(x as i64, y as i64), [1.0, 0.0, 0.0, 1.0]);
}
#[test]
#[ignore]
fn dump_registry() {