|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Common code needed by all the various graphics systems.
5: *
6: * (c) 1996 Bernd Schmidt, Ed Hanway
7: */
8:
9: #include "sysconfig.h"
10: #include "sysdeps.h"
11:
12: #include "config.h"
13: #include "options.h"
14: #include "memory.h"
15: #include "custom.h"
16: #include "newcpu.h"
17: #include "keyboard.h"
18: #include "xwin.h"
19: #include "keybuf.h"
20:
21: unsigned long doMask(int p, int bits, int shift)
22: {
23: /* p is a value from 0 to 15 (Amiga color value)
24: * scale to 0..255, shift to align msb with mask, and apply mask */
25:
26: unsigned long val = p * 0x11111111UL;
27: val >>= (32 - bits);
28: val <<= shift;
29:
30: return val;
31: }
32:
33: void alloc_colors64k(int rw, int gw, int bw, int rs, int gs, int bs)
34: {
35: int i;
36: for(i=0; i<4096; i++) {
37: int r = i >> 8;
38: int g = (i >> 4) & 0xF;
39: int b = i & 0xF;
40: xcolors[i] = doMask(r, rw, rs) | doMask(g, gw, gs) | doMask(b, bw, bs);
41: }
42: }
43:
44: static int allocated[4096];
45:
46: void alloc_colors256(int (* allocfunc)(int, int, int, xcolnr *))
47: {
48: /* This is kind of kludgy...
49: * Try to allocate as many different colors as possible. */
50: int step = 5, mode = 0, count = 0, col;
51: int no_allocated = 0;
52:
53: memset(allocated, 0, sizeof allocated);
54: fprintf(stderr, "Allocating lots of colors...\n");
55:
56: do {
57: int r, g, b, rs, bs, gs;
58: bs = step;
59: rs = step;
60: gs = step;
61: for(b = 0; b < 16; b += bs) {
62: for(r = 0; r < 16; r += rs) {
63: for(g = 0; g < 16; g += gs) {
64: int cnr = (r << 8) + (g << 4) + b;
65: if (!allocated[cnr]) {
66: int result = allocfunc(r, g, b, xcolors + cnr);
67: if (result < 0 || no_allocated == 256)
68: goto finished;
69: if (result > 0) {
70: allocated[cnr] = 1;
71: no_allocated++;
72: }
73: }
74: }
75: }
76: }
77: if (step > 1)
78: step++;
79: step /= 2;
80: } while (step);
81:
82: finished:
83: #if 0
84: for(col = 0; col < 4096; col++) {
85: int cnr = col;
86: if (!allocated[cnr]) {
87: int r = cnr >> 8;
88: int g = (cnr >> 4) & 0xF;
89: int b = cnr & 0xF;
90: int maxd = 4096,best = 0;
91: int c2;
92: for(c2 = 0; c2 < 4096; c2++)
93: if (allocated[c2]) {
94: int r2 = c2 >> 8;
95: int g2 = (c2 >> 4) & 0xF;
96: int b2 = c2 & 0xF;
97: int rd = (r2-r)*r*2;
98: int bd = (b2-b)*b*2;
99: int gd = (g2-g)*g*2;
100: int dist = abs(rd) + abs(gd) + abs(bd) + abs(rd-gd)/3 + abs(rd-bd)/3 + abs(gd-bd)/3;
101: if (dist < maxd) {
102: maxd = dist;
103: best = c2;
104: }
105: }
106: cnr = best;
107: }
108: xcolors[col] = xcolors[cnr];
109: }
110: #else
111: for(col = 0; col < 4096; col++) {
112: int cnr;
113: int dist;
114: int r = col >> 8;
115: int g = (col >> 4) & 0xF;
116: int b = col & 0xF;
117:
118: if (allocated[col])
119: continue;
120:
121: for (dist = 2;; dist++) {
122: int r2, g2, b2;
123: int rd, gd, bd;
124: int best = 0, maxd = 32767;
125: for (gd = 0; gd < dist; gd = gd < 0 ? -gd : -gd-1) {
126: g2 = g + gd;
127: if (g2 < 0 || g2 > 15)
128: continue;
129: for (rd = 0; rd < dist; rd = rd < 0 ? -rd : -rd-1) {
130: r2 = r + rd;
131: if (r2 < 0 || r2 > 15)
132: continue;
133: for (bd = 0; bd < dist; bd = bd < 0 ? -bd : -bd-1) {
134: b2 = b + bd;
135: if (b2 < 0 || b2 > 15)
136: continue;
137: cnr = (r2 << 8) + (g2 << 4) + b2;
138: if (allocated[cnr]) {
139: int rd2 = rd == 0 ? 0 : rd*32/r;
140: int gd2 = gd == 0 ? 0 : gd*32/g;
141: int bd2 = bd == 0 ? 0 : bd*32/b;
142: int dist = abs(rd) + abs(gd) + abs(bd) + abs(rd2-gd2) + abs(rd2-bd2) + abs(gd2-bd2);
143: if (dist < maxd) {
144: maxd = dist;
145: xcolors[col] = xcolors[cnr];
146: }
147: }
148: }
149: }
150: }
151: if (maxd != 32767)
152: break;
153: }
154: }
155: #endif
156: }
157:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.