added first attempts of fourier trafo code ...
[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 -i <infile> -o <outfile> -itype <intype> -otype <outtype> -d <dimensions> -g <geometry> -debug <debug file>");
13  puts("");
14  puts("i/o type may be bmp or nlsop");
15  puts("dimensions: 2 or 3");
16  puts("geometry in 2d: <resolution> <start> , eg: 64 32 0 80 (64x32 big area starting from (0|80)");
17  puts("geometry in 3d: <resolution> <start> , eg: 64 64 32 0 0 80 (the same in 3 dimensions ^)");
18  puts("");
19  puts("you must set -dimensions before specifying -geometry");
20  puts("default: dimension = 2 , resolution = whole image");
21  return 1;
22 }
23
24 int get_size_of_infile(int fd,int *res,unigned char set) {
25
26  if(set&SET_IN_BMP) {
27
28   unsigned char buf[BMP_HEADER_LEN];
29
30   puts("reading bmp header ...");
31   read(fd,buf,BMP_HEADER_LEN);
32   res[0]=buf[18]|(buf[19]<<8);
33   res[1]=buf[22]|(buf[23]<<8);
34
35   return ((int)buf[10]);
36  }
37  else {
38
39   d3_lattice *d3l;
40
41   puts("reading nlsop header ...");
42   d3l=(d3_lattice *)malloc(sizeof(d3_lattice));
43   read(fd,d3l,sizeof(d3_lattice));
44   res[0]=d3l->max_x;
45   if(set&SET_3D) {
46    res[1]=d3l->max_y;
47    res[2]=d3l->max_z;
48   } else res[1]=d3l->max_z;
49   
50   return (sizeof(d3_lattice)+sizeof(info));
51  }
52
53 }
54
55 int get_infile_data(int fd,int offset,int *RES,int *res,int *x,unsigned char *orig,unsigned char set) {
56
57  int i,j,k,w_len;
58  unsigned char *buf;
59
60  lseek(fd,offset,SEEK_SET);
61
62  if(set&SET_IN_BMP) {
63   w_len=3*RES[1];
64   w_len+=(4-w_len%4);
65   lseek(fd,x[1]*w_len,SEEK_CUR);
66   buf=(unsigned char)malloc(w_len);
67   for(j=0;j<res[1];j++) {
68    read(fd,buf,w_len);
69    for(i=x[0];i<res[0];i++) if(buf[3*i]!=0) orig+j*res[0]+i-x[0]=0xff;
70   }
71   free(buf);
72  }
73  else if(set&SET_IN_NLSOP) {
74   puts("NOT SUPPORTED RIGT NOW!");
75   return -1;
76  }
77
78  return 1;
79 }
80
81 int main(int argc,char **argv) {
82
83  char infile[FILE_LEN]="",outfile[FILE_LEN]="",debugfile[FILE_LEN]="";
84  char itype[TYPE_LEN]="",otype[TYPE_LEN]="";
85  int ifd,ofd,dfd;
86  int dim=2;
87  int x[3],res[3];
88  int i,j,k,size,offset;
89  unsigned char set=0;
90  unsigned char *orig,*image;
91  int RES[3]; /* resolution of the original image */
92  
93
94  /* parse argv */
95  for(i=1;i<argc;i++) {
96   if(!strncmp(argv[i],"-i",2)) strncpy(infile,argv[++i],FILE_LEN);
97   else if(!strncmp(argv[i],"-o",2)) strncpy(outfile,argv[++i],FILE_LEN);
98   else if(!strncmp(argv[i],"-itype",6)) strncpy(itype,argv[++i],TYPE_LEN);
99   else if(!strncmp(argv[i],"-otype",6)) strncpy(otype,argv[++i],TYPE_LEN);
100   else if(!strncmp(argv[i],"-d",2)) {
101    strncpy(debugfile,argv[++i],FILE_LEN);
102    set|=SET_DEBUG;
103   }
104   else if(!strncmp(argv[i],"-d",2)) {
105    dim=atoi(argv[++i]);
106    set|=SET_DIM;
107    if(dim==3) set|=SET_3D;
108   }
109   else if(!strncmp(argv[i],"-g",2)) {
110    set|=SET_GEO;
111    res[0]=atoi(argv[++i]); res[1]=atoi(argv[++i]);
112    if(dim==3) res[2]=atoi(argv[++i]);
113    x[0]=atoi(argv[++i]); x[1]=atoi(argv[++i]);
114    if(dim==3) x[2]=atoi(argv[++i]);
115   }
116    usage();
117    return -1;
118   }
119  }
120
121  if((ifd=open(infile,O_RDONLY))<0) {
122   perror("unable to open file readonly");
123   return -1;
124  }
125
126  if((ofd=open(ofile,O_WRONLY))<0) {
127   perror("unable to open file writeonly");
128   return -1;
129  }
130
131  if(set&SET_DEBUG) {
132   if((dfd=open(debugfile,O_WRONLY))<0) {
133    perror("unable to open degugfile writeonly");
134    return -1;
135   }
136  }
137
138  if(!strncmp(itype,"bmp",3)) {
139   set|=SET_IN_BMP;
140   if(dim==3) {
141    puts("there is no 3 dimensional bmp file!");
142    return -1;
143   }
144  }
145  else if(!strncmp(itype,"nlsop",5)) set|=SET_IN_NLSOP;
146  else usage();
147
148  if(!strncmp(otype,"bmp",3)) {
149   set|=SET_OUT_BMP;
150   if(dim==3) {
151    puts("cant write 3 dimensional bmp file!");
152    return -1;
153   }
154  }
155  else if(!strncmp(otype,"nlsop",5)) set|=SET_OUT_NLSOP;
156  else usage();
157
158  offset=get_size_of_infile(ifd,RES,set);
159  if(!set&SET_GEO) { 
160   for(i=0;i<3;i++) {
161    x[i]=0;
162    res[i]=RES[i];
163   }
164  }
165
166  /* allocate buffer for original and transformed image */
167  size=res[0]*res[1];
168  if(dim==3) size*=res[2];
169  orig=(unsigned char *)malloc(size);
170  image=(unsigned char *)malloc(size);
171  
172  get_infile_data(ifd,offset,RES,res,x,orig,set);
173  
174  /* to be continued ... */
175
176
177  return 1;
178 }