This commit is contained in:
Brooke Vibber 2023-03-18 20:17:01 -07:00
parent 7c4b118bed
commit 11325a16d8

View file

@ -486,13 +486,26 @@ function decimate(input, palette, n, inputError) {
// force to rWb
//decimated = [0, 0x36, 0x0f, 0x86];
let reserved = [0]; // black
//let reserved = [0, 15]; // black, white
//let reserved = [0, 5, 10, 15]; // grayscale
let keepers = new Uint8Array(256);
for (let i of reserved) {
keepers[i & 0xfe] = 1; // drop that 0 luminance bit!
}
while (decimated.length > n) {
let {popularity, fitness, output} = dither(decimated);
// Try dropping least used color on each iteration
let least = Infinity;
let pick = -1;
for (let i = 1; i < decimated.length; i++) {
for (let i = 0; i < decimated.length; i++) {
let color = decimated[i];
if (keepers[color]) {
continue;
}
//let coolFactor = popularity[i];
@ -513,22 +526,22 @@ function decimate(input, palette, n, inputError) {
least = coolFactor;
}
}
let last = decimated.length;
decimated = decimated.filter((color, i) => {
if (palette[i] == 0) {
// solid black
if (keepers[color]) {
return true;
}
if (i == pick) {
return false;
}
// Also drop any non-black unused colors to save trouble.
// However -- this may change dither results.
// Try this with/without later.
if (popularity[i] == 0) {
return false;
}
return true;
});
if (decimated.length == last && last > n) {
console.log(decimated);
throw new Error('this should not happen');
}
}
// Palette fits