summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorache <ache@ache.one>2025-08-31 22:21:17 +0200
committerache <ache@ache.one>2025-08-31 22:21:17 +0200
commitf77e747dd7b4053f4c3421b383a5495cc6d23055 (patch)
treefadb9d7cd71da1475c5ee8d396a56d321ebfc5f5
parentFix images dimensions (diff)
RNG use small
-rw-r--r--src/lib.rs43
-rw-r--r--src/main.rs5
2 files changed, 34 insertions, 14 deletions
diff --git a/src/lib.rs b/src/lib.rs
index b6bd3d1..afdd475 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -3,7 +3,7 @@ pub mod kernel;
use image::{ImageBuffer, Rgb, RgbImage};
use palette::{LinSrgb, Srgb, color_difference::EuclideanDistance};
use rand::rngs::SmallRng;
-use rand::{RngCore, SeedableRng};
+use rand::{Rng, RngCore, SeedableRng};
use std::cmp;
use std::collections::VecDeque;
use std::num::Wrapping;
@@ -15,20 +15,26 @@ const WHITE_SRGB: Srgb<f32> = Srgb::new(1., 1., 1.);
const BLACK_LINEAR_SRGB: LinSrgb<f32> = LinSrgb::new(0., 0., 0.);
const WHITE_LINEAR_SRGB: LinSrgb<f32> = LinSrgb::new(1., 1., 1.);
+#[allow(dead_code)]
const MULTIPLIER: u32 = 1303515245;
+#[allow(dead_code)]
const INCREMENT: u32 = 12345;
+#[allow(dead_code)]
const MODULUS: u32 = 1 << 31;
+#[allow(dead_code)]
fn lcg_next(state: &mut u32) -> u32 {
let tmp_state = Wrapping(*state);
*state = ((Wrapping(MULTIPLIER) * tmp_state + Wrapping(INCREMENT)) % Wrapping(MODULUS)).0;
*state
}
+#[allow(dead_code)]
fn rand_(state: &mut u32) -> u32 {
lcg_next(state)
}
+#[allow(dead_code)]
fn rand_double(state: &mut u32) -> f64 {
// TODO: Should to it with 64bits integers
(lcg_next(state) as f64) / (MODULUS as f64)
@@ -1518,7 +1524,7 @@ pub fn refine_palette(
}
}
-pub fn random_permutation_1d(count: usize, queue: &mut VecDeque<i32>, rng: &mut u32) {
+pub fn random_permutation_1d(count: usize, queue: &mut VecDeque<i32>, rng: &mut SmallRng) {
// NOTE: Done and tested !
for i in 0..count {
queue.push_back(i as i32);
@@ -1527,7 +1533,8 @@ pub fn random_permutation_1d(count: usize, queue: &mut VecDeque<i32>, rng: &mut
queue.make_contiguous();
for i in (1..count).rev() {
- let rand_number = rand_(rng) % (i as u32 + 1);
+ // let rand_number = rand_(rng) % (i as u32 + 1);
+ let rand_number = rng.random_range(0..(i as u32 + 1));
queue.swap(i, rand_number as usize);
}
}
@@ -1536,7 +1543,7 @@ pub fn random_permutation_2d(
width: usize,
height: usize,
queue: &mut VecDeque<(i32, i32)>,
- rng: &mut u32,
+ rng: &mut SmallRng,
) {
// NOTE: Done and tested !
// WARN: Should be improved.
@@ -1701,12 +1708,13 @@ pub fn dither_scolorq(image_in: &mut RgbImage, _palette_size: u8) {
// let res = invert_matrix(&mut matrix);
let (width, height) = image_in.dimensions();
- let palette_size = 6;
+ let palette_size = _palette_size as usize;
let ditherring_level =
0.09 * ((width * height) as f64).ln() - 0.04 * (palette_size as f64).ln() + 0.001;
- let mut rng: u32 = 42;
+ // let mut rng: u32 = 42;
+ let mut rng = SmallRng::seed_from_u64(11);
let mut image = vec![vec![[0.; 3]; height as usize]; width as usize];
let _filter_weights_1 = vec![vec![[0.; 3]; 1]; 1];
@@ -1717,11 +1725,12 @@ pub fn dither_scolorq(image_in: &mut RgbImage, _palette_size: u8) {
let mut palette: Vec<(f64, f64, f64)> = Vec::with_capacity(palette_size);
for _ in 0..palette_size {
- let color: (f64, f64, f64) = (
- rand_double(&mut rng),
- rand_double(&mut rng),
- rand_double(&mut rng),
- );
+ // let color: (f64, f64, f64) = (
+ // rand_double(&mut rng),
+ // rand_double(&mut rng),
+ // rand_double(&mut rng),
+ // );
+ let color: (f64, f64, f64) = rng.random();
palette.push(color);
}
@@ -1797,7 +1806,8 @@ pub fn dither_scolorq(image_in: &mut RgbImage, _palette_size: u8) {
for i in 0..(pcoarse_variables.len() as usize) {
for j in 0..(pcoarse_variables[0].len() as usize) {
for c in 0..palette_size {
- pcoarse_variables[i][j][c] = rand_double(&mut rng);
+ // pcoarse_variables[i][j][c] = rand_double(&mut rng);
+ pcoarse_variables[i][j][c] = rng.random();
coarse_variables[i][j][c] = pcoarse_variables[i][j][c];
}
}
@@ -2147,6 +2157,7 @@ pub fn dither_scolorq(image_in: &mut RgbImage, _palette_size: u8) {
}
}
+ print!("[");
for v in 0..palette_size {
if palette[v].0 > 1.0 {
palette[v].0 = 1.0;
@@ -2165,7 +2176,15 @@ pub fn dither_scolorq(image_in: &mut RgbImage, _palette_size: u8) {
} else if palette[v].2 < 0.0 {
palette[v].2 = 0.0;
}
+
+ print!(
+ "#{:02.x}{:02.x}{:02.x}, ",
+ (palette[v].0 * 255.).ceil() as u8,
+ (palette[v].1 * 255.).ceil() as u8,
+ (palette[v].2 * 255.).ceil() as u8
+ );
}
+ println!("]");
}
for y in 0..(height as u32) {
diff --git a/src/main.rs b/src/main.rs
index ac28eb7..b56b867 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -5,10 +5,11 @@ use std::path::Path;
const LIST_OF_SAMPLES: [&str; 6] = [
"samples/david.png",
"samples/david2.jpg",
+ "samples/test_scolarq.png",
"samples/us.png",
"samples/jane.jpg",
"samples/jane2.webp",
- "samples/karel_käos.jpg",
+ // "samples/karel_käos.jpg",
// "samples/diderot_111.png",
];
#[allow(dead_code)]
@@ -55,7 +56,7 @@ fn main() -> Result<(), image::ImageError> {
}),
("bayer_3b", |img| dither::dither_bayer(256, img)),
*/
- ("scolorq", |_img| dither::dither_scolorq(_img, 16)),
+ ("scolorq", |_img| dither::dither_scolorq(_img, 8)),
("kernel_jarvis_judice_ninke_linear_3b", |img| {
dither::dither_palette_linear(
img,