- Timestamp:
- Jun 4, 2015, 8:49:25 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ohana.20150429/src/libfits/table/F_uncompress_T.c
r38356 r38363 3 3 # include <zlib.h> 4 4 5 # define ESCAPE(A) { fprintf (stderr, "error in %s @ line %d\n", __func__, __LINE__); goto escape; } 6 7 int gfits_distribute_table_data (FTable *table, char *raw, int col, int row_start, int Nrows, int rowsize); 5 # define ESCAPE { fprintf (stderr, "error in %s @ line %d\n", __func__, __LINE__); goto escape; } 6 7 int gfits_distribute_table_data (FTable *table, TableField *field, char *raw, int row_start, int Nrows); 8 int gfits_distribute_table_gzp2 (FTable *table, TableField *field, char *raw, int row_start, int Nrows); 8 9 9 10 # define VERBOSE_DUMP 0 … … 53 54 54 55 int ztilelen; 55 if (!gfits_scan (srcheader, "ZTILELEN", "%d", 1, &ztilelen)) ESCAPE (A);56 if (!gfits_scan (srcheader, "ZTILELEN", "%d", 1, &ztilelen)) ESCAPE; 56 57 // XXX if ZTILELEN is missing, it should have the value of ZNAXIS2 57 58 … … 63 64 64 65 // creates an empty (Naxes = 2, Naxis[i] = 0) table header with XTENSION = BINTABLE, EXTNAME = COMPRESSED_TABLE 65 if (!gfits_create_table_header (tgtheader, "BINTABLE", extname)) ESCAPE (A);66 if (!gfits_create_table_header (tgtheader, "BINTABLE", extname)) ESCAPE; 66 67 67 68 int Nfields; 68 if (!gfits_scan (srcheader, "TFIELDS", "%d", 1, &Nfields)) ESCAPE (A);69 if (!gfits_scan (srcheader, "TFIELDS", "%d", 1, &Nfields)) ESCAPE; 69 70 70 71 // below we generate a fake table with tmpbuffers. allocated it to the max needed size … … 76 77 for (i = 0; i < Nfields; i++) { 77 78 snprintf (keyword, 80, "TTYPE%d", i+1); 78 if (!gfits_scan (srcheader, keyword, "%s", 1, fields[i].ttype)) ESCAPE (A);79 if (!gfits_scan_alt (srcheader, keyword, "%C", 1, fields[i].ttype_cmt)) ESCAPE (A);79 if (!gfits_scan (srcheader, keyword, "%s", 1, fields[i].ttype)) ESCAPE; 80 if (!gfits_scan_alt (srcheader, keyword, "%C", 1, fields[i].ttype_cmt)) ESCAPE; 80 81 81 82 // TUNIT is not mandatory … … 84 85 fields[i].tunit[0] = 0; 85 86 } else { 86 if (!gfits_scan_alt (srcheader, keyword, "%C", 1, fields[i].tunit_cmt)) ESCAPE (A);87 if (!gfits_scan_alt (srcheader, keyword, "%C", 1, fields[i].tunit_cmt)) ESCAPE; 87 88 } 88 89 89 90 snprintf (keyword, 80, "ZFORM%d", i+1); 90 if (!gfits_scan (srcheader, keyword, "%s", 1, fields[i].tformat)) ESCAPE (A);91 if (!gfits_scan_alt (srcheader, keyword, "%C", 1, fields[i].tformat_cmt)) ESCAPE (A);91 if (!gfits_scan (srcheader, keyword, "%s", 1, fields[i].tformat)) ESCAPE; 92 if (!gfits_scan_alt (srcheader, keyword, "%C", 1, fields[i].tformat_cmt)) ESCAPE; 92 93 93 94 snprintf (keyword, 80, "ZCTYP%d", i+1); … … 96 97 } 97 98 98 if (!gfits_bintable_format (fields[i].tformat, fields[i].datatype, &fields[i].Nvalues, &fields[i].pixsize)) ESCAPE (A);99 if (!gfits_bintable_format (fields[i].tformat, fields[i].datatype, &fields[i].Nvalues, &fields[i].pixsize)) ESCAPE; 99 100 fields[i].rowsize = fields[i].Nvalues*fields[i].pixsize; 100 101 max_width = MAX(max_width, fields[i].rowsize); … … 103 104 offset += fields[i].rowsize; 104 105 105 if (!gfits_varlength_column_define (srctable, &fields[i].zdef, i + 1)) ESCAPE (A);106 107 if (!gfits_define_bintable_column (tgtheader, fields[i].tformat, fields[i].ttype, fields[i].ttype_cmt, fields[i].tunit, 1.0, 0.0)) ESCAPE (A);106 if (!gfits_varlength_column_define (srctable, &fields[i].zdef, i + 1)) ESCAPE; 107 108 if (!gfits_define_bintable_column (tgtheader, fields[i].tformat, fields[i].ttype, fields[i].ttype_cmt, fields[i].tunit, 1.0, 0.0)) ESCAPE; 108 109 } 109 110 110 111 // allocates the default data array (tgttable->buffer) 111 if (!gfits_create_table (tgtheader, tgttable)) ESCAPE (A);112 if (!gfits_create_table (tgtheader, tgttable)) ESCAPE; 112 113 113 114 // copy original header to output header (XXX this needs to be finished) 114 if (!gfits_copy_keywords_compress (srcheader, tgtheader)) ESCAPE (A);115 if (!gfits_copy_keywords_compress (srcheader, tgtheader)) ESCAPE; 115 116 116 117 off_t Nx, Ny; 117 if (!gfits_scan (srcheader, "ZNAXIS1", OFF_T_FMT, 1, &Nx)) ESCAPE (A);118 if (!gfits_scan (srcheader, "ZNAXIS2", OFF_T_FMT, 1, &Ny)) ESCAPE (A);118 if (!gfits_scan (srcheader, "ZNAXIS1", OFF_T_FMT, 1, &Nx)) ESCAPE; 119 if (!gfits_scan (srcheader, "ZNAXIS2", OFF_T_FMT, 1, &Ny)) ESCAPE; 119 120 myAssert (Nx == tgtheader->Naxis[0], "table definition error?"); 120 121 … … 123 124 ALLOCATE_ZERO (tmpbuffer, char, max_width*Ny); 124 125 for (i = 0; i < Nfields; i++) { 125 if (!gfits_set_bintable_column (tgtheader, tgttable, fields[i].ttype, tmpbuffer, Ny)) ESCAPE (A);126 if (!gfits_set_bintable_column (tgtheader, tgttable, fields[i].ttype, tmpbuffer, Ny)) ESCAPE; 126 127 } 127 128 free (tmpbuffer); … … 153 154 off_t Nzdata; 154 155 char *zdata = gfits_varlength_column_pointer (srctable, &fields[i].zdef, row, &Nzdata); 155 if (!zdata) ESCAPE (A);156 if (!zdata) ESCAPE; 156 157 158 if (strcasecmp(fields[i].zctype, "GZIP_1") && strcasecmp(fields[i].zctype, "GZIP_2") && strcasecmp(fields[i].zctype, "RICE_1")) { 159 // Nzdata is number of bytes 160 if (!gfits_byteswap_zdata (zdata, Nzdata, fields[i].pixsize)) ESCAPE; 161 } 162 157 163 int Nrows = (row == Ntile - 1) ? ztilelast : ztilelen; 158 164 int Nraw = Nraw_alloc; // expected number of pixel: Nrows*fields[i].Nvalues 159 if (!gfits_uncompress_data (zdata, Nzdata, fields[i].zctype, NULL, NULL, 0, raw, &Nraw, fields[i].pixsize)) ESCAPE (A);165 if (!gfits_uncompress_data (zdata, Nzdata, fields[i].zctype, NULL, NULL, 0, raw, &Nraw, fields[i].pixsize)) ESCAPE; 160 166 161 167 if (!strcasecmp(fields[i].zctype, "GZIP_1")) { 162 168 myAssert ((fields[i].zdef.format != 'C') && (fields[i].zdef.format != 'M'), "swap is probably wrong for C or M columns"); 163 if (!gfits_byteswap_zdata (raw, Nraw * fields[i].pixsize, fields[i].pixsize)) ESCAPE (A);169 if (!gfits_byteswap_zdata (raw, Nraw * fields[i].pixsize, fields[i].pixsize)) ESCAPE; 164 170 } 165 171 … … 171 177 172 178 // copy the raw pixels from their native matrix locations to the temporary output buffer 173 if (!gfits_distribute_table_data (tgttable, raw, fields[i].offset, row_start, Nrows, fields[i].rowsize)) ESCAPE(A); 174 175 // XXX need to activate 176 // if (FALSE) gfits_byteswap_zdata (zdata, Nzdata, zdata_pixsize) ESCAPE(A); 179 if (!strcasecmp(fields[i].zctype, "GZIP_2")) { 180 if (!gfits_distribute_table_gzp2 (tgttable, &fields[i], raw, row_start, Nrows)) ESCAPE; 181 } else { 182 if (!gfits_distribute_table_data (tgttable, &fields[i], raw, row_start, Nrows)) ESCAPE; 183 } 177 184 } 178 185 } … … 194 201 // raw_pixsize is the bytes / pixel for the input matrix 195 202 // place the raw image bytes for the current tile into the tile buffer 196 int gfits_distribute_table_data (FTable *table, char *raw, int col, int row_start, int Nrows, int rowsize) {203 int gfits_distribute_table_data (FTable *table, TableField *field, char *raw, int row_start, int Nrows) { 197 204 198 205 off_t i; … … 202 209 off_t Nx = table->header->Naxis[0]; 203 210 204 if (VERBOSE) fprintf (stderr, " collect: ");211 if (VERBOSE) fprintf (stderr, "distribute: "); 205 212 for (i = 0; i < Nrows; i++) { 206 213 int row = row_start + i; 207 memcpy (&table->buffer[Nx*row + col], &raw[i*rowsize],rowsize);214 memcpy (&table->buffer[Nx*row + field->offset], &raw[i*field->rowsize], field->rowsize); 208 215 # if (VERBOSE) 209 int j; for (j = 0; j < rowsize; j++) fprintf (stderr, "0x%02hhx ", table->buffer[Nx*row + col+ j]);216 int j; for (j = 0; j < field->rowsize; j++) fprintf (stderr, "0x%02hhx ", table->buffer[Nx*row + field->offset + j]); 210 217 # endif 211 218 } … … 214 221 return (TRUE); 215 222 } 223 224 int gfits_distribute_table_gzp2 (FTable *table, TableField *field, char *raw, int row_start, int Nrows) { 225 226 off_t i, j, k; 227 228 // we are copying NN rows into the column which starts at XX and has MM bytes per row 229 230 off_t Nx = table->header->Naxis[0]; 231 232 for (k = 0; k < field->pixsize; k++) { 233 for (i = 0; i < Nrows; i++) { 234 int row = row_start + i; 235 char *src = &raw[i*field->rowsize + k*Nrows*field->Nvalues]; 236 char *tgt = &table->buffer[Nx*row + field->offset + k]; 237 for (j = 0; j < field->Nvalues; j++, tgt+=field->pixsize, src++) { 238 *tgt = *src; 239 } 240 } 241 } 242 return (TRUE); 243 }
Note:
See TracChangeset
for help on using the changeset viewer.
