/* Fix defaults for scale and offset: */ provide_scale_offset_defaults(o->op, o->squared, o->verbose, &(o->scale), &(o->offset)); void provide_scale_offset_defaults ( image_window_op_t op, bool_t squared, bool_t verbose, double *scaleP, double *offsetP ); /* If any of {*scaleP} and {*offsetP} is {NAN}, sets it to the default most appropriate for the given operator {op} and the given {squared} option. */ void provide_scale_offset_defaults ( image_window_op_t op, bool_t squared, bool_t verbose, double *scaleP, double *offsetP ) { /* Determine the natural range {[lo_hi]} of the operator: */ double lo, hi; image_window_op_get_range(op, squared, &lo, &hi); if (verbose) { fprintf(stderr, "unscaled operator range = [ %24.16f _ %24.16f]\n", lo, hi); } assert(lo < hi); double scale = (*scaleP); double offset = (*offsetP); if (isnan(scale) && isnan(offset)) { /* Map natural range to {[0_1]}: */ scale = 1.0/(hi - lo); offset = 0.5 - scale*(hi + lo)/2; } else if (isnan(scale)) { double rad = fmax(hi, -lo); scale = 0.5/rad; } else if (isnan(offset)) { double ctr = scale*(hi + lo)/2; offset = 0.5 - ctr; } if (verbose) { fprintf(stderr, "using scale = %24.16f offset = %24.16f\n", scale, offset); } (*scaleP) = scale; (*offsetP) = offset; }