Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public void sprite_posterize(int i) {
- int len = sprite_width[i] * sprite_height[i];
- int pixels[] = sprite_pixels[i];
- int rgb332_idx[] = new int[32768];
- for (int ptr = 0; ptr < len; ptr++) {
- int l = pixels[ptr];
- rgb332_idx[((l & 0xf80000) >> 9) + ((l & 0xf800) >> 6) + ((l & 0xf8) >> 3)]++;
- }
- int palette[] = new int[256];
- palette[0] = 0xff00ff;
- int freq[] = new int[256];
- for (int col = 0; col < 32768; col++) {
- int use = rgb332_idx[col];
- if (use > freq[255]) {
- for (int k1 = 1; k1 < 256; k1++) {
- if (use <= freq[k1])
- continue;
- for (int i2 = 255; i2 > k1; i2--) {
- palette[i2] = palette[i2 - 1];
- freq[i2] = freq[i2 - 1];
- }
- palette[k1] = ((col & 0x7c00) << 9) + ((col & 0x3e0) << 6) + ((col & 0x1f) << 3) + 0x40404;
- freq[k1] = use;
- break;
- }
- }
- rgb332_idx[col] = -1;
- }
- byte raster[] = new byte[len];
- for (int l1 = 0; l1 < len; l1++) {
- int pix = pixels[l1];
- int pix332 = ((pix & 0xf80000) >> 9) + ((pix & 0xf800) >> 6) + ((pix & 0xf8) >> 3);
- int new_pix = rgb332_idx[pix332];
- if (new_pix == -1) {
- int min_dist = 0x3b9ac9ff;
- int r = pix >> 16 & 0xff;
- int g = pix >> 8 & 0xff;
- int b = pix & 0xff;
- for (int ptr = 0; ptr < 256; ptr++) {
- int _pix = palette[ptr];
- int _r = _pix >> 16 & 0xff;
- int _g = _pix >> 8 & 0xff;
- int _b = _pix & 0xff;
- int dist = (r - _r) * (r - _r) + (g - _g) * (g - _g) + (b - _b) * (b - _b);
- if (dist < min_dist) {
- min_dist = dist;
- new_pix = ptr;
- }
- }
- rgb332_idx[pix332] = new_pix;
- }
- raster[l1] = (byte) new_pix;
- }
- sprite_raster[i] = raster;
- sprite_palette[i] = palette;
- sprite_pixels[i] = null;
- }
Add Comment
Please, Sign In to add comment