wip
This commit is contained in:
parent
7c4b118bed
commit
11325a16d8
1 changed files with 22 additions and 9 deletions
|
@ -486,13 +486,26 @@ function decimate(input, palette, n, inputError) {
|
||||||
// force to rWb
|
// force to rWb
|
||||||
//decimated = [0, 0x36, 0x0f, 0x86];
|
//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) {
|
while (decimated.length > n) {
|
||||||
let {popularity, fitness, output} = dither(decimated);
|
let {popularity, fitness, output} = dither(decimated);
|
||||||
|
|
||||||
// Try dropping least used color on each iteration
|
// Try dropping least used color on each iteration
|
||||||
let least = Infinity;
|
let least = Infinity;
|
||||||
let pick = -1;
|
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];
|
//let coolFactor = popularity[i];
|
||||||
|
|
||||||
|
@ -513,22 +526,22 @@ function decimate(input, palette, n, inputError) {
|
||||||
least = coolFactor;
|
least = coolFactor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let last = decimated.length;
|
||||||
decimated = decimated.filter((color, i) => {
|
decimated = decimated.filter((color, i) => {
|
||||||
if (palette[i] == 0) {
|
if (keepers[color]) {
|
||||||
// solid black
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (i == pick) {
|
if (i == pick) {
|
||||||
return false;
|
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;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (decimated.length == last && last > n) {
|
||||||
|
console.log(decimated);
|
||||||
|
throw new Error('this should not happen');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Palette fits
|
// Palette fits
|
||||||
|
|
Loading…
Reference in a new issue