Annotation of researchv10no/cmd/view2d/metheus.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <libc.h>
                      3: #include <math.h>
                      4: #include "3610op.h"
                      5: 
                      6: minit(cold)
                      7: {
                      8:   msnare();
                      9:   mcmd(INI);
                     10:   mcmd(WRMSKL); mlong(0xffffffff);
                     11:   mcmd(WRBANK); mbyte(15);
                     12:   mcmd(SELRES); mbyte(0xc0); mbyte(0);  /* 8-bit mode */
                     13:   mcmd(CMSEL); mbyte(0); mbyte(0);     /* write in cmap buffer 0 */
                     14:   mcmd(CMRAMP);mword(0);mword(256);     /* default linear color map */
                     15:     mbyte(0);mbyte(0);mbyte(0);
                     16:     mbyte(255);mbyte(255);mbyte(255);
                     17:   mcmd(CMACT);                         /* make current buffer active */
                     18:   mcmd(SETCLL); mbyte(0); mbyte(0); mbyte(0); mbyte(0);
                     19:   mcmd(CLEAR);                         /* clear all pixels */
                     20:   mflush();
                     21: }
                     22: 
                     23: colmap(maxi,mapr,mapg,mapb)
                     24:   int maxi;
                     25:   int mapr[],mapg[],mapb[]; /* colors, 0 through maxi */
                     26: {
                     27:   int i;
                     28:   mcmd(CMSEL); mbyte(0); mbyte(0);     /* write in cmap buffer 0 */
                     29:   mcmd(CMLDM); mword(0);mword(maxi+2); /* load entries at loc. 0 */
                     30:   mbyte(0);mbyte(0);mbyte(0);  /* index 0 is for black background */
                     31:   for(i=0; i<=maxi; i++){
                     32:     mbyte(mapr[i]); mbyte(mapg[i]); mbyte(mapb[i]);
                     33:   }
                     34:   if((maxi+2)&1) mbyte(0);
                     35:   mcmd(CMACT);                         /* make current buffer active */
                     36:   mflush();
                     37: }
                     38: 
                     39: image(in, x0, y0, x1, y1)
                     40:   char *in;
                     41: {
                     42:   int around=0;
                     43:   long n, saved, m;
                     44:   if(((int)in)&1){ error("odd address\n"); }
                     45:   n=(x1-x0+1)*(y1-y0+1);
                     46:   mcmd(MOVP1); mword(x0); mword(1023-y1);  /* upper left */
                     47:   mcmd(MOVP2); mword(x1); mword(1023-y0);  /* lower right */
                     48:   mcmd(WRR);
                     49:   mflush();
                     50:   if(n&1) n++;  /* hope this doesn't lead to a memory fault */
                     51:   Write(mfd, in, n);
                     52: }
                     53: 
                     54: zoom(fact)
                     55:   int fact;
                     56: {
                     57:   mcmd(ZOOM);mbyte(fact);
                     58: }
                     59: 
                     60: pan(x,y)
                     61:   int x, y;  /* upper left corner */
                     62: {
                     63:   mcmd(SYNCH);mword(0); /* next instruction should happen during vert retrace */
                     64:   mcmd(MOVP1);mword(x);mword(1023-y);
                     65:   mcmd(PPAN);
                     66:   mflush();
                     67: }
                     68: 
                     69: 
                     70: #define SAVCOLOR    mapr[i]=255.499*r;mapg[i]=255.499*g;mapb[i]=255.499*b;
                     71: 
                     72: cvmap ( map, maxi, mapr,mapg,mapb )  /* load color map */
                     73:   char *map;   /* string describing kind of map */
                     74:   int maxi;
                     75:   int mapr[],mapg[],mapb[]; /* colors, 0 through maxi */
                     76: {
                     77:   int i, j;
                     78:   int max1, max2;
                     79:   double r, g, b;
                     80:   double dm = maxi;
                     81:   double sqrt();
                     82:   FILE *mapf;
                     83:   if(maxi<0) error("maxi must be >= 0");
                     84:   if(maxi>=254) error("maxi must be < 254");
                     85:   switch(*map){
                     86:     case 'f': /* input from file */
                     87:       mapf = fopen(map+1,"r");
                     88:       if( mapf==NULL ) error("can't open %s",map+1);
                     89:       for(i=0; i<=maxi; i++){
                     90:         if(fscanf(mapf,"%d %d %d",&mapr[i],&mapg[i],&mapb[i])!=3)
                     91:           error("trouble reading color map %d",i);
                     92:       }
                     93:       fclose(mapf);
                     94:       break;
                     95:     case 'r': /* red v. blue */
                     96:       for(i=0; i<=maxi; i++){
                     97:         r=sqrt(i/dm); g=sqrt(0.); b=sqrt(1-i/dm);
                     98:         brit(&r,&g,&b);
                     99:         SAVCOLOR;
                    100:       }
                    101:       break;
                    102:     case NULL:
                    103:     case 's': /* blue-to-red rainbow */
                    104:       for(i=0; i<=maxi; i++){
                    105:         rainbow(1-i/dm,1.,1.,&r,&g,&b);
                    106:         r=sqrt(r); g=sqrt(g); b=sqrt(b);
                    107:         SAVCOLOR;
                    108:       }
                    109:       break;
                    110:     case 'g':   /* normal map, corrected for gamma */
                    111:       for(i=0; i<=maxi; i++){
                    112:         r=sqrt(i/dm); g=sqrt(i/dm); b=sqrt(i/dm);
                    113:         SAVCOLOR;
                    114:       }
                    115:       break;
                    116:     case 'i':   /* like g, but inverse video */
                    117:       for(i=0; i<=maxi; i++){
                    118:         r=sqrt(1-i/dm); g=sqrt(1-i/dm); b=sqrt(1-i/dm);
                    119:         SAVCOLOR;
                    120:       }
                    121:       break;
                    122:     case 'n':   /* no-op, use default linear color map */
                    123:       return(0);
                    124:     default:
                    125:     err:
                    126:       fprintf(stderr,"unrecognized color map %s\n",map);
                    127:   }
                    128:   colmap(maxi,mapr,mapg,mapb);
                    129: }
                    130: 
                    131: brit(r,g,b)
                    132:   double *r, *g, *b;
                    133: {
                    134:   /*  convert from r+g+b=1 to max(r,g,b)=1 */
                    135:   double t;
                    136:   t = (*r>*b)?*r:*b;
                    137:   if(*g>t) t = *g;
                    138:   *r /= t;
                    139:   *g /= t;
                    140:   *b /= t;
                    141: }
                    142: 
                    143: 
                    144: 
                    145: /**** taken from /n/research/netlib/misc/rainbow *****/
                    146: /*   rainbow(h, s, v, r, g, b)
                    147:      double h, s, v, *r, *g, *b;
                    148: 
                    149:  This routine computes colors suitable for use in color level plots.
                    150:  Typically s=v=1 and h varies from 0 (red) to 1 (blue) in
                    151:  equally spaced steps.  (h>1 gives magenta.)
                    152:  To convert for frame buffer, use   R = (int)(255.999*sqrt(*r))  etc.
                    153:  complaints =>  Eric Grosse   research!ehg    201-582-5828
                    154: */
                    155: 
                    156: #include <math.h>
                    157: double huextab[] = {
                    158:   .0000,.0156,.0313,.0469,.0625,.0781,.0938,.1094,.1250,.1406,
                    159:   .1563,.1719,.1875,.2031,.2188,.2344,.2500,.2656,.2813,.2969,
                    160:   .3125,.3281,.3438,.3594,.3750,.3906,.4063,.4219,.4375,.4531,
                    161:   .4688,.4844,.5000,.5156,.5313,.5469,.5625,.5781,.5938,.6094,
                    162:   .6250,.6406,.6563,.6719,.6875,.7031,.7188,.7344,.7500,.7656,
                    163:   .7813,.7969,.8125,.8281,.8438,.8594,.8750,.8906,.9063,.9219,
                    164:   .9375,.9531,.9688,.9844,1.  };
                    165: double huettab[] = {
                    166:   .0000,.0052,.0105,.0160,.0218,.0277,.0339,.0404,.0471,.0542,
                    167:   .0616,.0693,.0775,.0862,.0954,.1052,.1157,.1269,.1390,.1519,
                    168:   .1660,.1824,.1974,.2115,.2248,.2374,.2495,.2609,.2719,.2824,
                    169:   .2926,.3023,.3118,.3210,.3300,.3456,.3600,.3761,.3943,.4153,
                    170:   .4399,.4688,.5048,.5211,.5359,.5494,.5617,.5729,.5832,.5925,
                    171:   .6010,.6088,.6160,.6225,.6285,.6340,.6390,.6436,.6478,.6516,
                    172:   .6552,.6584,.6614,.6642,.6667 };
                    173:   /* computed from the FMC-1 color difference formula */
                    174:   /* Hitachi monitor, max(r,g,b)=1, n=65,  7 Jan 1985 */
                    175: 
                    176: rainbow(h, s, v, r, g, b)
                    177: double h, s, v, *r, *g, *b;
                    178: {
                    179:   double *x = huextab;
                    180:   double *t = huettab;
                    181:   while( (x[1]<=h) && (x[1]<1.) ){ ++x; ++t; }
                    182:   h = t[0] + (t[1]-t[0])*(h-x[0])/(x[1]-x[0]);
                    183:   dhsv2rgb(h,s,v,r,g,b);
                    184: }
                    185: 
                    186: dhsv2rgb(h, s, v, r, g, b)    /*...hexcone model...*/
                    187: double h, s, v, *r, *g, *b;    /* all variables in range [0,1] */
                    188: {
                    189:   int i;
                    190:   double f, m, n, k;
                    191:   h *= 6;
                    192:   i = (int)floor(h);
                    193:   f = h-i;
                    194:   m = (1-s);
                    195:   n = (1-s*f);
                    196:   k = (1-(s*(1-f)));
                    197:   switch(i){
                    198:     case 0: *r=1; *g=k; *b=m; break;
                    199:     case 1: *r=n; *g=1; *b=m; break;
                    200:     case 2: *r=m; *g=1; *b=k; break;
                    201:     case 3: *r=m; *g=n; *b=1; break;
                    202:     case 4: *r=k; *g=m; *b=1; break;
                    203:     case 5: *r=1; *g=m; *b=n; break;
                    204:     default: error("bad i: %f %d",h,i);
                    205:   }
                    206:   f = *r;
                    207:   if( f < *g ) f = *g;
                    208:   if( f < *b ) f = *b;
                    209:   f = v / f;
                    210:   *r *= f;
                    211:   *g *= f;
                    212:   *b *= f;
                    213: }

unix.superglobalmegacorp.com

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