Blame


1 ed7c8e8d 2003-09-30 devnull #include <u.h>
2 ed7c8e8d 2003-09-30 devnull #include <libc.h>
3 ed7c8e8d 2003-09-30 devnull #include <draw.h>
4 ed7c8e8d 2003-09-30 devnull
5 ed7c8e8d 2003-09-30 devnull /*
6 ed7c8e8d 2003-09-30 devnull * This original version, although fast and a true inverse of
7 ed7c8e8d 2003-09-30 devnull * cmap2rgb, in the sense that rgb2cmap(cmap2rgb(c))
8 ed7c8e8d 2003-09-30 devnull * returned the original color, does a terrible job for RGB
9 ed7c8e8d 2003-09-30 devnull * triples that do not appear in the color map, so it has been
10 ed7c8e8d 2003-09-30 devnull * replaced by the much slower version below, that loops
11 ed7c8e8d 2003-09-30 devnull * over the color map looking for the nearest point in RGB
12 ed7c8e8d 2003-09-30 devnull * space. There is no visual psychology reason for that
13 ed7c8e8d 2003-09-30 devnull * criterion, but it's easy to implement and the results are
14 fa325e9b 2020-01-10 cross * far more pleasing.
15 ed7c8e8d 2003-09-30 devnull *
16 ed7c8e8d 2003-09-30 devnull int
17 ed7c8e8d 2003-09-30 devnull rgb2cmap(int cr, int cg, int cb)
18 ed7c8e8d 2003-09-30 devnull {
19 ed7c8e8d 2003-09-30 devnull int r, g, b, v, cv;
20 ed7c8e8d 2003-09-30 devnull
21 ed7c8e8d 2003-09-30 devnull if(cr < 0)
22 ed7c8e8d 2003-09-30 devnull cr = 0;
23 ed7c8e8d 2003-09-30 devnull else if(cr > 255)
24 ed7c8e8d 2003-09-30 devnull cr = 255;
25 ed7c8e8d 2003-09-30 devnull if(cg < 0)
26 ed7c8e8d 2003-09-30 devnull cg = 0;
27 ed7c8e8d 2003-09-30 devnull else if(cg > 255)
28 ed7c8e8d 2003-09-30 devnull cg = 255;
29 ed7c8e8d 2003-09-30 devnull if(cb < 0)
30 ed7c8e8d 2003-09-30 devnull cb = 0;
31 ed7c8e8d 2003-09-30 devnull else if(cb > 255)
32 ed7c8e8d 2003-09-30 devnull cb = 255;
33 ed7c8e8d 2003-09-30 devnull r = cr>>6;
34 ed7c8e8d 2003-09-30 devnull g = cg>>6;
35 ed7c8e8d 2003-09-30 devnull b = cb>>6;
36 ed7c8e8d 2003-09-30 devnull cv = cr;
37 ed7c8e8d 2003-09-30 devnull if(cg > cv)
38 ed7c8e8d 2003-09-30 devnull cv = cg;
39 ed7c8e8d 2003-09-30 devnull if(cb > cv)
40 ed7c8e8d 2003-09-30 devnull cv = cb;
41 ed7c8e8d 2003-09-30 devnull v = (cv>>4)&3;
42 ed7c8e8d 2003-09-30 devnull return ((((r<<2)+v)<<4)+(((g<<2)+b+v-r)&15));
43 ed7c8e8d 2003-09-30 devnull }
44 ed7c8e8d 2003-09-30 devnull */
45 ed7c8e8d 2003-09-30 devnull
46 ed7c8e8d 2003-09-30 devnull int
47 ed7c8e8d 2003-09-30 devnull rgb2cmap(int cr, int cg, int cb)
48 ed7c8e8d 2003-09-30 devnull {
49 ed7c8e8d 2003-09-30 devnull int i, r, g, b, sq;
50 ed7c8e8d 2003-09-30 devnull u32int rgb;
51 ed7c8e8d 2003-09-30 devnull int best, bestsq;
52 ed7c8e8d 2003-09-30 devnull
53 ed7c8e8d 2003-09-30 devnull best = 0;
54 ed7c8e8d 2003-09-30 devnull bestsq = 0x7FFFFFFF;
55 ed7c8e8d 2003-09-30 devnull for(i=0; i<256; i++){
56 ed7c8e8d 2003-09-30 devnull rgb = cmap2rgb(i);
57 ed7c8e8d 2003-09-30 devnull r = (rgb>>16) & 0xFF;
58 ed7c8e8d 2003-09-30 devnull g = (rgb>>8) & 0xFF;
59 ed7c8e8d 2003-09-30 devnull b = (rgb>>0) & 0xFF;
60 ed7c8e8d 2003-09-30 devnull sq = (r-cr)*(r-cr)+(g-cg)*(g-cg)+(b-cb)*(b-cb);
61 ed7c8e8d 2003-09-30 devnull if(sq < bestsq){
62 ed7c8e8d 2003-09-30 devnull bestsq = sq;
63 ed7c8e8d 2003-09-30 devnull best = i;
64 ed7c8e8d 2003-09-30 devnull }
65 ed7c8e8d 2003-09-30 devnull }
66 ed7c8e8d 2003-09-30 devnull return best;
67 ed7c8e8d 2003-09-30 devnull }
68 ed7c8e8d 2003-09-30 devnull
69 ed7c8e8d 2003-09-30 devnull int
70 ed7c8e8d 2003-09-30 devnull cmap2rgb(int c)
71 ed7c8e8d 2003-09-30 devnull {
72 ed7c8e8d 2003-09-30 devnull int j, num, den, r, g, b, v, rgb;
73 ed7c8e8d 2003-09-30 devnull
74 ed7c8e8d 2003-09-30 devnull r = c>>6;
75 ed7c8e8d 2003-09-30 devnull v = (c>>4)&3;
76 ed7c8e8d 2003-09-30 devnull j = (c-v+r)&15;
77 ed7c8e8d 2003-09-30 devnull g = j>>2;
78 ed7c8e8d 2003-09-30 devnull b = j&3;
79 ed7c8e8d 2003-09-30 devnull den=r;
80 ed7c8e8d 2003-09-30 devnull if(g>den)
81 ed7c8e8d 2003-09-30 devnull den=g;
82 ed7c8e8d 2003-09-30 devnull if(b>den)
83 ed7c8e8d 2003-09-30 devnull den=b;
84 ed7c8e8d 2003-09-30 devnull if(den==0) {
85 ed7c8e8d 2003-09-30 devnull v *= 17;
86 ed7c8e8d 2003-09-30 devnull rgb = (v<<16)|(v<<8)|v;
87 ed7c8e8d 2003-09-30 devnull }
88 ed7c8e8d 2003-09-30 devnull else{
89 ed7c8e8d 2003-09-30 devnull num=17*(4*den+v);
90 ed7c8e8d 2003-09-30 devnull rgb = ((r*num/den)<<16)|((g*num/den)<<8)|(b*num/den);
91 ed7c8e8d 2003-09-30 devnull }
92 ed7c8e8d 2003-09-30 devnull return rgb;
93 ed7c8e8d 2003-09-30 devnull }
94 ed7c8e8d 2003-09-30 devnull
95 ed7c8e8d 2003-09-30 devnull int
96 ed7c8e8d 2003-09-30 devnull cmap2rgba(int c)
97 ed7c8e8d 2003-09-30 devnull {
98 ed7c8e8d 2003-09-30 devnull return (cmap2rgb(c)<<8)|0xFF;
99 ed7c8e8d 2003-09-30 devnull }