Changeset 15439
- Timestamp:
- Nov 2, 2007, 3:44:27 PM (19 years ago)
- Location:
- branches/eam_branch_20071015/Ohana/src/libfits
- Files:
-
- 7 added
- 5 edited
-
Makefile (modified) (4 diffs)
-
extern (added)
-
extern/fits_hcompress.c (added)
-
extern/fits_hdecompress.c (added)
-
extern/pliocomp.c (added)
-
extern/ricecomp.c (added)
-
extern/ricecomp.h (added)
-
header/F_copy_H.c (modified) (1 diff)
-
include/gfitsio.h (modified) (2 diffs)
-
matrix/F_compress_M.c (modified) (7 diffs)
-
matrix/F_uncompress_data.c (added)
-
table/F_table_varlength.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branch_20071015/Ohana/src/libfits/Makefile
r15353 r15439 10 10 MATR = $(HOME)/matrix 11 11 TABL = $(HOME)/table 12 EXT = $(HOME)/extern 12 13 INC = $(HOME)/include 13 14 MAN = $(HOME)/doc … … 16 17 # programs may add their own internal requirements here 17 18 FULL_CFLAGS = $(BASE_CFLAGS) -fPIC -Wall -Werror 18 FULL_CPPFLAGS = $(BASE_CPPFLAGS) 19 FULL_CPPFLAGS = $(BASE_CPPFLAGS) -I$(EXT) 19 20 FULL_LDFLAGS = $(BASE_LDFLAGS) 20 21 … … 43 44 $(MATR)/F_convert_format.$(ARCH).o $(MATR)/F_read_segment.$(ARCH).o \ 44 45 $(MATR)/F_read_portion.$(ARCH).o $(MATR)/F_load_M.$(ARCH).o \ 45 $(MATR)/F_matrix.$(ARCH).o $(MATR)/F_compress_M.$(ARCH).o 46 $(MATR)/F_matrix.$(ARCH).o $(MATR)/F_compress_M.$(ARCH).o \ 47 $(MATR)/F_uncompress_data.$(ARCH).o 46 48 47 49 TABLE_OBJ = \ … … 54 56 $(TABL)/F_table_varlength.$(ARCH).o 55 57 56 OBJS = $(HEADER_OBJ) $(MATRIX_OBJ) $(TABLE_OBJ) 58 EXTERN_OBJ = \ 59 $(EXT)/fits_hcompress.$(ARCH).o \ 60 $(EXT)/fits_hdecompress.$(ARCH).o \ 61 $(EXT)/pliocomp.$(ARCH).o \ 62 $(EXT)/ricecomp.$(ARCH).o 63 64 OBJS = $(HEADER_OBJ) $(MATRIX_OBJ) $(TABLE_OBJ) $(EXTERN_OBJ) 65 66 extern: $(EXTERN_OBJ) 57 67 58 68 $(OBJS): $(INCS) -
branches/eam_branch_20071015/Ohana/src/libfits/header/F_copy_H.c
r7039 r15439 8 8 9 9 out[0].simple = in[0].simple; 10 out[0].unsign = in[0].unsign; 11 out[0].extend = in[0].extend; 10 12 out[0].bitpix = in[0].bitpix; 11 out[0].extend = in[0].extend; 12 out[0].unsign = in[0].unsign; 13 out[0].size = in[0].size; 14 out[0].bscale = in[0].bscale; 15 out[0].bzero = in[0].bzero; 13 16 14 out[0].Naxes = in[0].Naxes; 17 15 for (i = 0; i < FT_MAX_NAXES; i++) 18 16 out[0].Naxis[i] = in[0].Naxis[i]; 17 18 out[0].size = in[0].size; 19 20 out[0].pcount = in[0].pcount; 21 out[0].gcount = in[0].gcount; 22 out[0].bzero = in[0].bzero; 23 out[0].bscale = in[0].bscale; 19 24 20 25 ALLOCATE (out[0].buffer, char, out[0].size); -
branches/eam_branch_20071015/Ohana/src/libfits/include/gfitsio.h
r15425 r15439 89 89 90 90 typedef struct { 91 int length; 92 int offset; 93 int maxlen; 94 int nbytes; 95 int Nstart; 96 int theap; 97 char format; 98 char cmptype[81]; 91 int maxlen; // max size of all table rows 92 int nbytes; // number of bytes per column element 93 int Nstart; // byte offset of this column 94 int heap_start; // byte offset to start of HEAP 95 char format; // data format character (one of: XLABIJEDCM) 99 96 } VarLengthColumn; 100 97 … … 156 153 int gfits_write_matrix PROTO((char *filename, Matrix *matrix)); 157 154 int gfits_uncompress_image PROTO((Header *header, Matrix *matrix, FTable *ftable, int primary)); 158 int gfits_uncompress_data PROTO((char *zdata, int Nzdata, char *cmptype, char **optname, char **optvalue, int Nopt, char *outdata, int *Nout ));155 int gfits_uncompress_data PROTO((char *zdata, int Nzdata, char *cmptype, char **optname, char **optvalue, int Nopt, char *outdata, int *Nout, int out_pixsize)); 159 156 int gfits_distribute_data PROTO((Matrix *matrix, int bitpix, char *data, int Ndata, int *otile, int *ztile, float zscale, float zzero)); 160 157 int gfits_byteswap_zdata PROTO((char *zdata, int Nzdata, int bitpix)); 158 int gfits_extension_is_compressed PROTO((Header *header)); 159 int gfits_tile_size PROTO((Matrix *matrix, int *otile, int *ztile)); 161 160 162 161 /******************************* Table functions *************/ -
branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_compress_M.c
r15425 r15439 8 8 gfits_print (header, NAME, TYPE, 1, OUT); } 9 9 10 # define MOD_KEYWORD_REQUIRED( NAME,ZNAME,TYPE,IN,OUT) { \10 # define MOD_KEYWORD_REQUIRED(ZNAME,NAME,TYPE,IN,OUT) { \ 11 11 if (!gfits_scan (header, ZNAME, TYPE, 1, IN)) ESCAPE; \ 12 12 gfits_delete (header, ZNAME, 1); \ … … 30 30 int gfits_uncompress_image (Header *header, Matrix *matrix, FTable *ftable, int primary) { 31 31 32 int i, j, status, zimage, zcol, Nzrows, Nout, Nzdata ;32 int i, j, status, zimage, zcol, Nzrows, Nout, Nzdata, max_tile_size, bytes_per_pixel; 33 33 char cmptype[80]; 34 34 char zaxis[10], naxis[10], key[10], word[81], exttype[81], checksum[81], datasum[81]; … … 145 145 gfits_create_matrix (header, matrix); 146 146 147 // XXX is maxlen in bytes or in pixels?148 ALLOCATE (out, char, zdef.maxlen);149 150 147 // counters for tile numbers 151 148 ALLOCATE (otile, int, matrix->Naxes); 152 149 ALLOCATE (ntile, int, matrix->Naxes); 150 max_tile_size = 1; 153 151 for (i = 0; i < matrix->Naxes; i++) { 154 152 otile[i] = 0; 155 153 ntile[i] = (matrix->Naxis[i] % ztile[i]) ? (matrix->Naxis[i] / ztile[i] + 1) : (matrix->Naxis[i] / ztile[i]); 156 } 154 max_tile_size *= ztile[i]; 155 } 156 157 // max_tile_size is in pixels 158 bytes_per_pixel = abs(header[0].bitpix) / 8; 159 ALLOCATE (out, char, bytes_per_pixel*max_tile_size); 157 160 158 161 // uncompress the data 159 162 Nzrows = ftable->header->Naxis[1]; 160 163 for (i = 0; i < Nzrows; i++) { 164 165 // expected output size for this tile 166 Nout = gfits_tile_size (matrix, otile, ztile); 167 161 168 switch (zdef.format) { 162 163 // may need to multiple by byte/pix164 Nout = zdef.maxlen;165 166 169 // gfits_varlength returns a pointer to a chunk of Nzdata of data elements starting at zdata. 167 170 // uncompress_data uncompresses from zdata to the temporary output buffer which must be allocated 171 168 172 // XXX need to have an API to send the user data 173 174 // XXX need to byte-swap the table column; this needs to be worked out more clearly 175 // in the APIs: do the table read / column extract functions swap or not?. we have 176 // put the byte-swapping in gifts_varlength_column_pointer, but this is fairly weak. 169 177 170 178 case 'B': { 171 179 char *zdata; 172 180 zdata = gfits_varlength_column_pointer (ftable, &zdef, i, &Nzdata); 173 gfits_byteswap_zdata (zdata, Nzdata, 8); 174 gfits_uncompress_data (zdata, Nzdata, zdef.cmptype, optname, optvalue, Noptions, out, &Nout); 175 gfits_distribute_data (matrix, 8, out, Nout, otile, ztile, zscale, zzero); // copy the uncompressed pixels into their correct locations 181 if (!zdata) return (FALSE); 182 if (!gfits_byteswap_zdata ((char *)zdata, Nzdata, 8)) return (FALSE); 183 if (!gfits_uncompress_data ((char *)zdata, Nzdata, cmptype, optname, optvalue, Noptions, out, &Nout, bytes_per_pixel)) return (FALSE); 184 if (!gfits_distribute_data (matrix, 8, out, Nout, otile, ztile, zscale, zzero)) return (FALSE); 185 // copy the uncompressed pixels into their correct locations 176 186 break; 177 187 } … … 180 190 short *zdata; 181 191 zdata = gfits_varlength_column_pointer (ftable, &zdef, i, &Nzdata); 182 gfits_byteswap_zdata ((char *) zdata, Nzdata, 16); 183 gfits_uncompress_data ((char *) zdata, Nzdata, zdef.cmptype, optname, optvalue, Noptions, out, &Nout); 184 gfits_distribute_data (matrix, 16, out, Nout, otile, ztile, zscale, zzero); // copy the uncompressed pixels into their correct locations 192 if (!zdata) return (FALSE); 193 if (!gfits_byteswap_zdata ((char *)zdata, Nzdata, 16)) return (FALSE); 194 if (!gfits_uncompress_data ((char *)zdata, Nzdata, cmptype, optname, optvalue, Noptions, out, &Nout, bytes_per_pixel)) return (FALSE); 195 if (!gfits_distribute_data (matrix, 16, out, Nout, otile, ztile, zscale, zzero)) return (FALSE); 196 // copy the uncompressed pixels into their correct locations 185 197 break; 186 198 } … … 188 200 case 'J': { 189 201 int *zdata; 190 zdata = gfits_varlength_column_pointer (ftable, &zdef, i, &Nzdata); 191 gfits_byteswap_zdata ((char *) zdata, Nzdata, 32); 192 gfits_uncompress_data ((char *) zdata, Nzdata, zdef.cmptype, optname, optvalue, Noptions, out, &Nout); 193 gfits_distribute_data (matrix, 32, out, Nout, otile, ztile, zscale, zzero); // copy the uncompressed pixels into their correct locations 202 if (!zdata) return (FALSE); 203 if (!gfits_byteswap_zdata ((char *)zdata, Nzdata, 32)) return (FALSE); 204 if (!gfits_uncompress_data ((char *)zdata, Nzdata, cmptype, optname, optvalue, Noptions, out, &Nout, bytes_per_pixel)) return (FALSE); 205 if (!gfits_distribute_data (matrix, 32, out, Nout, otile, ztile, zscale, zzero)) return (FALSE); 206 // copy the uncompressed pixels into their correct locations 194 207 break; 195 208 } 196 209 197 210 default: 198 abort(); 211 fprintf (stderr, "invalid size for compressed data: %c\n", zdef.format); 212 return (FALSE); 199 213 } 200 214 … … 212 226 } 213 227 214 int gfits_uncompress_data (char *zdata, int Nzdata, char *cmptype, char **optname, char **optvalue, int Nopt, char *outdata, int *Nout) { 215 216 // XXX allow lowercase value? 217 if (!strcasecmp(cmptype, "GZIP")) { 218 unsigned long tNout = *Nout; 219 uncompress ((Bytef *) outdata, &tNout, (Bytef *) zdata, Nzdata); 220 *Nout = tNout; 221 return (TRUE); 222 } 223 224 if (!strcasecmp(cmptype, "RICE")) { 228 int gfits_tile_size (Matrix *matrix, int *otile, int *ztile) { 229 230 int i, Npixels, Ndimen; 231 232 // true sizes of this tile (in pixels) 233 Npixels = 1; 234 for (i = 0; i < matrix->Naxes; i++) { 235 Ndimen = MIN ((matrix->Naxis[i] - otile[i]*ztile[i]), ztile[i]); 236 Npixels *= Ndimen; 225 237 } 226 238 227 if (!strcasecmp(cmptype, "PLIO")) { 228 } 229 230 if (!strcasecmp(cmptype, "HCOMPRESS")) { 231 } 232 return (TRUE); 239 return (Npixels); 233 240 } 234 241 … … 399 406 return (TRUE); 400 407 } 408 409 int gfits_extension_is_compressed (Header *header) { 410 411 int has_extname, has_zimage, zimage; 412 char extname[80]; 413 414 has_extname = gfits_scan (header, "EXTNAME", "%s", 1, extname); 415 has_zimage = gfits_scan (header, "ZIMAGE", "%t", 1, &zimage); 416 417 if (has_zimage && zimage) return (TRUE); 418 if (has_extname) { 419 if (!strcmp (extname, "COMPRESSED_IMAGE")) return (TRUE); 420 } 421 422 return (FALSE); 423 } 424 425 int gfits_compressed_is_primary (Header *header) { 426 427 int has_ztension, has_zimage; 428 int ztension, zimage; 429 430 has_zimage = gfits_scan (header, "ZIMAGE", "%t", 1, &zimage); 431 has_ztension = gfits_scan (header, "ZTENSION", "%t", 1, &ztension); 432 433 if (has_zimage && zimage) return (TRUE); 434 435 return (FALSE); 436 } -
branches/eam_branch_20071015/Ohana/src/libfits/table/F_table_varlength.c
r15353 r15439 4 4 int gfits_varlength_column_define (FTable *ftable, VarLengthColumn *def, int column) { 5 5 6 int i, N , Nv, Nb;6 int i, Nv, Nb; 7 7 char *p1, *p2, *p3; 8 8 char field[81]; … … 39 39 if (*p1 == 'P') { return (FALSE); } 40 40 41 def [0].nbytes = 0;42 if (*p1 == 'X') { def [0].nbytes = 1; def[0].format = *p1; }43 if (*p1 == 'L') { def [0].nbytes = 1; def[0].format = *p1; }44 if (*p1 == 'A') { def [0].nbytes = 1; def[0].format = *p1; }45 if (*p1 == 'B') { def [0].nbytes = 1; def[0].format = *p1; }46 if (*p1 == 'I') { def [0].nbytes = 2; def[0].format = *p1; }47 if (*p1 == 'J') { def [0].nbytes = 4; def[0].format = *p1; }48 if (*p1 == 'E') { def [0].nbytes = 4; def[0].format = *p1; }49 if (*p1 == 'D') { def [0].nbytes = 8; def[0].format = *p1; }50 if (*p1 == 'C') { def [0].nbytes = 8; def[0].format = *p1; }51 if (*p1 == 'M') { def [0].nbytes = 16; def[0].format = *p1; }52 if (!def [0].nbytes) { return (FALSE); }41 def->nbytes = 0; 42 if (*p1 == 'X') { def->nbytes = 1; def->format = *p1; } 43 if (*p1 == 'L') { def->nbytes = 1; def->format = *p1; } 44 if (*p1 == 'A') { def->nbytes = 1; def->format = *p1; } 45 if (*p1 == 'B') { def->nbytes = 1; def->format = *p1; } 46 if (*p1 == 'I') { def->nbytes = 2; def->format = *p1; } 47 if (*p1 == 'J') { def->nbytes = 4; def->format = *p1; } 48 if (*p1 == 'E') { def->nbytes = 4; def->format = *p1; } 49 if (*p1 == 'D') { def->nbytes = 8; def->format = *p1; } 50 if (*p1 == 'C') { def->nbytes = 8; def->format = *p1; } 51 if (*p1 == 'M') { def->nbytes = 16; def->format = *p1; } 52 if (!def->nbytes) { return (FALSE); } 53 53 54 54 /* scan columns to find column offset */ 55 def [0].Nstart = 0;56 for (i = 1; i < N; i++) {55 def->Nstart = 0; 56 for (i = 1; i < column; i++) { 57 57 sprintf (field, "TFORM%d", i); 58 58 gfits_scan (ftable->header, field, "%s", 1, format); 59 59 gfits_bintable_format (format, tmpline, &Nv, &Nb); 60 def [0].Nstart += Nv*Nb;60 def->Nstart += Nv*Nb; 61 61 } 62 62 63 if (!gfits_scan (ftable->header, "THEAP", "%d", 1, &def [0].theap)) {64 def [0].theap= ftable->header->Naxis[0]*ftable->header->Naxis[1];63 if (!gfits_scan (ftable->header, "THEAP", "%d", 1, &def->heap_start)) { 64 def->heap_start = ftable->header->Naxis[0]*ftable->header->Naxis[1]; 65 65 } 66 66 … … 70 70 void *gfits_varlength_column_pointer (FTable *ftable, VarLengthColumn *column, int row, int *length) { 71 71 72 int offset, N y, *ptr;72 int offset, Nx, *ptr; 73 73 74 74 // find the values for the specified row 75 75 // the values in the main table for this row and varlength column: 76 Ny = ftable->header->Naxis[1]; 77 ptr = (int *) &ftable->buffer[row*Ny + column->Nstart]; 78 offset = ptr[0]; 79 *length = ptr[1]; 76 Nx = ftable->header->Naxis[0]; 77 78 # define SWAP_WORD \ 79 tmp = pchar[0]; pchar[0] = pchar[3]; pchar[3] = tmp; \ 80 tmp = pchar[1]; pchar[1] = pchar[2]; pchar[2] = tmp; 81 82 # ifdef BYTE_SWAP 83 char *pchar, tmp; 84 pchar = &ftable->buffer[row*Nx + column->Nstart]; 85 SWAP_WORD; 86 pchar = &ftable->buffer[row*Nx + column->Nstart + 4]; 87 SWAP_WORD; 88 # endif 89 90 ptr = (int *) &ftable->buffer[row*Nx + column->Nstart]; 91 *length = ptr[0]; 92 offset = ptr[1]; 80 93 81 94 switch (column->format) { … … 85 98 case 'B': { 86 99 char *result; 87 result = (char *) ftable->buffer + column-> theap+ offset;100 result = (char *) ftable->buffer + column->heap_start + offset; 88 101 return result; 89 102 } 90 103 case 'I': { 91 104 short *result; 92 result = (short *) ftable->buffer + column-> theap+ offset;105 result = (short *) ftable->buffer + column->heap_start + offset; 93 106 return result; 94 107 } 95 108 case 'J': { 96 109 int *result; 97 result = (int *) ftable->buffer + column-> theap+ offset;110 result = (int *) ftable->buffer + column->heap_start + offset; 98 111 return result; 99 112 } … … 101 114 case 'C': { 102 115 float *result; 103 result = (float *) ftable->buffer + column-> theap+ offset;116 result = (float *) ftable->buffer + column->heap_start + offset; 104 117 return result; 105 118 } … … 107 120 case 'M': { 108 121 double *result; 109 result = (double *) ftable->buffer + column-> theap+ offset;122 result = (double *) ftable->buffer + column->heap_start + offset; 110 123 return result; 111 124 }
Note:
See TracChangeset
for help on using the changeset viewer.
