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