📄 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 + -