fn new() -> Self { Self { seed: 0x1234 } }
fn next(&mut self) -> u8 {
if (self.seed & 0x8000) != 0 {
- self.seed = (self.seed & 0x7FFF) * 2 ^ 0x1B2B;
+ self.seed = ((self.seed & 0x7FFF) * 2) ^ 0x1B2B;
} else {
self.seed <<= 1;
}
}
}
fn calc_dist(&mut self) {
- if self.count != 0 {
- self.dist = (self.dist + self.count / 2) / self.count;
- }
}
}
clu1.calc_dist();
clu0.dist + clu1.dist
}
+ #[allow(clippy::cognitive_complexity)]
pub fn quantise(&mut self, src: &[Pixel], dst: &mut [[u8; 3]; 256]) {
if src.len() < 3 {
return;
let mut rng = RNG::new();
let mut iterations = 0usize;
let mut do_elbg_step = true;
- while (iterations < 20) && (dist < prev_dist - prev_dist / 1000) {
+ while (iterations < 10) && (dist < prev_dist - prev_dist / 100) {
prev_dist = dist;
for i in 0..256 {
old_cb[i] = self.clusters[i].centroid;
self.clusters[i].reset();
}
// put pixels into the nearest clusters
- indices.truncate(0);
+ indices.clear();
for entry in entries.iter() {
let mut bestidx = 0;
let mut bestdist = std::u32::MAX;
}
let dmean = dist / 256;
- low_u.truncate(0);
- high_u.truncate(0);
+ low_u.clear();
+ high_u.clear();
let mut used = [false; 256];
for (i, cluster) in self.clusters.iter().enumerate() {
if cluster.dist < dmean {
if do_elbg_step {
do_elbg_step = false;
for low_idx in low_u.iter() {
- if high_u.len() == 0 {
+ if high_u.is_empty() {
break;
}
let high_idx_idx = (rng.next() as usize) % high_u.len();