bhcli

"Strange's fork of n0tr1v's bhcli (onion)"
git clone https://git.dasho.dev/Strange/bhcli.git
Log | Files | Refs | README

commit 2ee024f4a22b0bb328d56d0deb8232d19065871e
parent c5d667c8748ec6cdd653cfc98547399adb077b85
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Fri, 31 Mar 2023 19:33:22 -0700

optimize

Diffstat:
Msrc/lechatphp/mod.rs | 21++++++++++-----------
1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/lechatphp/mod.rs b/src/lechatphp/mod.rs @@ -3,7 +3,7 @@ use std::fmt::{Display, Formatter}; use std::hash::Hash; use base64::{engine::general_purpose, Engine as _}; use bresenham::Bresenham; -use image::{DynamicImage, GenericImageView, Rgba}; +use image::{DynamicImage, GenericImageView, Rgba, SubImage}; use lazy_static::lazy_static; const B64_PREFIX: &'static str = "R0lGODlhCAAOAIAAAAAAAAAAACH5BAgAAAAALAAAAAAIAA4AgAQCBPz+/AI"; @@ -110,7 +110,7 @@ pub fn solve_b64(b64_str: &str) -> Option<String> { fn solve_difficulty2(img: &DynamicImage) -> Option<String> { let mut answer = String::new(); for i in 0..NB_CHARS { - let sub_img = img.crop_imm(LEFT_PADDING + ((LETTER_WIDTH +1)*i), TOP_PADDING, LETTER_WIDTH, LETTER_HEIGHT); + let sub_img = img.view(LEFT_PADDING + ((LETTER_WIDTH +1)*i), TOP_PADDING, LETTER_WIDTH, LETTER_HEIGHT); for c in ALPHABET1.chars() { let good_letter_img = get_letter_img(c); if img_contains_letter(&sub_img, &good_letter_img) { @@ -205,7 +205,7 @@ fn find_letters(img: &DynamicImage) -> HashSet<Letter> { let mut letters_set = HashSet::new(); for y in 0..IMAGE_HEIGHT-LETTER_HEIGHT { for x in 0..IMAGE_WIDTH-LETTER_WIDTH { - let letter_img = img.crop_imm(x, y, LETTER_WIDTH, LETTER_HEIGHT); + let letter_img = img.view(x, y, LETTER_WIDTH, LETTER_HEIGHT); // We know that minimum amount of pixels on to form a letter is 21 // We can skip squares that do not have this prerequisite @@ -227,20 +227,19 @@ fn find_letters(img: &DynamicImage) -> HashSet<Letter> { // "w" fits in "W". So if we find "W" 1 px bellow, discard "w" if c == 'w' { let capital_w_img = get_letter_img('W'); - let one_px_down_img = img.crop_imm(x, y+1, LETTER_WIDTH, LETTER_HEIGHT); + let one_px_down_img = img.view(x, y+1, LETTER_WIDTH, LETTER_HEIGHT); if img_contains_letter(&one_px_down_img, &capital_w_img) { continue; } } else if c == 'k' { let capital_k_img = get_letter_img('K'); - let one_px_up_img = img.crop_imm(x+1, y+1, LETTER_WIDTH, LETTER_HEIGHT); + let one_px_up_img = img.view(x+1, y+1, LETTER_WIDTH, LETTER_HEIGHT); if img_contains_letter(&one_px_up_img, &capital_k_img) { continue; } } - - let letter = Letter::new(Point::new(x, y), c); - letters_set.insert(letter); + + letters_set.insert(Letter::new(Point::new(x, y), c)); break; } } @@ -279,7 +278,7 @@ impl From<Point> for bresenham::Point { } // give an image and a valid letter image, return either or not the letter is in that image. -fn img_contains_letter(img: &DynamicImage, letter_img: &DynamicImage) -> bool { +fn img_contains_letter(img: &SubImage<&DynamicImage>, letter_img: &DynamicImage) -> bool { if letter_img.dimensions() != img.dimensions() { return false; } @@ -304,14 +303,14 @@ fn is_red(c: Rgba<u8>) -> bool { c == *RED_COLOR } -fn has_red_in_center_area(letter_img: &DynamicImage) -> bool { +fn has_red_in_center_area(letter_img: &SubImage<&DynamicImage>) -> bool { letter_img.view(LETTER_WIDTH/2 - 1, LETTER_HEIGHT/2 - 1, 2, 2) .pixels() .any(|(_, _, c)| is_red(c)) } // Count pixels that are On (either white or red) -fn count_px_on(img: &DynamicImage) -> usize { +fn count_px_on(img: &SubImage<&DynamicImage>) -> usize { img.pixels() .filter(|(_, _, c)| is_on(*c)) .count()