added LIBC_RAND functionality & x-z view in real TEM mode now
[physik/nlsop.git] / ft.c
1 /* ft.c - fourier transformation on nlsop save files */
2
3 /*
4  * author: frank.zirkelbach@physik.uni-augsburg.de
5  *
6  */
7
8 #include "ft.h"
9
10 int usage(void) {
11  puts("usage:");
12  puts("ft -ifile <infile> -ofile <outfile> -itype <intype>");
13  puts("   -otype <outtype> -dim <dimensions>");
14  puts("   -geometry <geometry> -debug <debug file>");
15  puts("");
16  puts("itype may be bmp or nlsop");
17  puts("otype may be bmp or plot");
18  puts("dimensions: 2 or 3");
19  puts("geometry in 2d: <resolution> <start>");
20  puts(" eg: 64 32 0 80 (64x32 big area starting from (0|80)");
21  puts("geometry in 3d: <resolution> <start>");
22  puts(" eg: 64 64 32 0 0 80 (the same in 3 dimensions ^)");
23  puts("");
24  puts("you must set -dimensions before specifying -geometry");
25  puts("default: dimension = 2 , resolution = whole image");
26  puts("only 2 dimensions allowed for bmp");
27  return 1;
28 }
29
30 int get_size_of_infile(int fd,int *res,unsigned char set) {
31
32  if(set&SET_IN_BMP) {
33
34   unsigned char buf[BMP_HEADER_LEN];
35
36   printf("reading bmp header ...");
37   read(fd,buf,BMP_HEADER_LEN);
38   res[0]=buf[18]|(buf[19]<<8);
39   res[1]=buf[22]|(buf[23]<<8);
40   printf(" done\n");
41
42   return ((int)buf[10]);
43  }
44  else {
45
46   d3_lattice *d3l;
47
48   puts("reading nlsop header ...");
49   d3l=(d3_lattice *)malloc(sizeof(d3_lattice));
50   read(fd,d3l,sizeof(d3_lattice));
51   res[0]=d3l->max_x;
52   if(set&SET_3D) {
53    res[1]=d3l->max_y;
54    res[2]=d3l->max_z;
55   } else res[1]=d3l->max_z;
56   
57   return (sizeof(d3_lattice)+sizeof(info));
58  }
59
60 }
61
62 int get_infile_data(int fd,int offset,int *RES,int *res,int *x,unsigned char *orig,unsigned char set) {
63
64  int i,j,k,w_len,test;
65  unsigned char *buf;
66
67  test=lseek(fd,offset,SEEK_SET);
68
69  printf("getting data at offset %d ...",test);
70
71  if(set&SET_IN_BMP) {
72
73   w_len=3*RES[1];
74   if(w_len%4) w_len+=(4-(w_len%4));
75   lseek(fd,x[1]*w_len,SEEK_CUR);
76   buf=(unsigned char *)malloc(w_len);
77   for(j=0;j<res[1];j++) {
78    read(fd,buf,w_len);
79    for(i=x[0];i<res[0];i++) if(buf[3*i]!=0) *(orig+j*res[0]+i-x[0])=1;
80   }
81   free(buf);
82  }
83  else if(set&SET_IN_NLSOP) {
84
85   w_len=RES[0]*RES[1]*RES[2];
86
87   buf=(unsigned char *)malloc(w_len);
88   read(fd,buf,w_len);
89   for(k=0;k<res[2];k++) {
90    for(j=0;j<res[1];j++) {
91     for(i=0;i<res[0];i++) {
92      if(*(buf+x[0]+i+(x[1]+j)*RES[0]+(x[2]+k)*RES[0]*RES[1])!=0) 
93       *(orig+i+j*RES[0]+k*RES[0]*RES[1])=1;
94     }
95    }
96   }
97   free(buf);
98  }
99
100  printf(" done\n");
101
102  return 1;
103 }
104
105 int write_bmp(int fd,unsigned char *orig,int *res) {
106
107  int size,i,j;
108  unsigned char buf[64];
109
110  size=res[0]*3+4-((res[0]*3)%4);
111  size*=res[1];
112  memset(buf,0,64);
113
114  /* bmpheader */
115  buf[0]='B'; /* std header start */
116  buf[1]='M';
117  buf[2]=(size+0x36)&0xff; /* file size */
118  buf[3]=(size+0x36)>>8;
119  memset(buf+4,0,6);
120  buf[10]=0x36; /* offset to data */
121  memset(buf+11,0,3);
122  buf[14]=0x28; /* length of bmp info header */
123  memset(buf+15,0,3);
124  buf[18]=res[0]&0xff; /* width and height */
125  buf[19]=res[0]>>8;
126  memset(buf+20,0,2);
127  buf[22]=res[1]&0xff;
128  buf[23]=res[1]>>8;
129  memset(buf+24,0,2);
130  buf[26]=1; /* # planes -> 1 */
131  buf[27]=0;
132  buf[28]=24; /* bits per pixel -> 2^24 (true color) */
133  buf[29]=0;
134  memset(buf+30,0,4); /* compression -> none */
135  buf[34]=size&0xff; /* data size */
136  buf[35]=size>>8;
137  memset(buf+36,0,2);
138  buf[38]=0x12; /* res: pixel/meter */
139  buf[39]=0x0b;
140  memset(buf+40,0,2);
141  buf[42]=0x12;
142  buf[43]=0x0b;
143  memset(buf+44,0,2);
144  memset(buf+46,0,8); /* no colors, no important colors */
145  /* write it */
146  write(fd,buf,54);
147
148  for(j=0;j<res[1];j++) {
149   for(i=0;i<res[0];i++) {
150    memset(buf,0,3);
151    if(*(orig+i+j*res[0])) memset(buf,0xff,3);
152    write(fd,buf,3);
153   }
154   if((res[0]*3)%4) {
155    memset(buf,0,4-((res[0]*3)%4));
156    write(fd,buf,4-((res[0]*3)%4));
157   }
158  }
159
160  return 1;
161 }
162
163 int write_debug_file(int fd,unsigned char *orig,int *res,unsigned char set) {
164
165  int i,j,k;
166
167  if(set&SET_OUT_PLOT) {
168   dprintf(fd,"# gnuplot debug file\n");
169   if(!(set&SET_3D)) {
170    for(i=0;i<res[0];i++)
171     for(j=0;j<res[1];j++)
172      if(!*(orig+i+j*res[0])) dprintf(fd,"%d %d\n",i,j);
173   }
174   else {
175    for(i=0;i<res[0];i++)
176     for(j=0;j<res[1];j++)
177      for(k=0;k<res[2];k++)
178       if(*(orig+i+j*res[0]+k*res[0]*res[1])) dprintf(fd,"%d %d %d\n",i,j,k);
179   }
180  }
181  else if(set&SET_OUT_BMP) write_bmp(fd,orig,res);
182
183  return 1;
184 }
185
186 int main(int argc,char **argv) {
187
188  char infile[FILE_LEN]="",outfile[FILE_LEN]="",debugfile[FILE_LEN]="";
189  char itype[TYPE_LEN]="",otype[TYPE_LEN]="";
190  int ifd,ofd,dfd;
191  int dim=2;
192  int x[3],res[3];
193  int i,j,k,size,offset;
194  unsigned char set=0;
195  unsigned char *orig,*image;
196  int RES[3]; /* resolution of the original image */
197  
198
199  /* parse argv */
200  for(i=1;i<argc;i++) {
201   if(!strncmp(argv[i],"-ifile",6)) strncpy(infile,argv[++i],FILE_LEN);
202   else if(!strncmp(argv[i],"-ofile",6)) strncpy(outfile,argv[++i],FILE_LEN);
203   else if(!strncmp(argv[i],"-itype",6)) strncpy(itype,argv[++i],TYPE_LEN);
204   else if(!strncmp(argv[i],"-otype",6)) strncpy(otype,argv[++i],TYPE_LEN);
205   else if(!strncmp(argv[i],"-debug",6)) {
206    strncpy(debugfile,argv[++i],FILE_LEN);
207    set|=SET_DEBUG;
208   }
209   else if(!strncmp(argv[i],"-dim",4)) {
210    dim=atoi(argv[++i]);
211    set|=SET_DIM;
212    if(dim==3) set|=SET_3D;
213   }
214   else if(!strncmp(argv[i],"-geometry",8)) {
215    set|=SET_GEO;
216    res[0]=atoi(argv[++i]); res[1]=atoi(argv[++i]);
217    if(dim==3) res[2]=atoi(argv[++i]);
218    x[0]=atoi(argv[++i]); x[1]=atoi(argv[++i]);
219    if(dim==3) x[2]=atoi(argv[++i]);
220   }
221   else {
222    usage();
223    return -1;
224   }
225  }
226
227  if((ifd=open(infile,O_RDONLY))<0) {
228   perror("unable to open file readonly");
229   return -1;
230  }
231
232  if((ofd=open(outfile,O_WRONLY|O_CREAT))<0) {
233   perror("unable to open file writeonly");
234   return -1;
235  }
236
237  if(set&SET_DEBUG) {
238   if((dfd=open(debugfile,O_WRONLY|O_CREAT))<0) {
239    perror("unable to open degugfile writeonly");
240    return -1;
241   }
242  }
243
244  if(!strncmp(itype,"bmp",3)) {
245   set|=SET_IN_BMP;
246   if(dim==3) {
247    puts("there is no 3 dimensional bmp file!");
248    return -1;
249   }
250  }
251  else if(!strncmp(itype,"nlsop",5)) {
252   set|=SET_IN_NLSOP;
253   if(dim==2) {
254    puts("there is no 2 dimensional nlsop file!");
255    return -1;
256   }
257  }
258  else usage();
259
260  if(!strncmp(otype,"bmp",3)) {
261   set|=SET_OUT_BMP;
262   if(dim==3) {
263    puts("cant write 3 dimensional bmp file!");
264    return -1;
265   }
266  }
267  else if(!strncmp(otype,"plot",5)) set|=SET_OUT_PLOT;
268  else usage();
269
270  offset=get_size_of_infile(ifd,RES,set);
271  if(!(set&SET_GEO)) { 
272   for(i=0;i<3;i++) {
273    x[i]=0;
274    res[i]=RES[i];
275   }
276  }
277
278  printf("debug: %d %d %d %d\n",res[0],res[1],x[0],x[1]);
279
280  /* allocate buffer for original and transformed image */
281  size=res[0]*res[1];
282  if(dim==3) size*=res[2];
283  orig=(unsigned char *)malloc(size);
284  memset(orig,0,size);
285  image=(unsigned char *)malloc(size);
286  
287  get_infile_data(ifd,offset,RES,res,x,orig,set);
288
289  if(set&SET_DEBUG) write_debug_file(dfd,orig,res,set);
290  
291  /* to be continued ... */
292
293  free(orig);
294  free(image);
295
296  close(ifd);
297  close(ofd);
298  close(dfd);
299
300  return 1;
301 }