Annotation of researchv10no/cmd/view2d/metheus.c, revision 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.