Annotation of researchv8dc/cmd/view2d/cvmap.c, revision 1.1.1.1

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:         SAVCOLOR;
                     62:       }
                     63:       break;
                     64:     case 'g':   /* normal map, corrected for gamma */
                     65:       for(i=0; i<=maxi; i++){
                     66:         r=sqrt(i/dm); g=sqrt(i/dm); b=sqrt(i/dm);
                     67:         SAVCOLOR;
                     68:       }
                     69:       break;
                     70:     default:
                     71:     err:
                     72:       fprintf(stderr,"unrecognized color map %s\n",map);
                     73:   }
                     74:   for(i=0; i<=maxi; i++){
                     75:     cvput(0x1C);cvput(i);
                     76:       cvput(mapr[i]);cvput(mapg[i]);cvput(mapb[i]);
                     77:   }
                     78:   if(antial){
                     79:     for(j=1;j<4;j++){
                     80:       for(i=0; i<=maxi; i++){
                     81:         cvput(0x1C);cvput(i+j*(maxi+1));
                     82:           r=mapr[i]/254.5; r=r*r; r=(4-j)*r/4; cvput((int)(254.999*sqrt(r)));
                     83:           r=mapg[i]/254.5; r=r*r; r=(4-j)*r/4; cvput((int)(254.999*sqrt(r)));
                     84:           r=mapb[i]/254.5; r=r*r; r=(4-j)*r/4; cvput((int)(254.999*sqrt(r)));
                     85:       }
                     86:     }
                     87:   }
                     88:   cvput(0x1B); cvput(255); cvput(0);    /* LUTA */
                     89:   return(255);
                     90: }
                     91: 
                     92: brit(r,g,b)
                     93:   double *r, *g, *b;
                     94: {
                     95:   /*  convert from r+g+b=1 to max(r,g,b)=1 */
                     96:   double t;
                     97:   t = (*r>*b)?*r:*b;
                     98:   if(*g>t) t = *g;
                     99:   *r /= t;
                    100:   *g /= t;
                    101:   *b /= t;
                    102: }
                    103: 
                    104: 
                    105: 
                    106: /**** taken from /n/research/netlib/misc/rainbow *****/
                    107: /*   rainbow(h, s, v, r, g, b)
                    108:      double h, s, v, *r, *g, *b;
                    109: 
                    110:  This routine computes colors suitable for use in color level plots.
                    111:  Typically s=v=1 and h varies from 0 (red) to 1 (blue) in
                    112:  equally spaced steps.  (h>1 gives magenta.)
                    113:  To convert for frame buffer, use   R = (int)(255.999*sqrt(*r))  etc.
                    114:  complaints =>  Eric Grosse   research!ehg    201-582-5828
                    115: */
                    116: 
                    117: #include <math.h>
                    118: double huextab[] = {
                    119:   .0000,.0156,.0313,.0469,.0625,.0781,.0938,.1094,.1250,.1406,
                    120:   .1563,.1719,.1875,.2031,.2188,.2344,.2500,.2656,.2813,.2969,
                    121:   .3125,.3281,.3438,.3594,.3750,.3906,.4063,.4219,.4375,.4531,
                    122:   .4688,.4844,.5000,.5156,.5313,.5469,.5625,.5781,.5938,.6094,
                    123:   .6250,.6406,.6563,.6719,.6875,.7031,.7188,.7344,.7500,.7656,
                    124:   .7813,.7969,.8125,.8281,.8438,.8594,.8750,.8906,.9063,.9219,
                    125:   .9375,.9531,.9688,.9844,1.  };
                    126: double huettab[] = {
                    127:   .0000,.0052,.0105,.0160,.0218,.0277,.0339,.0404,.0471,.0542,
                    128:   .0616,.0693,.0775,.0862,.0954,.1052,.1157,.1269,.1390,.1519,
                    129:   .1660,.1824,.1974,.2115,.2248,.2374,.2495,.2609,.2719,.2824,
                    130:   .2926,.3023,.3118,.3210,.3300,.3456,.3600,.3761,.3943,.4153,
                    131:   .4399,.4688,.5048,.5211,.5359,.5494,.5617,.5729,.5832,.5925,
                    132:   .6010,.6088,.6160,.6225,.6285,.6340,.6390,.6436,.6478,.6516,
                    133:   .6552,.6584,.6614,.6642,.6667 };
                    134:   /* computed from the FMC-1 color difference formula */
                    135:   /* Hitachi monitor, max(r,g,b)=1, n=65,  7 Jan 1985 */
                    136: 
                    137: rainbow(h, s, v, r, g, b)
                    138: double h, s, v, *r, *g, *b;
                    139: {
                    140:   double *x = huextab;
                    141:   double *t = huettab;
                    142:   while( (x[1]<=h) && (x[1]<1.) ){ ++x; ++t; }
                    143:   h = t[0] + (t[1]-t[0])*(h-x[0])/(x[1]-x[0]);
                    144:   dhsv2rgb(h,s,v,r,g,b);
                    145: }
                    146: 
                    147: dhsv2rgb(h, s, v, r, g, b)    /*...hexcone model...*/
                    148: double h, s, v, *r, *g, *b;    /* all variables in range [0,1] */
                    149: {
                    150:   int i;
                    151:   double f, m, n, k;
                    152:   h *= 6;
                    153:   i = (int)floor(h);
                    154:   f = h-i;
                    155:   m = (1-s);
                    156:   n = (1-s*f);
                    157:   k = (1-(s*(1-f)));
                    158:   switch(i){
                    159:     case 0: *r=1; *g=k; *b=m; break;
                    160:     case 1: *r=n; *g=1; *b=m; break;
                    161:     case 2: *r=m; *g=1; *b=k; break;
                    162:     case 3: *r=m; *g=n; *b=1; break;
                    163:     case 4: *r=k; *g=m; *b=1; break;
                    164:     case 5: *r=1; *g=m; *b=n; break;
                    165:     default: error("bad i: %f %d",h,i);
                    166:   }
                    167:   f = *r;
                    168:   if( f < *g ) f = *g;
                    169:   if( f < *b ) f = *b;
                    170:   f = v / f;
                    171:   *r *= f;
                    172:   *g *= f;
                    173:   *b *= f;
                    174: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.