Annotation of researchv10no/cmd/view2d/Old/metheus/cvmap.c, revision 1.1

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

unix.superglobalmegacorp.com

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