-impl VQElementSum<Pixel16> for Pixel16Sum {
- fn zero() -> Self { Pixel16Sum { rsum: 0, gsum: 0, bsum: 0, count: 0 } }
- fn add(&mut self, rval: Pixel16, count: u64) {
- let (r, g, b) = rval.unpack();
- let count = count as u16;
- self.rsum += r * count;
- self.gsum += g * count;
- self.bsum += b * count;
- self.count += count;
- }
- fn get_centroid(&self) -> Pixel16 {
- if self.count != 0 {
- let r = (self.rsum + self.count / 2) / self.count;
- let g = (self.gsum + self.count / 2) / self.count;
- let b = (self.bsum + self.count / 2) / self.count;
- Pixel16::pack(r, g, b)
- } else {
- Pixel16(0x0000)
+ let mut best_axis = 3;
+ let mut best_dist = maxv[3] - minv[3];
+ for (comp_no, (&minval, &maxval)) in minv.iter().zip(maxv.iter()).enumerate().take(3) {
+ if maxval - minval > best_dist {
+ best_axis = comp_no;
+ best_dist = maxval - minval;
+ }
+ }
+ if best_dist == 0 {
+ let avg_pix = pack_rgb555(avg);
+ let mut dist = 0;
+ for el in tmp.iter() {
+ dist += dist_core(avg, el);
+ }
+ return ([avg_pix; 2], 0, dist);
+ }
+
+ let mut avg1 = PixelAverage::new();
+ let mut avg2 = PixelAverage::new();
+ let mut mask = 0;
+ let mut mask_bit = 1;
+ for clr in tmp.iter() {
+ if clr[best_axis] > avg[best_axis] {
+ avg2.add(clr);
+ mask |= mask_bit;
+ } else {
+ avg1.add(clr);
+ }
+ mask_bit <<= 1;
+ }
+
+ let clr0 = avg1.get_avg();
+ let clr1 = avg2.get_avg();
+ let mut dist = 0;
+ for clr in tmp.iter() {
+ let dist0 = dist_core(clr0, clr);
+ let dist1 = dist_core(clr1, clr);
+ dist += dist0.min(dist1);
+ }
+ ([pack_rgb555(clr0), pack_rgb555(clr1)], mask, dist)