commit - 7dc87c2e803b3891f2602718beffba9dfc9c00fa
commit + 5913bf0583323576119b67d131681eac7b44fd39
blob - a424f0b334946592fb8742b9533967552a94fbea
blob + 3fce12d2acc3bccdfe914a94b808502f3df70684
--- Cargo.lock
+++ Cargo.lock
]
[[package]]
-name = "itertools"
-version = "0.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
-dependencies = [
- "either",
-]
-
-[[package]]
name = "jobserver"
version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
"cosmic-text",
"env_logger",
"image",
- "itertools 0.14.0",
"log",
"open",
"ppa6",
+ "rayon",
]
[[package]]
"built",
"cfg-if",
"interpolate_name",
- "itertools 0.12.1",
+ "itertools",
"libc",
"libfuzzer-sys",
"log",
blob - 96dea95ed7d82307d30c22533c7b5efe2ab3b0bd
blob + 2ed3be8cc8109a4e3e559e4ee155da6724ee6c72
--- ppa6-print/Cargo.toml
+++ ppa6-print/Cargo.toml
clap = { version = "4.5.28", features = ["derive"] }
clap-num = "1.2.0"
image = "0.25.5"
-itertools = "0.14.0"
open = "5.3.2"
ppa6.workspace = true
env_logger = "0.11.6"
clap-verbosity = "2.1.0"
log = "0.4.25"
+rayon = "1.10.0"
blob - 440bb5d975d986111bc18f835dc355ea4a65dcd0
blob + 48f42677e545198d53d9a7dfba103a4c7efbb1a4
--- ppa6-print/src/main.rs
+++ ppa6-print/src/main.rs
use clap_verbosity::Verbosity;
use cosmic_text::{Attrs, Buffer, Color, FontSystem, Metrics, Shaping, SwashCache};
use image::{imageops::{dither, ColorMap, FilterType}, DynamicImage, GrayImage, ImageFormat, ImageReader, Luma, RgbImage};
-use ppa6::{usb_context, Document, Printer};
-use itertools::Itertools;
+use ppa6::Printer;
+use rayon::prelude::*;
#[derive(Parser)]
struct Cli {
}
fn picture(cli: &Cli, data: &[u8]) -> Result<GrayImage> {
+ log::trace!("parsing...");
let img = ImageReader::new(Cursor::new(data))
.with_guessed_format()?
.decode()?
.into_luma8();
- let mut img = DynamicImage::ImageLuma8(resize(rotate(img, cli.rotate)))
- .brighten(cli.brighten)
- .adjust_contrast(cli.contrast)
- .into_luma8();
+
+ log::trace!("rotating...");
+ let img = rotate(img, cli.rotate);
+
+ log::trace!("resizing...");
+ let mut img = DynamicImage::ImageLuma8(resize(img));
+
+ if cli.brighten != 0 {
+ log::trace!("brightening...");
+ img = img.brighten(cli.brighten);
+ }
+
+ if cli.contrast != 0.0 {
+ log::trace!("adjusting contrast...");
+ img = img.adjust_contrast(cli.contrast);
+ }
+
+ let mut img = img.into_luma8();
assert_eq!(img.width(), 384);
+
+ log::trace!("dithering...");
dither(&mut img, &BlackWhiteMap(cli.threshold));
Ok(img)
}
return Ok(());
}
+ log::trace!("mapping...");
let pixels = img
- .pixels()
+ .par_pixels()
.map(|c| (c.0[0] < cli.threshold) ^ cli.invert)
.chunks(8)
- .into_iter()
.map(|chunk| {
chunk
+ .iter()
.enumerate()
.fold(0u8, |mut acc, (i, c)| {
assert!(i < 8);
- if c {
+ if *c {
acc |= 128 >> i;
}
acc
})
.collect::<Vec<u8>>();
- let doc = Document::new(pixels)?;
-
- let ctx = usb_context()?;
- let mut printer = Printer::find(&ctx)?;
-
+ let mut printer = Printer::find()?;
+ printer.reset()?;
log::info!("IP: {}", printer.get_ip()?);
- log::info!("Firmware: {}", printer.get_firmware()?);
+ log::info!("Firmware: {}", printer.get_firmware_ver()?);
log::info!("Serial: {}", printer.get_serial()?);
- log::info!("Hardware: {}", printer.get_hardware()?);
+ log::info!("Hardware: {}", printer.get_hardware_ver()?);
log::info!("Name: {}", printer.get_name()?);
log::info!("MAC: {:x?}", printer.get_mac()?);
log::info!("Battery: {}%", printer.get_battery()?);
- for i in 0..cli.num {
- printer.print(&doc, cli.feed && i == (cli.num - 1))?;
+ for _ in 0..cli.num {
+ printer.print_image_chunked(&pixels, 384)?;
}
+ if cli.feed {
+ printer.push(0x60)?;
+ }
+
Ok(())
}