xref: /plan9-contrib/sys/src/cmd/unix/drawterm/libdraw/rgb.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1 #include "../lib9.h"
2 
3 #include "../libdraw/draw.h"
4 
5 int
6 rgb2cmap(int cr, int cg, int cb)
7 {
8 	int r, g, b, v, cv;
9 
10 	if(cr < 0)
11 		cr = 0;
12 	else if(cr > 255)
13 		cr = 255;
14 	if(cg < 0)
15 		cg = 0;
16 	else if(cg > 255)
17 		cg = 255;
18 	if(cb < 0)
19 		cb = 0;
20 	else if(cb > 255)
21 		cb = 255;
22 	r = cr>>6;
23 	g = cg>>6;
24 	b = cb>>6;
25 	cv = cr;
26 	if(cg > cv)
27 		cv = cg;
28 	if(cb > cv)
29 		cv = cb;
30 	v = (cv>>4)&3;
31 	return ((((r<<2)+v)<<4)+(((g<<2)+b+v-r)&15));
32 }
33 
34 int
35 cmap2rgb(int c)
36 {
37 	int j, num, den, r, g, b, v, rgb;
38 
39 	r = c>>6;
40 	v = (c>>4)&3;
41 	j = (c-v+r)&15;
42 	g = j>>2;
43 	b = j&3;
44 	den=r;
45 	if(g>den)
46 		den=g;
47 	if(b>den)
48 		den=b;
49 	if(den==0) {
50 		v *= 17;
51 		rgb = (v<<16)|(v<<8)|v;
52 	}
53 	else{
54 		num=17*(4*den+v);
55 		rgb = ((r*num/den)<<16)|((g*num/den)<<8)|(b*num/den);
56 	}
57 	return rgb;
58 }
59 
60 int
61 cmap2rgba(int c)
62 {
63 	return (cmap2rgb(c)<<8)|0xFF;
64 }
65