diff options
Diffstat (limited to 'crawl-ref/source/rltiles/tool/shade.c')
-rw-r--r-- | crawl-ref/source/rltiles/tool/shade.c | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/crawl-ref/source/rltiles/tool/shade.c b/crawl-ref/source/rltiles/tool/shade.c new file mode 100644 index 0000000000..3e7d7f715b --- /dev/null +++ b/crawl-ref/source/rltiles/tool/shade.c @@ -0,0 +1,254 @@ +#include "bm.h" + +int myrand() +{ + static int seed=12345; + seed *= 65539; + return(seed&0x7fffffff); +} + +int same_hue(int r, int g, int b, int r0, int g0, int b0) +{ + if (r==255)r=256; + if (g==255)g=256; + if (b==255)b=256; + + if(r0*g == g0*r && g0*b == b0*g && b0*r == r0*b) return 1; + return 0; +} + +void convert_hue(unsigned char *r, unsigned char *g, unsigned char *b, + int r0, int g0, int b0, int modif) +{ + int rr,gg,bb; + int max0 = r0; + int max = *r; + if(max<*g) max=*g; + if(max<*b) max=*b; + if(max==255) max=256; + + if(max0<g0) max0=g0; + if(max0<b0) max0=b0; + + if (max <=32) modif /= 4; + else + if (max <=64) modif /= 2; + + rr = ( (max+modif) * r0 )/ max0; + gg = ( (max+modif) * g0 )/ max0; + bb = ( (max+modif) * b0 )/ max0; + + if(rr>255) rr=255; + else if(rr<0) rr=0; + if(gg>255) gg=255; + else if(gg<0) gg=0; + if(bb>255) bb=255; + else if(bb<0) bb=0; + + *r=rr; *g=gg; *b=bb; +} + + +int main(int argc, char **argv){ + +unsigned char *ibuf[3]; +int x,y; +int i; +char fn[100],st[1024]; +char *flag; +unsigned char *nbuf[3]; +int ncol[3],ccol[10][3],nccol,ccol2[10][3], modif[10]; +FILE *ifp; +int level,l; +int xx,yy,c,f; +float prob,amp; +int thresh; + + stdpal(); + process_cpath(argv[0]); + +if(argc!=1) + strcpy(fn, argv[1]); +else + sprintf(fn,"%sshade.txt",cpath); + +fprintf(stderr,"FILE=[%s]\n",fn); + +ifp=fopen(fn,"r"); +myfget(st,ifp); +sprintf(fn,"%s%s.bmp",cpath,st); +fprintf(stderr,"Orig file=[%s]\n",fn); +ibuf[0]=ibuf[1]=ibuf[2]=NULL; +bmread(fn,&x,&y,ibuf ); +fprintf(stderr,"loaded x=%d y=%d\n",x,y); +flag=malloc(x*y); +for(i=0;i<3;i++)nbuf[i]=malloc(x*y); + +while(1){ +myfget(st,ifp); +if(feof(ifp))break; +level=atoi(st); + +//random perturbation amplitude/prob +myfget(st,ifp); +prob=atof(st); +thresh=(int)(0x7fffffff*prob); +if(prob==-1.0)thresh=-1;//ringmail +if(prob==-2.0)thresh=-2;//chainmail + +myfget(st,ifp); +amp=atof(st); +printf("P=%f Amp=%f\n",prob,amp); + +// Normal col +myfget(st,ifp); +fprintf(stderr,"Normal [%s]\n",st); +sscanf(st,"%d %d %d",&ncol[0],&ncol[1],&ncol[2]); + +//Control col +myfget(st,ifp); +if(feof(ifp))break; +nccol=atoi(st); + +for(i=0;i<nccol;i++){ + myfget(st,ifp); + if(feof(ifp))exit(1); + modif[i]=0; + l=sscanf(st,"%d %d %d %d %d %d %d",&ccol[i][0],&ccol[i][1],&ccol[i][2] + ,&ccol2[i][0],&ccol2[i][1],&ccol2[i][2], &modif[i]); + if(l==3){ + ccol2[i][0]=ccol[i][0]; + ccol2[i][1]=ccol[i][1]; + ccol2[i][2]=ccol[i][2]; + } +}//ncol + +fprintf(stderr,"Level=%d ccol=%d\n",level,nccol); +fprintf(stderr,"Normal=%d %d %d\n",ncol[0],ncol[1],ncol[2]); + +for(xx=0;xx<x;xx++){ +for(yy=0;yy<y;yy++){ +int ad=xx+yy*x; +flag[ad]=0; +if( same_hue(ibuf[0][ad], ibuf[1][ad], ibuf[2][ad], + ncol[0], ncol[1], ncol[2])) flag[ad]=1; +else +{ +for(i=0;i<nccol;i++) + if(same_hue(ibuf[0][ad], ibuf[1][ad], ibuf[2][ad], + ccol[i][0], ccol[i][1], ccol[i][2])) flag[ad]=2+i; +} +}} +/***** convert ******/ +for(xx=0;xx<x;xx++){ +for(yy=0;yy<y;yy++){ + int ad=xx+yy*x; + int f=flag[ad]; + if(f>1) convert_hue(&ibuf[0][ad],&ibuf[1][ad],&ibuf[2][ad], + ccol2[f-2][0],ccol2[f-2][1],ccol2[f-2][2], modif[f-2]); +} +} + +/********************************/ +for(l=0;l<level;l++){ +for(yy=0;yy<y;yy++){ +for(xx=0;xx<x;xx++){ +int ad=xx+yy*x; +int sum,n; +if(flag[ad]!=1){ +for(c=0;c<3;c++)nbuf[c][ad]=ibuf[c][ad]; +continue; +} +for(c=0;c<3;c++){ +n=0;sum=0; // (int)(ibuf[c][ad])*1; +if(xx>0 && flag[ad-1]!=0){n++;sum+=ibuf[c][ad-1];} +if(xx<x-1 && flag[ad+1]!=0){n++;sum+=ibuf[c][ad+1];} +if(yy>0 && flag[ad-x]!=0){n++;sum+=ibuf[c][ad-x];} +if(yy<y-1 && flag[ad+x]!=0){n++;sum+=ibuf[c][ad+x];} +if(n!=0){ +sum +=n/2; +sum/=n; +nbuf[c][ad]=sum; +}else nbuf[c][ad]=ibuf[c][ad]; +}/*c*/ +ad++; +}}/*xy**/ + +for(xx=0;xx<x;xx++){ +for(yy=0;yy<y;yy++){ +int ad=xx+yy*x; +for(c=0;c<3;c++){ +ibuf[c][ad]=nbuf[c][ad];}}} +}/*level*/ + +/**random **/ +if(thresh==-1){//ringmail + +for(xx=0;xx<x;xx++){ +for(yy=0;yy<y;yy++){ + int ad=xx+yy*x; + if(flag[ad]!=0){ + int dd=0; + int flag=(xx+2000-3*yy)%5; + if(flag==0)dd=+64; + if(flag==3||flag==4)dd=-32; + for(c=0;c<3;c++){ + int d=(int)ibuf[c][ad]; + d=(int)(d+dd); + if(d>255)d=255; + if(d<0)d=0; + ibuf[c][ad]=(unsigned char)d; + } +} +}}//XY +}//ringmail +if(thresh==-2){//chainmail + +for(xx=0;xx<x;xx++){ +for(yy=0;yy<y;yy++){ + int ad=xx+yy*x; +if(flag[ad]!=0){ + int dd=0; + int flag=(xx+2000-2*yy)%4; + if(flag==0)dd=+64; + if(flag==1)dd=+32; + if(flag==3)dd=-32; + for(c=0;c<3;c++){ + int d=(int)ibuf[c][ad]; + d=(int)(d+dd); + if(d>255)d=255; + if(d<0)d=0; + ibuf[c][ad]=(unsigned char)d; + } +} +}}//XY +}//chainmail + +if(thresh>0){ +for(xx=0;xx<x;xx++){ +for(yy=0;yy<y;yy++){ + int ad=xx+yy*x; +if(myrand()<thresh && flag[ad]!=0){ + + double r=1.0-amp+2*amp*(myrand()*1.0/0x7fffffff); + if(r<0.0)r=0.0; + for(c=0;c<3;c++){ + int d=(int)ibuf[c][ad]; + d=(int)(d*r); + if(d>255)d=255; + if(d<0)d=0; + ibuf[c][ad]=(unsigned char)d; + } +} +}}//XY +}//if + +}/*while*/ + +sprintf(fn,"%sb.bmp",cpath); +bmwrite_dither(fn,x,y,ibuf ,flag); + + +fclose(ifp); + +} |