|
|
1.1 root 1: /*
2: format of color map for experimental anti-aliasing:
3: 0- 62 brightest rainbow
4: 64-126 3/4 bright
5: 128-190 1/2 bright
6: 192-254 1/4 bright
7: 255 black
8: */
9:
10: #include <stdio.h>
11: #define RED 0x4
12: #define GREEN 0x2
13: #define BLUE 0x1
14: #define SAVCOLOR mapr[i]=255.499*r;mapg[i]=255.499*g;mapb[i]=255.499*b;
15:
16: int
17: cvmap ( map, maxi, mapr,mapg,mapb ) /* load color map, return black index*/
18: char *map; /* string describing kind of map */
19: int maxi;
20: int mapr[],mapg[],mapb[]; /* colors, 0 through maxi */
21: {
22: int i, j;
23: int max1, max2;
24: double r, g, b;
25: double dm = maxi;
26: double sqrt();
27: int antial = 0;
28: FILE *mapf;
29: if(maxi<0) error("maxi must be >= 0");
30: if(maxi>=254) error("maxi must be < 254");
31: switch(*map){
32: case 'a': /* experimental -- for anti-aliasing */
33: antial++;
34: maxi=62;
35: dm = maxi;
36: for(i=0; i<=maxi; i++){
37: rainbow(1-i/dm,1.,1.,&r,&g,&b);
38: SAVCOLOR;
39: }
40: break;
41: case 'f': /* input from file */
42: mapf = fopen(map+1,"r");
43: if( mapf==NULL ) error("can't open %s",map+1);
44: for(i=0; i<=maxi; i++){
45: if(fscanf(mapf,"%d %d %d",&mapr[i],&mapg[i],&mapb[i])!=3)
46: error("trouble reading color map %d",i);
47: }
48: fclose(mapf);
49: break;
50: case 'r': /* red v. blue */
51: for(i=0; i<=maxi; i++){
52: r=sqrt(i/dm); g=sqrt(0.); b=sqrt(1-i/dm);
53: brit(&r,&g,&b);
54: SAVCOLOR;
55: }
56: break;
57: case NULL:
58: case 's': /* blue-to-red rainbow */
59: for(i=0; i<=maxi; i++){
60: rainbow(1-i/dm,1.,1.,&r,&g,&b);
61: r=sqrt(r); g=sqrt(g); b=sqrt(b);
62: SAVCOLOR;
63: }
64: break;
65: case 'g': /* normal map, corrected for gamma */
66: for(i=0; i<=maxi; i++){
67: r=sqrt(i/dm); g=sqrt(i/dm); b=sqrt(i/dm);
68: SAVCOLOR;
69: }
70: break;
71: case 'i': /* like g, but inverse video */
72: for(i=0; i<=maxi; i++){
73: r=sqrt(1-i/dm); g=sqrt(1-i/dm); b=sqrt(1-i/dm);
74: SAVCOLOR;
75: }
76: break;
77: default:
78: err:
79: fprintf(stderr,"unrecognized color map %s\n",map);
80: }
81: for(i=0; i<=maxi; i++){
82: cvput(0x1C);cvput(i);
83: cvput(mapr[i]);cvput(mapg[i]);cvput(mapb[i]);
84: }
85: if(antial){
86: for(j=1;j<4;j++){
87: for(i=0; i<=maxi; i++){
88: cvput(0x1C);cvput(i+j*(maxi+1));
89: r=mapr[i]/254.5; r=r*r; r=(4-j)*r/4; cvput((int)(254.999*sqrt(r)));
90: r=mapg[i]/254.5; r=r*r; r=(4-j)*r/4; cvput((int)(254.999*sqrt(r)));
91: r=mapb[i]/254.5; r=r*r; r=(4-j)*r/4; cvput((int)(254.999*sqrt(r)));
92: }
93: }
94: }
95: cvput(0x1B); cvput(255); cvput(0); /* LUTA */
96: return(255);
97: }
98:
99: brit(r,g,b)
100: double *r, *g, *b;
101: {
102: /* convert from r+g+b=1 to max(r,g,b)=1 */
103: double t;
104: t = (*r>*b)?*r:*b;
105: if(*g>t) t = *g;
106: *r /= t;
107: *g /= t;
108: *b /= t;
109: }
110:
111:
112:
113: /**** taken from /n/research/netlib/misc/rainbow *****/
114: /* rainbow(h, s, v, r, g, b)
115: double h, s, v, *r, *g, *b;
116:
117: This routine computes colors suitable for use in color level plots.
118: Typically s=v=1 and h varies from 0 (red) to 1 (blue) in
119: equally spaced steps. (h>1 gives magenta.)
120: To convert for frame buffer, use R = (int)(255.999*sqrt(*r)) etc.
121: complaints => Eric Grosse research!ehg 201-582-5828
122: */
123:
124: #include <math.h>
125: double huextab[] = {
126: .0000,.0156,.0313,.0469,.0625,.0781,.0938,.1094,.1250,.1406,
127: .1563,.1719,.1875,.2031,.2188,.2344,.2500,.2656,.2813,.2969,
128: .3125,.3281,.3438,.3594,.3750,.3906,.4063,.4219,.4375,.4531,
129: .4688,.4844,.5000,.5156,.5313,.5469,.5625,.5781,.5938,.6094,
130: .6250,.6406,.6563,.6719,.6875,.7031,.7188,.7344,.7500,.7656,
131: .7813,.7969,.8125,.8281,.8438,.8594,.8750,.8906,.9063,.9219,
132: .9375,.9531,.9688,.9844,1. };
133: double huettab[] = {
134: .0000,.0052,.0105,.0160,.0218,.0277,.0339,.0404,.0471,.0542,
135: .0616,.0693,.0775,.0862,.0954,.1052,.1157,.1269,.1390,.1519,
136: .1660,.1824,.1974,.2115,.2248,.2374,.2495,.2609,.2719,.2824,
137: .2926,.3023,.3118,.3210,.3300,.3456,.3600,.3761,.3943,.4153,
138: .4399,.4688,.5048,.5211,.5359,.5494,.5617,.5729,.5832,.5925,
139: .6010,.6088,.6160,.6225,.6285,.6340,.6390,.6436,.6478,.6516,
140: .6552,.6584,.6614,.6642,.6667 };
141: /* computed from the FMC-1 color difference formula */
142: /* Hitachi monitor, max(r,g,b)=1, n=65, 7 Jan 1985 */
143:
144: rainbow(h, s, v, r, g, b)
145: double h, s, v, *r, *g, *b;
146: {
147: double *x = huextab;
148: double *t = huettab;
149: while( (x[1]<=h) && (x[1]<1.) ){ ++x; ++t; }
150: h = t[0] + (t[1]-t[0])*(h-x[0])/(x[1]-x[0]);
151: dhsv2rgb(h,s,v,r,g,b);
152: }
153:
154: dhsv2rgb(h, s, v, r, g, b) /*...hexcone model...*/
155: double h, s, v, *r, *g, *b; /* all variables in range [0,1] */
156: {
157: int i;
158: double f, m, n, k;
159: h *= 6;
160: i = (int)floor(h);
161: f = h-i;
162: m = (1-s);
163: n = (1-s*f);
164: k = (1-(s*(1-f)));
165: switch(i){
166: case 0: *r=1; *g=k; *b=m; break;
167: case 1: *r=n; *g=1; *b=m; break;
168: case 2: *r=m; *g=1; *b=k; break;
169: case 3: *r=m; *g=n; *b=1; break;
170: case 4: *r=k; *g=m; *b=1; break;
171: case 5: *r=1; *g=m; *b=n; break;
172: default: error("bad i: %f %d",h,i);
173: }
174: f = *r;
175: if( f < *g ) f = *g;
176: if( f < *b ) f = *b;
177: f = v / f;
178: *r *= f;
179: *g *= f;
180: *b *= f;
181: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.