commit 2ee024f4a22b0bb328d56d0deb8232d19065871e
parent c5d667c8748ec6cdd653cfc98547399adb077b85
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Fri, 31 Mar 2023 19:33:22 -0700
optimize
Diffstat:
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()