diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2020-05-08 20:08:18 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2020-05-08 20:08:18 -0400 |
commit | cccde01c4b4e376e0d1b5f58bdc9b1fe70a9b930 (patch) | |
tree | 9b5098416b752b38cd1534572f42fcaaf0dbc663 /src/main.rs | |
parent | 48a8abb94e1318f67bbd2809186c62009456d7c6 (diff) | |
download | kd-forest-cccde01c4b4e376e0d1b5f58bdc9b1fe70a9b930.tar.xz |
Allow specifying each channel's bit depth separately
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/src/main.rs b/src/main.rs index 05e9afe..d0899be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,8 +31,8 @@ use std::time::Instant; /// The color source specified on the command line. #[derive(Debug, Eq, PartialEq)] enum SourceArg { - /// All RGB colors of the given bit depth. - AllRgb(u32), + /// All RGB colors of the given bit depth(s). + AllRgb(u32, u32, u32), /// Take the colors from an image. Image(PathBuf), } @@ -197,13 +197,36 @@ impl Args { let source = if let Some(input) = args.value_of("INPUT") { SourceArg::Image(PathBuf::from(input)) } else { - let depth = parse_arg(args.value_of("DEPTH"))?.unwrap_or(24); - if depth > 24 { + let arg = args.value_of("DEPTH"); + let depths: Vec<_> = arg + .iter() + .map(|s| s.split(",")) + .flatten() + .map(|n| n.parse().ok()) + .collect(); + + let (r, g, b) = match depths.as_slice() { + [] => (8, 8, 8), + + // Allocate bits from most to least perceptually important + [Some(d)] => ((d + 1) / 3, (d + 2) / 3, d / 3), + + [Some(r), Some(g), Some(b)] => (*r, *g, *b), + + _ => { + return Err(AppError::invalid_value( + &format!("invalid bit depth {}", arg.unwrap()), + )); + } + }; + + if r > 8 || g > 8 || b > 8 { return Err(AppError::invalid_value( - &format!("bit depth of {} is too deep!", depth), + &format!("bit depth of {} is too deep!", arg.unwrap()), )); } - SourceArg::AllRgb(depth) + + SourceArg::AllRgb(r, g, b) }; let order = if args.is_present("RANDOM") { @@ -296,10 +319,11 @@ impl App { fn run(&mut self) -> AppResult<()> { let colors = match self.args.source { - SourceArg::AllRgb(depth) => { - self.width.get_or_insert(1u32 << ((depth + 1) / 2)); - self.height.get_or_insert(1u32 << (depth / 2)); - self.get_colors(AllColors::new(depth as usize)) + SourceArg::AllRgb(r, g, b) => { + let total = r + g + b; + self.width.get_or_insert(1u32 << ((total + 1) / 2)); + self.height.get_or_insert(1u32 << (total / 2)); + self.get_colors(AllColors::new(r, g, b)) } SourceArg::Image(ref path) => { let img = image::open(path)?.into_rgb(); |