From 621f17f3b5bbbe9586ca98c1a6f2b972fa2f8112 Mon Sep 17 00:00:00 2001 From: Grzegorz Martens Date: Sat, 31 Oct 2026 18:07:06 +0100 Subject: [PATCH] M2.6: an image already at the target resolution isn't decoded to find that out Found by CodeRabbit. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01AmsdeUCdTaD72jkDw2pJKY --- crates/optimize/src/images.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/crates/optimize/src/images.rs b/crates/optimize/src/images.rs index e99cefe9e1..cd2317590d 100644 --- a/crates/optimize/src/images.rs +++ b/crates/optimize/src/images.rs @@ -1105,7 +1105,7 @@ fn mono(doc: &Document, s: &Stream, ppi: f64, defaults: bool, settings: &MonoSet // What can't be averaged, whatever it holds, comes to the same `None` below, after a decode that // would spend the run's allowance on it. let too_wide = d.int(b"Width").is_some_and(|w| w > i64::from(pdfcraft_filters::MAX_CCITT_COLUMNS)); - if only_to_resample && (!downsample || defaults || too_wide || (jbig2 && dark_is_one(doc, d).is_none())) { + if only_to_resample && (!downsample || defaults || too_wide || settings.target_ppi >= ppi || (jbig2 && dark_is_one(doc, d).is_none())) { return None; } let (data, w, h, packed) = one_bit(doc, s, !retain, defaults, budget)?; @@ -1416,13 +1416,16 @@ mod dimension_tests { edit(&mut dict); Stream::from_raw(dict, pdfcraft_filters::encode_jbig2_generic(&[0xF0; 4], 16, 2).unwrap()) }; - let settings = MonoSettings { compression: MonoCompression::Retain, ..MonoSettings::REDUCE }; - let spent = |s: &Stream, defaults: bool| { + let spent_at = |target_ppi: f64, s: &Stream, defaults: bool| { + let settings = MonoSettings { compression: MonoCompression::Retain, above_ppi: 100.0, target_ppi, ..MonoSettings::REDUCE }; let mut budget = ImageBudget::with_work(u64::MAX); let _ = mono(&Document::new_empty(), s, 720.0, defaults, &settings, &mut budget); u64::MAX - budget.work_left() }; + let spent = |s: &Stream, defaults: bool| spent_at(300.0, s, defaults); let plain = image(&|_| {}); + assert_eq!(spent_at(720.0, &plain, false), 0, "already at the target"); + assert!(spent_at(719.0, &plain, false) > 0, "just above it"); assert!(spent(&plain, false) > 0, "one that can be averaged is decoded"); assert_eq!(spent(&plain, true), 0, "drawn where a device colour space is remapped"); let width = |w: i64| image(&move |d| d.set(b"Width".to_vec(), Object::Int(w)));