/* See {dsm_image_decoding.h} */ /* Last edited on 2016-04-11 22:04:27 by stolfilocal */ #define _GNU_SOURCE #include #include #include #include #include #include #include void dsm_image_decoding_compute_linear_map(dsm_image_decoding_t *dec, int NC, double tlo[], double thi[]) { demand(! (isnan(dec->gamma) || isnan(dec->bias) || isnan(dec->vlo) || isnan(dec->vhi)), "undefined {dec}"); double etlo, ethi; if (dec->gamma == 1.0) { /* Simple affine map: */ etlo = (float)dec->vlo; ethi = (float)dec->vhi; } else { /* Must more complicated map: */ double vmax = fmax(fabs(dec->vlo), fabs(dec->vhi)); double ulo = dec->vlo/vmax; double uhi = dec->vhi/vmax; /* Must find {etlo,ethi} that are gamma mapped to {ulo,uhi}: */ etlo = (double)sample_conv_gamma((float)ulo, 1/dec->gamma, dec->bias); ethi = (double)sample_conv_gamma((float)uhi, 1/dec->gamma, dec->bias); } /* Replicate into arrays: */ for (int c = 0; c < NC; c++) { tlo[c] = etlo; thi[c] = ethi; } }