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