/* * THIS ROUTINE IS PART OF THE CLEMENTINE PDS FILE READER PROGRAM. * IT WAS WRITTEN BY ACT CORP. IN DIRECT SUPPORT TO THE * CLEMENTINE (DSPSE) PROGRAM. * * IF YOU FIND A PROBLEM OR MAKE ANY CHANGES TO THIS CODE PLEASE CONTACT * Dr. Erick Malaret at ACT Corp. * tel: (703) 742-0294 * (703) 683-7431 * email: nrlvax.nrl.navy.mil * * */ #include #include #ifdef __TURBOC__ #include #else #include #endif #include #include "jpeg_c.h" #include "pds.h" #define READ_PARAM "rb" #define WRITE_PARAM "wb" PDSINFO pds; FILE *qparm; void init_qt(FILE *fptr); void readhufftbls(FILE *fptr); void pds_decomp(FILE *fptr,CHARH *p,long sizej,long sizei); #ifdef sun void PClong2SUNlongVector(unsigned long invec[],int npts) ; void PCshort2SUNshortVector(unsigned short invec[],int npts) ; #endif PDSINFO *PDSR(char *fname, long *rows, long *cols) { FILE *fptr; int n; int j,i; CHARH *c; char nstring[84],sdummy[80],buffer[10],low; long sizej; /* number of rows in the image */ long sizei; /* number of columns in the image */ int bitpix; /* bits per pixel */ int record_bytes; int hist_rec,brw_rec,image_rec,ns,brwsize; char cval, *sptr, *ptr; char record_type[20]; int COMPRESSED; long k,hdr_size; if( (fptr = fopen(fname,READ_PARAM)) == NULL){ /* open disk file */ printf("Can't open %s.\n",fname); return NULL; } /* initialize some basic variables */ bitpix =0; sizej=sizei =0; pds.browse_nrows =0; pds.browse_ncols =0; pds.image_nrows =0; pds.image_ncols =0; hist_rec = brw_rec = image_rec = -1; /* read header */ do{ /* read next line of text */ for (n=0; (cval=fgetc(fptr)); n++) { nstring[n]=cval; if(cval=='\n') { if( (cval=fgetc(fptr)) != '\r') ungetc(cval,fptr); nstring[++n]='\0'; break; } } /* find line's first non-space character */ for (ns=0; nstring[ns]==' ';ns++); sptr = &nstring[ns]; if (strncmp("^IMAGE_HISTOGRAM ",sptr,17)==0) { /*printf("image histogram found \n"); */ n=sscanf(nstring,"%s = %d", sdummy, &hist_rec); /*printf("hist_rec = %d\n",hist_rec);*/ } if (strncmp("^BROWSE_IMAGE ",sptr,14)==0) { n=sscanf(nstring,"%s = %d", sdummy, &brw_rec); /*printf("brw_rec = %d\n",brw_rec);*/ } if (strncmp("^IMAGE ",sptr,7)==0) { n=sscanf(nstring,"%s = %d", sdummy, &image_rec); } if (strncmp("RECORD_TYPE",sptr,9)==0) { n=sscanf(nstring,"%s = %s", sdummy, &record_type); } if (strncmp("RECORD_BYTES",sptr,12)==0) { n=sscanf(nstring,"%s = %d", sdummy, &record_bytes); } if (strncmp("ENCODING_TYPE",sptr,13)==0) { n=sscanf(nstring,"%s = %s", sdummy, buffer); if ( strstr(buffer,"JPEG") ) COMPRESSED = 1; else COMPRESSED = 0; } if (strncmp("LINES ",sptr,6)==0) { n=sscanf(nstring,"%s = %d", sdummy, &sizej); } if (strncmp("LINE_SAMPLES",sptr,12)==0) { n=sscanf(nstring,"%s = %d", sdummy, &sizei); } if (strncmp("SAMPLE_BITS",sptr,11)==0) { n=sscanf(nstring,"%s = %d", sdummy, &bitpix); } if (strncmp("END",sptr,3)==0) { if ( *(sptr+3)=='\n' || *(sptr+3)==' ' || *(sptr+3)=='\r' ) { hdr_size = ftell(fptr); break; } } } while(1); /************** read histogram ***************/ if ( hist_rec != -1 ) { fseek(fptr,hist_rec-1,0); pds.hist = (long *)malloc(256*sizeof(long)); if(pds.hist == NULL){ printf(" histogram memory not allocated \n"); } if ( pds.hist ){ fread(pds.hist,sizeof(long),256,fptr); #ifdef sun PClong2SUNlongVector((unsigned long*)pds.hist,256); #endif /*printf("pds.hist = %x\n",pds.hist);*/ } } /************** read browse image **********/ if ( brw_rec != -1 ) { pds.browse_ncols = sizei/8; pds.browse_nrows = sizej/8; fseek(fptr,brw_rec-1,0); brwsize = (sizej/8) * (sizei/8); pds.brw_imag = (unsigned char *)malloc(brwsize); if ( pds.brw_imag ) fread(pds.brw_imag,sizeof(char),brwsize,fptr); } /************* read image data ***************/ if (strncmp(record_type,"UNDEFINED",9)==0) { record_bytes=1; fseek(fptr,(image_rec-1),0); } else { fseek(fptr,(image_rec-1)*record_bytes,0); } switch (bitpix) { case 8: #ifdef __TURBOC__ c = (CHARH *)farmalloc(sizej*sizei); #else c = (CHARH *)malloc(sizej*sizei); #endif if ( c == NULL ) { printf("Can't allocate memory for image array.\n"); fclose(fptr); return NULL; } if ( COMPRESSED ) { qparm = fopen("paramtrs.dat","w"); init_qt(fptr); readhufftbls(fptr); pds_decomp(fptr,c,sizej,sizei); fclose(qparm); } else { for (j=0, k=0; j 60000L ) { blocks = nbytes / 32768; rem = nbytes % 32768; nb = 32768; }; ptr = ibs.outstring; for (i=0; i < blocks; i++,ptr+=nb) { if ( fread(ptr,sizeof(char),nb,fptr) != nb ) { printf("Error reading data string.\n"); FLAG = 1; break; } } if ( rem ) { if ( fread(ptr,sizeof(char),rem,fptr) != rem ) { printf("Error reading data string.\n"); FLAG = 1; } } ibs.mode = MEMORY; } else { ibs.bytestream.file = fptr; ibs.mode = DISK; } if ( !FLAG ) { npanels = sizej/32; bytesperpanel = 32*sizei; for (i=0; i>8) + ((ival&0xff000000)>>24); invec[i]= oval; } } void PCshort2SUNshortVector(unsigned short invec[],int npts){ int i; unsigned short ival,oval; for(i=0;i>8)&0x00ff); invec[i]= oval; } } #endif