From 1b4c8e78bc76e49ca6309196e995ca8dbd91cce2 Mon Sep 17 00:00:00 2001 From: Stattek Date: Fri, 7 Feb 2025 23:41:59 -0600 Subject: [PATCH 01/14] Run `cargo fmt`. --- src/charsets.rs | 6 +++--- src/gif_renderer.rs | 1 + src/image_renderer.rs | 19 ++++--------------- src/main.rs | 5 +---- 4 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/charsets.rs b/src/charsets.rs index d00dce4b..88618f15 100644 --- a/src/charsets.rs +++ b/src/charsets.rs @@ -5,9 +5,9 @@ pub const CHINESE: &[&str] = &[ ]; pub const DEFAULT: &[&str] = &[ " ", ".", "`", "^", "\"", "\\", ",", ":", ";", "I", "l", "!", "i", ">", "<", "~", "+", "_", - "-", "?", "]", "[", "}", "{", "1", ")", "(", "|", "\\", "/", "t", "f", "j", "r", "x", "n", - "u", "v", "c", "z", "X", "Y", "U", "J", "C", "L", "Q", "0", "O", "Z", "m", "w", "q", "p", - "d", "b", "k", "h", "a", "o", "*", "#", "M", "W", "&", "8", "%", "B", "$", "@", + "-", "?", "]", "[", "}", "{", "1", ")", "(", "|", "\\", "/", "t", "f", "j", "r", "x", "n", "u", + "v", "c", "z", "X", "Y", "U", "J", "C", "L", "Q", "0", "O", "Z", "m", "w", "q", "p", "d", "b", + "k", "h", "a", "o", "*", "#", "M", "W", "&", "8", "%", "B", "$", "@", ]; pub const EMOJI: &[&str] = &[ "\u{3000}", "\u{3000}", "。", "", "🧔", "ðŸ‘ķ", "ðŸ—Ģ", "ðŸ‘Ĩ", "ðŸ‘Ī", "👀", "👁", "ðŸĶī", "ðŸĶ·", "ðŸŦ", diff --git a/src/gif_renderer.rs b/src/gif_renderer.rs index e69de29b..8b137891 100644 --- a/src/gif_renderer.rs +++ b/src/gif_renderer.rs @@ -0,0 +1 @@ + diff --git a/src/image_renderer.rs b/src/image_renderer.rs index b5982de4..07e3a23d 100644 --- a/src/image_renderer.rs +++ b/src/image_renderer.rs @@ -1,15 +1,9 @@ use std::io; use ansi_term::Color; -use image::{ - DynamicImage, - Rgba, -}; +use image::{DynamicImage, Rgba}; -use super::renderer::{ - RenderOptions, - Renderer, -}; +use super::renderer::{RenderOptions, Renderer}; pub struct ImageRenderer<'a> { resource: &'a DynamicImage, @@ -111,7 +105,6 @@ impl<'a> Renderer<'a, DynamicImage> for ImageRenderer<'a> { fn render(&self, buffer: &mut String) -> io::Result<()> { let (width, height) = ( self.options.width.unwrap_or_else(|| { - (self .options .height @@ -122,7 +115,6 @@ impl<'a> Renderer<'a, DynamicImage> for ImageRenderer<'a> { * 2.0) .ceil() as u32 }), - self.options.height.unwrap_or_else(|| { (self .options @@ -134,7 +126,6 @@ impl<'a> Renderer<'a, DynamicImage> for ImageRenderer<'a> { / 2.0) .ceil() as u32 }), - ); let image = self.resource.thumbnail_exact(width, height).to_rgba8(); @@ -150,7 +141,7 @@ impl<'a> Renderer<'a, DynamicImage> for ImageRenderer<'a> { if let Some(last_color_value) = last_color { buffer.push_str(&last_color_value.suffix().to_string()); // TODO look up for a - // better solution after benchmarking. + // better solution after benchmarking. last_color = None; } @@ -173,13 +164,11 @@ impl<'a> Renderer<'a, DynamicImage> for ImageRenderer<'a> { buffer.push_str(char_for_pixel); } - if let Some(last_color) = last_color { buffer.push_str(&last_color.suffix().to_string()); // TODO look up for a - // better solution after benchmarking. + // better solution after benchmarking. } Ok(()) } - } diff --git a/src/main.rs b/src/main.rs index 26c49d5e..ae4d4128 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,7 @@ use std::io; use clap::Parser; -use rascii_art::{ - charsets, - RenderOptions, -}; +use rascii_art::{charsets, RenderOptions}; use unicode_segmentation::UnicodeSegmentation; #[derive(Debug, Parser)] From 3675adfad715f64a923669028c48104f3152b5bb Mon Sep 17 00:00:00 2001 From: Stattek Date: Sat, 8 Feb 2025 01:47:27 -0600 Subject: [PATCH 02/14] Allow escaping each colored character individually. --- src/image_renderer.rs | 6 ++++-- src/main.rs | 7 +++++++ src/renderer.rs | 2 ++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/image_renderer.rs b/src/image_renderer.rs index 07e3a23d..01e68cc0 100644 --- a/src/image_renderer.rs +++ b/src/image_renderer.rs @@ -82,7 +82,8 @@ impl<'a> Renderer<'a, DynamicImage> for ImageRenderer<'a> { if self.options.colored { let color = Color::RGB(pixel[0], pixel[1], pixel[2]); - if last_color != Some(color) { + // write prefix before a new color, unless we escape all characters individually + if self.options.escape_all_colored_chars || last_color != Some(color) { write!(writer, "{}", color.prefix())?; } @@ -151,7 +152,8 @@ impl<'a> Renderer<'a, DynamicImage> for ImageRenderer<'a> { if self.options.colored { let color = Color::RGB(pixel[0], pixel[1], pixel[2]); - if last_color != Some(color) { + // write prefix before a new color, unless we escape all characters individually + if self.options.escape_all_colored_chars || last_color != Some(color) { buffer.push_str(&color.prefix().to_string()); } diff --git a/src/main.rs b/src/main.rs index ae4d4128..c8433475 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,6 +24,12 @@ struct Args { #[arg(name = "color", short, long)] colored: bool, + /// Whether all characters should have an ANSI escape sequence before each character. + /// + /// Defaults to only escape colored strings upon color change. + #[arg(name = "escape-all-colored-chars", short, long)] + escape_all_colored_chars: bool, + /// Inverts the weights of the characters. Useful for white backgrounds #[arg(short, long)] invert: bool, @@ -52,6 +58,7 @@ fn main() -> image::ImageResult<()> { height: args.height, colored: args.colored, invert: args.invert, + escape_all_colored_chars: args.escape_all_colored_chars, charset, }, )?; diff --git a/src/renderer.rs b/src/renderer.rs index a7808a44..41ef8383 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -7,6 +7,7 @@ pub struct RenderOptions<'a> { pub width: Option, pub height: Option, pub colored: bool, + pub escape_all_colored_chars: bool, pub invert: bool, pub charset: &'a [&'a str], } @@ -57,6 +58,7 @@ impl Default for RenderOptions<'_> { width: None, height: None, colored: false, + escape_all_colored_chars: false, invert: false, charset: charsets::DEFAULT, } From da48f05b5ac64184ea1ec9004187f2bccaaca279 Mon Sep 17 00:00:00 2001 From: Stattek Date: Sat, 8 Feb 2025 02:19:21 -0600 Subject: [PATCH 03/14] Update name of variable. - Add builder function. --- src/image_renderer.rs | 4 ++-- src/main.rs | 9 ++++----- src/renderer.rs | 10 ++++++++-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/image_renderer.rs b/src/image_renderer.rs index 01e68cc0..0131529a 100644 --- a/src/image_renderer.rs +++ b/src/image_renderer.rs @@ -83,7 +83,7 @@ impl<'a> Renderer<'a, DynamicImage> for ImageRenderer<'a> { let color = Color::RGB(pixel[0], pixel[1], pixel[2]); // write prefix before a new color, unless we escape all characters individually - if self.options.escape_all_colored_chars || last_color != Some(color) { + if self.options.escape_each_colored_char || last_color != Some(color) { write!(writer, "{}", color.prefix())?; } @@ -153,7 +153,7 @@ impl<'a> Renderer<'a, DynamicImage> for ImageRenderer<'a> { let color = Color::RGB(pixel[0], pixel[1], pixel[2]); // write prefix before a new color, unless we escape all characters individually - if self.options.escape_all_colored_chars || last_color != Some(color) { + if self.options.escape_each_colored_char || last_color != Some(color) { buffer.push_str(&color.prefix().to_string()); } diff --git a/src/main.rs b/src/main.rs index c8433475..c19ee000 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,11 +24,10 @@ struct Args { #[arg(name = "color", short, long)] colored: bool, - /// Whether all characters should have an ANSI escape sequence before each character. - /// + /// Whether all characters should have an ANSI color code before each character. /// Defaults to only escape colored strings upon color change. - #[arg(name = "escape-all-colored-chars", short, long)] - escape_all_colored_chars: bool, + #[arg(name = "escape-each-char", short, long)] + escape_each_colored_char: bool, /// Inverts the weights of the characters. Useful for white backgrounds #[arg(short, long)] @@ -58,7 +57,7 @@ fn main() -> image::ImageResult<()> { height: args.height, colored: args.colored, invert: args.invert, - escape_all_colored_chars: args.escape_all_colored_chars, + escape_each_colored_char: args.escape_each_colored_char, charset, }, )?; diff --git a/src/renderer.rs b/src/renderer.rs index 41ef8383..953e474c 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -7,7 +7,7 @@ pub struct RenderOptions<'a> { pub width: Option, pub height: Option, pub colored: bool, - pub escape_all_colored_chars: bool, + pub escape_each_colored_char: bool, pub invert: bool, pub charset: &'a [&'a str], } @@ -39,6 +39,12 @@ impl<'a> RenderOptions<'a> { self } + /// Set whether each colored char should be escaped in the rendered image. + pub fn escape_each_colored_char(mut self, escape_each_colored_char: bool) -> Self { + self.escape_each_colored_char = escape_each_colored_char; + self + } + /// Set whether the rendered image charset should be inverted. pub fn invert(mut self, invert: bool) -> Self { self.invert = invert; @@ -58,7 +64,7 @@ impl Default for RenderOptions<'_> { width: None, height: None, colored: false, - escape_all_colored_chars: false, + escape_each_colored_char: false, invert: false, charset: charsets::DEFAULT, } From 2edf4e995a0adc7b3ab752fb85e103fd5d9cf4bc Mon Sep 17 00:00:00 2001 From: Stattek Date: Sat, 8 Feb 2025 02:19:34 -0600 Subject: [PATCH 04/14] Update readme. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 21829b6b..c02bb227 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ Options: -w, --width Width of the output image. Defaults to 128 if width and height are not specified -H, --height Height of the output image, if not specified, it will be calculated to keep the aspect ratio -c, --color Whether to use colors in the output image + -e, --escape-each-char Whether all characters should have an ANSI color code before each character. Defaults to only escape colored strings upon color change -i, --invert Inverts the weights of the characters. Useful for white backgrounds -C, --charset Characters used to render the image, from transparent to opaque. Built-in charsets: block, emoji, default, russian, slight [default: default] -h, --help Print help @@ -39,7 +40,7 @@ Options: > Your terminal emulator has to support `truecolor` (don't worry, > almost all modern terminal emulators do). -- **Super efficient colored output**: RASCII never repeats the same ANSI color +- **Super efficient colored output**: RASCII (by default) never repeats the same ANSI color code if it is already active. > This makes a huge difference in images with little alternating color, up to > about 1800% reduction in output size. Woah! From 0a51df6069224902a76eb710599efbee64e440cc Mon Sep 17 00:00:00 2001 From: Stattek Date: Sat, 8 Feb 2025 04:07:26 -0600 Subject: [PATCH 05/14] Update image version. --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index d5382665..9b9c1166 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ edition = "2021" [dependencies] ansi_term = "0.12.1" clap = { version = "4.3.0", features = [ "derive" ] } -image = "0.24.6" +image = "0.25.5" unicode-segmentation = "1.10.1" From 8359e26aeef4a6f51b2a03c14fd6b76a968e2424 Mon Sep 17 00:00:00 2001 From: Stattek Date: Sat, 8 Feb 2025 04:52:16 -0600 Subject: [PATCH 06/14] Update cargo lock. --- Cargo.lock | 679 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 610 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 09b72872..af9d5f8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "adler" @@ -8,6 +8,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "ansi_term" version = "0.12.1" @@ -66,12 +72,64 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "anyhow" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" + +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" +dependencies = [ + "arrayvec", +] + [[package]] name = "bit_field" version = "0.10.2" @@ -84,6 +142,18 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + +[[package]] +name = "built" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" + [[package]] name = "bumpalo" version = "3.13.0" @@ -102,11 +172,32 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "cc" -version = "1.0.79" +version = "1.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] [[package]] name = "cfg-if" @@ -144,7 +235,7 @@ version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "191d9573962933b4027f932c600cd252ce27a8ad5979418fe78e43c07996f27b" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "syn", @@ -177,16 +268,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - [[package]] name = "crossbeam-deque" version = "0.8.3" @@ -232,6 +313,12 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" version = "0.3.1" @@ -328,9 +415,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.12.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" dependencies = [ "color_quant", "weezl", @@ -345,6 +432,12 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + [[package]] name = "heck" version = "0.4.1" @@ -352,13 +445,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] -name = "hermit-abi" -version = "0.2.6" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -368,21 +458,62 @@ checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" [[package]] name = "image" -version = "0.24.6" +version = "0.25.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", - "byteorder", + "byteorder-lite", "color_quant", "exr", "gif", - "jpeg-decoder", - "num-rational", + "image-webp", "num-traits", "png", "qoi", + "ravif", + "rayon", + "rgb", "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + +[[package]] +name = "indexmap" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -391,7 +522,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi", "libc", "windows-sys", ] @@ -402,20 +533,35 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi", "io-lifetimes", "rustix", "windows-sys", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + [[package]] name = "jpeg-decoder" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" -dependencies = [ - "rayon", -] [[package]] name = "js-sys" @@ -438,6 +584,16 @@ version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" +[[package]] +name = "libfuzzer-sys" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "linux-raw-sys" version = "0.3.8" @@ -460,6 +616,31 @@ version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + [[package]] name = "memoffset" version = "0.8.0" @@ -469,6 +650,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.6.2" @@ -497,6 +684,50 @@ dependencies = [ "getrandom", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -514,34 +745,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", + "num-bigint", "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] -name = "num_cpus" -version = "1.15.0" +name = "once_cell" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" -dependencies = [ - "hermit-abi 0.2.6", - "libc", -] +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] -name = "once_cell" -version = "1.17.2" +name = "paste" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9670a07f94779e00908f3e686eab508878ebb390ba6e604d3a284c00e8d0487b" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pin-project" @@ -563,6 +791,12 @@ dependencies = [ "syn", ] +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + [[package]] name = "png" version = "0.17.8" @@ -576,15 +810,43 @@ dependencies = [ "miniz_oxide 0.7.1", ] +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + [[package]] name = "proc-macro2" -version = "1.0.59" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "qoi" version = "0.4.1" @@ -594,6 +856,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quote" version = "1.0.28" @@ -603,6 +871,36 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "rascii_art" version = "0.4.5" @@ -613,11 +911,61 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + [[package]] name = "rayon" -version = "1.7.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -625,16 +973,20 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" + [[package]] name = "rustix" version = "0.37.19" @@ -649,18 +1001,68 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "simd-adler32" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "smallvec" version = "1.10.0" @@ -684,26 +1086,99 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "2.0.18" +version = "2.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tiff" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7449334f9ff2baf290d55d73983a7d6fa15e01198faef72af07e2a8db851e471" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ "flate2", "jpeg-decoder", "weezl", ] +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "unicode-ident" version = "1.0.9" @@ -722,6 +1197,23 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -730,23 +1222,24 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.86" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.86" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn", @@ -755,9 +1248,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.86" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -765,9 +1258,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.86" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -778,15 +1271,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.86" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "weezl" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "winapi" @@ -876,6 +1372,42 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "winnow" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" +dependencies = [ + "memchr", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -884,3 +1416,12 @@ checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" dependencies = [ "simd-adler32", ] + +[[package]] +name = "zune-jpeg" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +dependencies = [ + "zune-core", +] From 527d2d42132f96c9ef86ea7deefc9e4ffd98f3d3 Mon Sep 17 00:00:00 2001 From: Stattek Date: Sat, 8 Feb 2025 05:00:49 -0600 Subject: [PATCH 07/14] Add a new charset that is similar to the output from `jp2a`. --- src/charsets.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/charsets.rs b/src/charsets.rs index 88618f15..cb26a301 100644 --- a/src/charsets.rs +++ b/src/charsets.rs @@ -22,8 +22,11 @@ pub const RUSSIAN: &[&str] = &[ "О", "Н", "М", "Л", "К", "Й", "И", "З", "Ж", "Ё", "Е", "Д", "Г", "В", "Б", "А", ]; pub const SLIGHT: &[&str] = &[ - " ", " ", ".", "`", "\"", "\\", ":", "I", "!", ">", "~", "_", "?", "[", "{", "|", ")", "(", - "\\", "\\\\", "/", "Y", "L", "p", "d", "a", "*", "W", "8", "%", "@", "$", + " ", ".", "`", "\"", "\\", ":", "I", "!", ">", "~", "_", "?", "[", "{", "|", ")", "(", "\\", + "\\\\", "/", "Y", "L", "p", "d", "a", "*", "W", "8", "%", "@", "$", +]; +pub const MINIMAL: &[&str] = &[ + " ", " ", ".", ":", "'", ";", "o", "l", "d", "c", "x", "0", "k", "K", "N", "W", "M", "X", ]; pub fn from_str(s: &str) -> Option<&[&str]> { @@ -34,6 +37,7 @@ pub fn from_str(s: &str) -> Option<&[&str]> { "emoji" => Some(EMOJI), "russian" => Some(RUSSIAN), "slight" => Some(SLIGHT), + "minimal" => Some(MINIMAL), _ => None, } } From c8969ce6c38f767ccb2f4691be27c2383593ebf4 Mon Sep 17 00:00:00 2001 From: Stattek Date: Sat, 8 Feb 2025 05:13:06 -0600 Subject: [PATCH 08/14] Get it closer to jp2a. --- src/charsets.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/charsets.rs b/src/charsets.rs index cb26a301..e69dca6b 100644 --- a/src/charsets.rs +++ b/src/charsets.rs @@ -26,7 +26,7 @@ pub const SLIGHT: &[&str] = &[ "\\\\", "/", "Y", "L", "p", "d", "a", "*", "W", "8", "%", "@", "$", ]; pub const MINIMAL: &[&str] = &[ - " ", " ", ".", ":", "'", ";", "o", "l", "d", "c", "x", "0", "k", "K", "N", "W", "M", "X", + " ", " ", ".", ":", "'", ";", "o", "l", "d", "c", "x", "0", "k", "K", "N", "M","W", "X", ]; pub fn from_str(s: &str) -> Option<&[&str]> { From 0a6ed5b5477fa09f262e9d9f423b6fec66b9c799 Mon Sep 17 00:00:00 2001 From: Stattek Date: Sat, 8 Feb 2025 21:46:08 -0600 Subject: [PATCH 09/14] Allow displaying transparent pixels. --- src/charsets.rs | 2 +- src/image_renderer.rs | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/charsets.rs b/src/charsets.rs index e69dca6b..3779ec7d 100644 --- a/src/charsets.rs +++ b/src/charsets.rs @@ -26,7 +26,7 @@ pub const SLIGHT: &[&str] = &[ "\\\\", "/", "Y", "L", "p", "d", "a", "*", "W", "8", "%", "@", "$", ]; pub const MINIMAL: &[&str] = &[ - " ", " ", ".", ":", "'", ";", "o", "l", "d", "c", "x", "0", "k", "K", "N", "M","W", "X", + " ", " ", ".", ":", "'", ";", "o", "l", "d", "c", "x", "0", "k", "K", "N", "M", "W", "X", ]; pub fn from_str(s: &str) -> Option<&[&str]> { diff --git a/src/image_renderer.rs b/src/image_renderer.rs index 0131529a..5a54cae9 100644 --- a/src/image_renderer.rs +++ b/src/image_renderer.rs @@ -1,4 +1,4 @@ -use std::io; +use std::{io, u8}; use ansi_term::Color; use image::{DynamicImage, Rgba}; @@ -13,9 +13,14 @@ pub struct ImageRenderer<'a> { impl ImageRenderer<'_> { fn get_char_for_pixel(&self, pixel: &Rgba, maximum: f64) -> &str { let as_grayscale = self.get_grayscale(pixel) / maximum; + let transparency_percent = self.get_transparency_percent(pixel); - // TODO: Use alpha channel to determine if pixel is transparent? - let char_index = (as_grayscale * (self.options.charset.len() as f64 - 1.0)) as usize; + let char_index = if transparency_percent < 0.95 { + // if we have at least 95% transparency, count this pixel as transparent and give minimum index + 0 + } else { + (as_grayscale * (self.options.charset.len() as f64 - 1.0)) as usize + }; self.options.charset[if self.options.invert { self.options.charset.len() - 1 - char_index @@ -24,6 +29,10 @@ impl ImageRenderer<'_> { }] } + fn get_transparency_percent(&self, pixel: &Rgba) -> f64 { + pixel[3] as f64 / u8::MAX as f64 + } + fn get_grayscale(&self, pixel: &Rgba) -> f64 { ((pixel[0] as f64 * 0.299) + (pixel[1] as f64 * 0.587) + (pixel[2] as f64 * 0.114)) / 255.0 } From 4a12477b4b3837cf0453c41c734bcc1861020224 Mon Sep 17 00:00:00 2001 From: Stattek Date: Sat, 8 Feb 2025 22:06:11 -0600 Subject: [PATCH 10/14] Update function and var naming. --- src/image_renderer.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/image_renderer.rs b/src/image_renderer.rs index 5a54cae9..143220b1 100644 --- a/src/image_renderer.rs +++ b/src/image_renderer.rs @@ -13,10 +13,10 @@ pub struct ImageRenderer<'a> { impl ImageRenderer<'_> { fn get_char_for_pixel(&self, pixel: &Rgba, maximum: f64) -> &str { let as_grayscale = self.get_grayscale(pixel) / maximum; - let transparency_percent = self.get_transparency_percent(pixel); + let percent_opaque = self.get_opacity_percent(pixel); - let char_index = if transparency_percent < 0.95 { - // if we have at least 95% transparency, count this pixel as transparent and give minimum index + let char_index = if percent_opaque < 0.95 { + // if we are below 95% opacity, count this pixel as transparent and give minimum index 0 } else { (as_grayscale * (self.options.charset.len() as f64 - 1.0)) as usize @@ -29,7 +29,7 @@ impl ImageRenderer<'_> { }] } - fn get_transparency_percent(&self, pixel: &Rgba) -> f64 { + fn get_opacity_percent(&self, pixel: &Rgba) -> f64 { pixel[3] as f64 / u8::MAX as f64 } From 786a794397ef14fdf213521955657b194b253fc9 Mon Sep 17 00:00:00 2001 From: Stattek Date: Sat, 8 Feb 2025 22:08:43 -0600 Subject: [PATCH 11/14] Update default width to be accurate with comments. --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index c19ee000..38dda73b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -46,7 +46,7 @@ fn main() -> image::ImageResult<()> { let charset = charsets::from_str(args.charset.as_str()).unwrap_or(clusters.as_slice()); if args.width.is_none() && args.height.is_none() { - args.width = Some(80); + args.width = Some(128); } rascii_art::render( From 13d609587805bebcb3a24da4788fb2543fcd25ff Mon Sep 17 00:00:00 2001 From: Stattek <107233826+Stattek@users.noreply.github.com> Date: Sat, 8 Feb 2025 22:15:49 -0600 Subject: [PATCH 12/14] Update README.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c02bb227..612957d6 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Options: - **Super efficient colored output**: RASCII (by default) never repeats the same ANSI color code if it is already active. - > This makes a huge difference in images with little alternating color, up to + > This makes a huge difference in images with little alternating colors, up to > about 1800% reduction in output size. Woah! - **Custom dimensions**: RASCII allows you to give custom dimensions to the From 6b9928a069b5e8fc9648e99353a2b1aecaacfd1c Mon Sep 17 00:00:00 2001 From: Stattek Date: Sat, 8 Feb 2025 22:17:29 -0600 Subject: [PATCH 13/14] Remove magic number. --- src/image_renderer.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/image_renderer.rs b/src/image_renderer.rs index 143220b1..e65ffe56 100644 --- a/src/image_renderer.rs +++ b/src/image_renderer.rs @@ -10,12 +10,14 @@ pub struct ImageRenderer<'a> { options: &'a RenderOptions<'a>, } +const OPACITY_THRESHOLD: f64 = 0.95; + impl ImageRenderer<'_> { fn get_char_for_pixel(&self, pixel: &Rgba, maximum: f64) -> &str { let as_grayscale = self.get_grayscale(pixel) / maximum; let percent_opaque = self.get_opacity_percent(pixel); - let char_index = if percent_opaque < 0.95 { + let char_index = if percent_opaque < OPACITY_THRESHOLD { // if we are below 95% opacity, count this pixel as transparent and give minimum index 0 } else { From 3cdbcab50a1846e8cda8c472f623c3d5b630679a Mon Sep 17 00:00:00 2001 From: stattek Date: Mon, 17 Feb 2025 00:12:34 -0600 Subject: [PATCH 14/14] Update documentation. --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 38dda73b..c73f20a3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -34,7 +34,7 @@ struct Args { invert: bool, /// Characters used to render the image, from transparent to opaque. - /// Built-in charsets: block, emoji, default, russian, slight + /// Built-in charsets: block, emoji, default, russian, slight, minimal #[arg(short = 'C', long, default_value = "default")] charset: String, }