📄 wzpixmap.cxx
字号:
//#include <iostream.h>#include "wzoutput.hxx"#include <stdio.h>#include <stdlib.h>#include "wzpixmap.hxx" wzTrueColorPixmap::wzTrueColorPixmap(int lx,int ly):Lx(lx),Ly(ly){c(lx*ly);}void wzTrueColorPixmap::save(wzString fname) const{int i,j; FILE* file = fopen(fname,"w"); if(file==NULL){ throw wzFileOpenError();} fprintf(file,"P6\n"); fprintf(file,"# created by WZ 1.0\n"); fprintf(file,"%d %d\n",Lx,Ly); fprintf(file,"255\n"); for(i=0;i<Ly;i++) for(j=0;j<Lx;j++){ fputc((*this)(j,i).r(),file); fputc((*this)(j,i).g(),file); fputc((*this)(j,i).b(),file); }}void wzElevationMap::save(wzString fname) const{int i,j; wzColor c; FILE* file = fopen(fname,"w"); if(file==NULL){ throw wzFileOpenError();} fprintf(file,"P6\n"); fprintf(file,"# created by WZ 1.0\n"); fprintf(file,"%d %d\n",Lx,Ly); fprintf(file,"255\n"); for(i=0;i<Ly;i++) for(j=0;j<Lx;j++){ c.setElevation((*this)(j,i)); fputc(c.r(),file); fputc(c.g(),file); fputc(c.b(),file); }}void wzColorTablePixmap::save(wzString fname) const{int i,j; FILE* file = fopen(fname,"w"); if(file==NULL){ throw wzFileOpenError();} fprintf(file,"P6\n"); fprintf(file,"# created by WZ 1.0\n"); fprintf(file,"%d %d\n",Lx,Ly); fprintf(file,"255\n"); for(i=0;i<Ly;i++) for(j=0;j<Lx;j++){ int ind = (*this)(j,i); fputc(color(ind).r(),file); fputc(color(ind).g(),file); fputc(color(ind).b(),file); }}static int getnumber(FILE *file){wzByte cc; int n;beg: cc = fgetc(file); if(feof(file)) return -2; if(cc=='#'){ do{ cc=fgetc(file); if(feof(file)) return -2; }while((cc != '\n')); goto beg; } if((cc==' ')||(cc=='\t')||(cc=='\n')) goto beg; n = 0; do{ if((cc<'0')||(cc>'9')){ if((cc==' ')||(cc=='\t')||(cc=='\n')) return n; return -1; } n *= 10; n += cc-'0'; cc = fgetc(file); if(feof(file)) return n; }while(n<100000); return n; }wzTrueColorPixmap::wzTrueColorPixmap(wzString fname){int l,c0,cf,i,j,k,c1,n,col,fac,edges,rest,ci,r,g,b; wzByte *cc; FILE* file = fopen(fname,"r"); if(file==NULL){ throw wzFileOpenError();} c0 = fgetc(file); cf = fgetc(file); if((c0 != 'P')||(cf < '1') || (cf > '6')){ throw wzFileReadError(); } if((Lx=getnumber(file)) < 0) goto error; if((Ly=getnumber(file)) < 0) goto error; c(l=Lx*Ly); switch(cf){ case '1': for(i=0;i<l;i++){ n = getnumber(file); if(n>0){ c[i].set(); }else if(n==0){ c[i].set(255); }else{ goto error; } } break; case '2': col = getnumber(file); if(col>255) goto error; if(col<255){ fac = (256/(col+1)); for(i=0;i<l;i++){ n = getnumber(file); if(n>=0){ c[i].set(n*fac); }else{ goto error; } } }else{ for(i=0;i<l;i++){ n = getnumber(file); if(n>=0){ c[i].set(n); }else{ goto error; } } } break; case '3': col = getnumber(file); if(col>255){ goto error; }else if(col<255){fac = (256/(col+1)); for(i=0;i<l;i++){ r=getnumber(file); if(r<0||r>col) goto error; g=getnumber(file); if(g<0||g>col) goto error; b=getnumber(file); if(b<0||b>col) goto error; c[i].set(r*fac,g*fac,b*fac); } }else{ for(i=0;i<l;i++){ r=getnumber(file); if(r<0||r>col) goto error; g=getnumber(file); if(g<0||g>col) goto error; b=getnumber(file); if(b<0||b>col) goto error; c[i].set(r,g,b); } } break; case '4': edges = l/8; rest = l%8; ci = 0; cc = (wzByte*)malloc(edges+2); fread(cc,1,edges+1,file); for(i=0;i<edges;i++){ c1 = cc[i]; k=128; for(j=0;j<8;j++){ if(c1 & k ){ c[ci].set(); }else{ c[ci].set(255); } ci++; k /= 2; } } for(j=0;j<rest;j++){ if(c1 & k ){ c[ci].set(); }else{ c[ci].set(255); } ci++; k *= 2; } free(cc); break; case '5': cc = (wzByte*)malloc(l+2); col = getnumber(file); if(col > 255) goto error; if(col < 255){fac = 256 / (col+1); fread(cc,1,3*l,file); for(i=0;i<l;i++){ c[i].set(cc[i]*fac); } }else{ fread(cc,1,3*l,file); for(i=0;i<l;i++){ c[i].set(cc[i]); } } free(cc); break; case '6': col = getnumber(file); cc = (wzByte*)malloc(3*(l+2)); if(col > 255) goto error; fread(cc,1,3*l,file); j=0; if(col < 255){fac = 256 / (col+1); for(i=0;i<l;i++){wzByte r,g,b; r=cc[j++];g=cc[j++];b=cc[j++]; c[i].set(r*fac,g*fac,b*fac); } }else{ for(i=0;i<l;i++){wzByte r,g,b; r=cc[j++];g=cc[j++];b=cc[j++]; c[i].set(r,g,b); } } free(cc); break; } fclose(file); return;error: fclose(file); {throw wzFileReadError();}}wzColorTablePixmap::wzColorTablePixmap(wzString fname, int max){wzTrueColorPixmap pp(fname); getTrueColorPixmap(pp,max);}wzColorTablePixmap::wzColorTablePixmap(const wzTrueColorPixmap& tmap, int max){ getTrueColorPixmap(tmap,max);}void wzColorTablePixmap::getTrueColorPixmap( const wzTrueColorPixmap& tmap, int max){int f[3],ff,i,j; wzByte t,to,newt,last,rr,gg,bb; Lx=tmap.lx(); Ly=tmap.ly(); if(max>255||max<=0) max=255; // greater values not allowed by wzByte-type. if(max==1) max=2; map(Lx*Ly); f[0] = f[1] = f[2] = 1; ff = 1; start: last = 255; newt=1; for(i=Lx-1;i>=0;i--){ for(j=0;j<Ly;j++){ rr = tmap(i,j).r()/f[0]; gg = tmap(i,j).g()/f[1]; bb = tmap(i,j).b()/f[2]; t = last; while(t<255){ if(rr != C[t].r()) {t = P[to=t]; continue;} if(gg != C[t].g()) {t = P[to=t]; continue;} if(bb != C[t].b()) {t = P[to=t]; continue;} break; } if(t==255){ t = newt; newt++; if(newt> max){ ff++; ff %= 3; f[ff] *= 2; goto start; } C[t].set(rr,gg,bb); P[t] = last; last = t; }else if(t != last){ P[to] = P[t]; P[t] = last; last = t; } (*this)(i,j) = t; } } Lc = newt-1; for(t=1;t<=Lc;t++){ rr = (C[t].r()*f[0]); gg = (C[t].g()*f[1]); bb = (C[t].b()*f[2]); C[t].set(rr,gg,bb); } return;}int wzColorTablePixmap::print() const{ wzOutput::Default.operator()("Pixmap [<>,<>] with <> colors\n")<< lx(),ly(),colors(); for(int i=1;i<=Lc;i++){ wzOutput::Default.operator()("<>: <>\n")<<i,color(i); } return 0;}void wzColorTablePixmap::fitColorList(wzIndex length,wzColor* col,int* reg){int inew[wzColorTableLength]; int i,j,lc,cc,cd; for(i=1;i<=Lc;i++){ cc=3*256*256+1; inew[i]=0; for(j=1;j<=length;j++){ const wzColor& ci=color(i),cj=col[j]; int cr = (int) ci.r() - (int) cj.r(); int cb = (int) ci.b() - (int) cj.b(); int cg = (int) ci.g() - (int) cj.g(); cd = cr*cr+cb*cb+cg*cg; if(cd<cc){ cc=cd; inew[i]=j;} } } lc=0; // find the maximal index; for(i=1;i<=length;i++){ if(reg[i]>255) reg[i]=0; if(lc<reg[i]) lc=reg[i]; } for(i=0;i<=lc;i++){ // initializing color with default; C[i] = col[0]; } for(i=1;i<=length;i++){ // setting the colors; C[reg[i]] = col[i]; } for(i=1;i<=Lc;i++){ // resetting the indices; inew[i] = reg[inew[i]]; } Lc = lc; for(i=Lx-1;i>=0;i--){ for(j=0;j<Ly;j++){ (*this)(i,j) = inew[(*this)(i,j)]; } }}wzElevationMap::wzElevationMap(const wzTrueColorPixmap& tmap){ getTrueColorPixmap(tmap);}wzElevationMap::wzElevationMap(int lx, int ly){ Lx=lx; Ly=ly; map(Lx*Ly);}wzElevationMap::wzElevationMap(wzString fname){wzTrueColorPixmap pp(fname); getTrueColorPixmap(pp);}void wzElevationMap::getTrueColorPixmap( const wzTrueColorPixmap& tmap){int i,j; Lx=tmap.lx(); Ly=tmap.ly(); map(Lx*Ly); for(i=Lx-1;i>=0;i--){ for(j=0;j<Ly;j++){ tmap(i,j).getElevation((*this)(i,j)); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -