00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 #include <stdio.h>
00160 #include <stdlib.h>
00161 #include <unistd.h>
00162 #include <math.h>
00163 #include <string.h>
00164 #include <time.h>
00165
00166 #include "petc99.h"
00167 #include "swap.h"
00168 #include "halflife.h"
00169 #include "substitutions.h"
00170
00171 #include "include/img.h"
00172 #include "include/ecat63.h"
00173 #include "include/ecat7.h"
00174 #include "include/analyze.h"
00175 #include "include/imgmax.h"
00176 #include "include/imgdecay.h"
00177 #include "include/sif.h"
00178 #include "include/imgfile.h"
00179
00180
00181
00190 int imgRead(const char *fname, IMG *img) {
00191 FILE *fp;
00192 int ret;
00193 ECAT7_mainheader ecat7_main_header;
00194 ECAT63_mainheader ecat63_main_header;
00195 char temp[FILENAME_MAX], *cptr;
00196
00197 if(IMG_TEST) printf("imgRead(%s, *img)\n", fname);
00198
00199 if(fname==NULL) {img->statmsg=imgStatus(STATUS_FAULT); return(1);}
00200 if(img==NULL || img->status!=IMG_STATUS_INITIALIZED) {
00201 img->statmsg=imgStatus(STATUS_FAULT); return(2);}
00202
00203
00204
00205 strcpy(temp, fname); cptr=strrchr(temp, '.');
00206 if(cptr!=NULL && (strcmp(cptr, ".img")==0 || strcmp(cptr, ".hdr")==0))
00207 *cptr=(char)0;
00208
00209 if(anaExists(temp)!=0) {
00210
00211 ret=imgReadAnalyze(temp, img);
00212 if(ret==3 || ret==4 || ret==5 || ret==6) {
00213 img->statmsg=imgStatus(STATUS_UNKNOWNFORMAT); return(4);
00214 } else if(ret>0) {
00215 img->statmsg=imgStatus(STATUS_NOFILE); return(4);
00216 }
00217 if(IMG_TEST) printf("%s identified as supported Analyze 7.5 format.\n",
00218 fname);
00219 img->statmsg=imgStatus(STATUS_OK);
00220 return(0);
00221 }
00222
00223
00224
00225
00226 if((fp=fopen(fname, "rb")) == NULL) {
00227 img->statmsg=imgStatus(STATUS_NOFILE); return(4);
00228 }
00229
00230 ret=ecat7ReadMainheader(fp, &ecat7_main_header);
00231 if(ret) {fclose(fp); img->statmsg=imgStatus(STATUS_UNKNOWNFORMAT); return(4);}
00232
00233 if(strncmp(ecat7_main_header.magic_number, ECAT7V_MAGICNR, 7)==0) {
00234
00235
00236 if(imgEcat7Supported(&ecat7_main_header)==0) {
00237 fclose(fp); img->statmsg=imgStatus(STATUS_UNSUPPORTED); return(5);
00238 }
00239 fclose(fp);
00240
00241 if(IMG_TEST) printf("%s identified as supported ECAT 7.x %s format\n",
00242 fname, ecat7filetype(ecat7_main_header.file_type));
00243 ret=imgReadEcat7(fname, img);
00244 if(ret) {if(IMG_TEST) printf("imgReadEcat7()=%d\n", ret); return(6);}
00245 } else {
00246
00247 ret=ecat63ReadMainheader(fp, &ecat63_main_header);
00248 fclose(fp);
00249 if(ret==0) {
00250
00251 if(IMG_TEST) printf("%s identified as supported ECAT 6.3 %s format\n",
00252 fname, ecat7filetype(ecat63_main_header.file_type));
00253 ret=ecat63ReadAllToImg(fname, img);
00254 if(ret) {
00255 if(IMG_TEST) fprintf(stderr, "ecat63ReaddAllToImg: %s\n", ecat63errmsg);
00256 if(ret==6) img->statmsg=imgStatus(STATUS_MISSINGMATRIX);
00257 else img->statmsg=imgStatus(STATUS_UNSUPPORTED);
00258 return(6);
00259 }
00260 } else {img->statmsg=imgStatus(STATUS_UNKNOWNFORMAT); return(4);}
00261 }
00262 img->statmsg=imgStatus(STATUS_OK);
00263 return(0);
00264 }
00265
00266
00267
00277 int imgWrite(const char *fname, IMG *img) {
00278 int ret;
00279
00280 if(IMG_TEST) printf("imgWrite(%s, *img)\n", fname);
00281
00282 if(fname==NULL) return(1);
00283 if(img==NULL || img->status!=IMG_STATUS_OCCUPIED) {
00284 imgSetStatus(img, STATUS_FAULT); return(2);}
00285 if(img->type!=IMG_TYPE_RAW &&
00286 img->type!=IMG_TYPE_IMAGE &&
00287 img->type!=IMG_TYPE_POLARMAP) {
00288 imgSetStatus(img, STATUS_FAULT); return(2);}
00289
00290
00291 if(img->_fileFormat==IMG_UNKNOWN) imgFormatFromFName(img, fname);
00292
00293
00294 if(img->_fileFormat==IMG_E63) {
00295 ret=ecat63WriteAllImg(fname, img);
00296 switch(ret) {
00297 case 0: break;
00298 case 4: imgSetStatus(img, STATUS_NOMEMORY); break;
00299 case 3: imgSetStatus(img, STATUS_NOWRITEPERM); break;
00300 case 9: imgSetStatus(img, STATUS_DISKFULL); break;
00301 default: imgSetStatus(img, STATUS_FAULT);
00302 }
00303 if(ret) return(7);
00304 } else if(img->_fileFormat==IMG_ANA || img->_fileFormat==IMG_ANA_L) {
00305 ret=imgWriteAnalyze(fname, img); if(ret) return(5);
00306 } else if(img->_fileFormat==IMG_E7_2D) {
00307 ret=imgWrite2DEcat7(fname, img); if(ret) return(5);
00308 } else if(img->_fileFormat==IMG_POLARMAP) {
00309 ret=imgWritePolarmap(fname, img); if(ret) return(5);
00310 } else {
00311 ret=imgWriteEcat7(fname, img); if(ret) return(5);
00312 }
00313 imgSetStatus(img, STATUS_OK);
00314 return(0);
00315 }
00316
00317
00318
00329 int imgReadHeader(const char *fname, IMG *img) {
00330 int ret;
00331
00332
00333 if(IMG_TEST) printf("\nimgReadHeader(%s, *img)\n", fname);
00334
00335
00336 if(fname==NULL) return STATUS_FAULT;
00337 if(img==NULL) return STATUS_FAULT;
00338 if(img->status!=IMG_STATUS_INITIALIZED) return STATUS_FAULT;
00339
00340
00341 if(anaDatabaseExists(fname, NULL, NULL, NULL)>0) {
00342
00343 ret=imgReadAnalyzeHeader(fname, img);
00344 imgSetStatus(img, ret);
00345 return(ret);
00346 }
00347
00348
00349 ret=imgReadEcat7Header(fname, img);
00350
00351
00352 if(ret==STATUS_UNKNOWNFORMAT) {
00353
00354
00355 ret=imgReadEcat63Header(fname, img);
00356 if(ret) return STATUS_UNKNOWNFORMAT;
00357
00358 imgSetStatus(img, STATUS_OK);
00359 return STATUS_OK;
00360 }
00361
00362 imgSetStatus(img, ret);
00363 return ret;
00364 }
00365
00366
00367
00389 int imgReadFrame(const char *fname, int frame_to_read, IMG *img, int frame_index) {
00390 IMG test_img;
00391 int ret=0;
00392
00393 if(IMG_TEST) printf("\nimgReadFrame(%s, %d, *img, %d)\n",
00394 fname, frame_to_read, frame_index);
00395
00396
00397
00398
00399 if(fname==NULL) return STATUS_FAULT;
00400 if(img==NULL) return STATUS_FAULT;
00401 if(img->status!=IMG_STATUS_INITIALIZED && img->status!=IMG_STATUS_OCCUPIED)
00402 return STATUS_FAULT;
00403 if(frame_to_read<1) return STATUS_FAULT;
00404 if(frame_index<0) return STATUS_FAULT;
00405
00406 if(frame_index>0) {
00407 if(img->status!=IMG_STATUS_OCCUPIED) return STATUS_FAULT;
00408 if(frame_index>img->dimt-1) return STATUS_FAULT;
00409 }
00410
00411
00412
00413
00414
00415
00416 imgInit(&test_img);
00417 if(img->status==IMG_STATUS_OCCUPIED) {
00418 ret=imgReadHeader(fname, &test_img); imgSetStatus(&test_img, ret);
00419 if(IMG_TEST>1) printf("imgReadHeader() return message := %s\n", test_img.statmsg);
00420 if(ret) return(ret);
00421 if(IMG_TEST>3) imgInfo(&test_img);
00422
00423 ret=0;
00424 if(img->type!=test_img.type) ret++;
00425 if(img->_fileFormat!=test_img._fileFormat) ret++;
00426
00427 if(img->dimx!=test_img.dimx) ret++;
00428 if(img->dimy!=test_img.dimy) ret++;
00429 if(img->dimz!=test_img.dimz) ret++;
00430 imgEmpty(&test_img); if(ret>0) return STATUS_INVALIDHEADER;
00431 } else {
00432 ret=imgReadHeader(fname, img); imgSetStatus(img, ret);
00433 if(IMG_TEST>1) printf("imgReadHeader() return message := %s\n", img->statmsg);
00434 if(ret) return(ret);
00435 if(IMG_TEST>3) imgInfo(img);
00436
00437 img->dimt=1;
00438 ret=imgAllocate(img, img->dimz, img->dimy, img->dimx, img->dimt);
00439 if(ret) return STATUS_NOMEMORY;
00440 }
00441
00442
00443
00444
00445
00446 switch(img->_fileFormat) {
00447 case IMG_E7:
00448 case IMG_E7_2D:
00449 case IMG_POLARMAP:
00450 ret=imgReadEcat7Frame(fname, frame_to_read, img, frame_index);
00451 if(IMG_TEST>1) printf("imgReadEcat7Frame() return value := %d\n", ret);
00452 break;
00453 case IMG_E63:
00454 ret=imgReadEcat63Frame(fname, frame_to_read, img, frame_index);
00455 if(IMG_TEST>1) printf("imgReadEcat63Frame() return value := %d\n", ret);
00456 break;
00457 case IMG_ANA:
00458 case IMG_ANA_L:
00459 ret=imgReadAnalyzeFrame(fname, frame_to_read, img, frame_index);
00460 if(IMG_TEST>1) printf("imgReadAnalyzeFrame() return value := %d\n", ret);
00461 break;
00462 default:
00463 ret=STATUS_UNSUPPORTED;
00464 }
00465 imgSetStatus(img, ret);
00466 return ret;
00467 }
00468
00469
00470
00493 int imgWriteFrame(const char *fname, int frame_to_write, IMG *img, int frame_index) {
00494 int ret=0;
00495
00496 if(IMG_TEST) printf("\nimgWriteFrame(%s, %d, *img, %d)\n",
00497 fname, frame_to_write, frame_index);
00498
00499
00500
00501
00502 if(fname==NULL) return STATUS_FAULT;
00503 if(img==NULL) return STATUS_FAULT;
00504 if(img->status!=IMG_STATUS_OCCUPIED) return STATUS_FAULT;
00505 if(frame_to_write<0) return STATUS_FAULT;
00506 if(frame_index<0 || frame_index>=img->dimt) return STATUS_FAULT;
00507
00508
00509
00510
00511
00512 imgFormatFromFName(img, fname);
00513 switch(img->_fileFormat) {
00514 case IMG_E7:
00515 case IMG_E7_2D:
00516 case IMG_POLARMAP:
00517 ret=imgWriteEcat7Frame(fname, frame_to_write, img, frame_index);
00518 break;
00519 case IMG_E63:
00520 ret=imgWriteEcat63Frame(fname, frame_to_write, img, frame_index);
00521 break;
00522 case IMG_ANA:
00523 case IMG_ANA_L:
00524 ret=STATUS_UNSUPPORTED;
00525
00526
00527
00528
00529 break;
00530 default:
00531 ret=STATUS_UNSUPPORTED;
00532 }
00533 imgSetStatus(img, ret);
00534 return ret;
00535 }
00536
00537
00538
00547 void imgFormatFromFName(IMG *img, const char *fname) {
00548 char *cptr=NULL;
00549
00550 if(img->_fileFormat!=IMG_UNKNOWN && img->_fileFormat>0) return;
00551 img->_fileFormat=IMG_E7;
00552
00553 cptr=strrchr(fname, '.'); if(cptr!=NULL) cptr++;
00554 if(cptr!=NULL) {
00555 if(strcasecmp(cptr, "hdr")==0) { img->_fileFormat=IMG_ANA; return;}
00556 if(strcasecmp(cptr, "polmap")==0) { img->_fileFormat=IMG_POLARMAP; return;}
00557 if(strcasecmp(cptr, "img")==0 ||
00558 strcasecmp(cptr, "scn")==0 ||
00559 strcasecmp(cptr, "nrm")==0 ||
00560 strcasecmp(cptr, "atn")==0) {
00561 img->_fileFormat=IMG_E63; return;}
00562 } else {
00563 img->_fileFormat=IMG_ANA;
00564 }
00565 }
00566
00567
00568