Changeset 17660 for trunk/psLib/src/fits/psFitsScale.c
- Timestamp:
- May 13, 2008, 3:27:25 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/fits/psFitsScale.c (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/fits/psFitsScale.c
r17447 r17660 46 46 psAssert(options, "impossible"); 47 47 48 double range = pow(2.0, options->bitpix) ; // Range of values for target BITPIX48 double range = pow(2.0, options->bitpix) - 1.0; // Range of values for target BITPIX, reduced by the BLANK 49 49 double min = INFINITY, max = -INFINITY; // Minimum and maximum values 50 50 int numCols = image->numCols, numRows = image->numRows; // Size of image … … 86 86 *bzero = min; 87 87 } else { 88 *bscale = (max - min) / (range - 1.0);88 *bscale = (max - min) / range ; 89 89 *bzero = min + 0.5 * range * (*bscale); 90 90 } … … 157 157 158 158 return true; 159 160 161 return true;162 159 } 163 160 … … 168 165 bool psFitsScaleDetermine(double *bscale, // Scaling, to return 169 166 double *bzero, // Zero point, to return 167 long *blank, // Blank value, to return 170 168 const psImage *image, // Image to scale 171 169 const psFits *fits // FITS options … … 174 172 PS_ASSERT_PTR_NON_NULL(bscale, false); 175 173 PS_ASSERT_PTR_NON_NULL(bzero, false); 174 PS_ASSERT_PTR_NON_NULL(blank, false); 176 175 PS_ASSERT_IMAGE_NON_NULL(image, false); 177 176 PS_ASSERT_FITS_NON_NULL(fits, false); … … 179 178 *bscale = 1.0; 180 179 *bzero = 0.0; 180 *blank = 0; 181 181 182 182 psFitsOptions *options = fits->options; // FITS options … … 201 201 } 202 202 203 *blank = (1 << (options->bitpix - 1)) - 1; 204 203 205 switch (options->scaling) { 204 206 case PS_FITS_SCALE_NONE: … … 229 231 } 230 232 231 psTrace("psLib.fits", 3, "BSCALE = %.10lf, BZERO = %.10lf\n", *bscale, *bzero); 233 if (options->bitpix == 8) { 234 // FITS standard wants unsigned for BITPIX=8, two's-complement for BITPIX=16,32,64. 235 *bzero -= *bscale * 128; 236 *blank = 255; 237 } 238 239 240 psTrace("psLib.fits", 3, "BSCALE = %.10lf, BZERO = %.10lf, BLANK = %ld\n", *bscale, *bzero, *blank); 232 241 return true; 233 242 } … … 252 261 switch (bitpix) { 253 262 case 8: 254 outType = PS_TYPE_S8; 263 // Note: Use unsigned integer for BITPIX=8 264 outType = PS_TYPE_U8; 255 265 break; 256 266 case 16: … … 283 293 #define SCALE_WRITE_OUT_CASE(IN, INTYPE, OUT, OUTTYPE) \ 284 294 case PS_TYPE_##OUTTYPE: { \ 285 ps##INTYPE scale = 1.0 / bscale; \ 286 ps##INTYPE zero = bzero; \ 287 ps##INTYPE min = - (1 << (options->bitpix - 1)); \ 288 ps##INTYPE max = (1 << (options->bitpix - 1)) - 1; \ 295 double scale = 1.0 / bscale; \ 296 double zero = bzero; \ 297 /* Note: BITPIX=8 treated differently, since it uses unsigned values; the rest use signed */ \ 298 double min = bitpix == 8 ? 0 : -pow(2.0, options->bitpix - 1); \ 299 double max = bitpix == 8 ? 255 : (pow(2.0, options->bitpix - 1) - 1.0); \ 289 300 for (int y = 0; y < numRows; y++) { \ 290 301 for (int x = 0; x < numCols; x++) { \ … … 301 312 value += psRandomUniform(rng); \ 302 313 } \ 303 /* Check for underflow and overflow */ \304 (OUT)->data.OUTTYPE[y][x] = (value < min ? min : (value > max ? max : value)); \314 /* Check for underflow and overflow; set either to max */ \ 315 (OUT)->data.OUTTYPE[y][x] = (value < min || value > max ? max : value); \ 305 316 } \ 306 317 } \ … … 312 323 case PS_TYPE_##INTYPE: { \ 313 324 switch (outType) { \ 314 SCALE_WRITE_OUT_CASE(IN, INTYPE, OUT, S8); \325 SCALE_WRITE_OUT_CASE(IN, INTYPE, OUT, U8); \ 315 326 SCALE_WRITE_OUT_CASE(IN, INTYPE, OUT, S16); \ 316 327 SCALE_WRITE_OUT_CASE(IN, INTYPE, OUT, S32); \
Note:
See TracChangeset
for help on using the changeset viewer.
