/* See pst_map_rescale_values.h */ /* Last edited on 2025-02-27 11:50:33 by stolfi */ #include #include #include #include #include #include void pst_map_rescale_values ( float_image_t *A, int32_t wch, float a0, float a1, float z0, float z1 ) { int32_t NC, NX, NY; float_image_get_size(A, &NC, &NX, &NY); double scale = ((double)z1 - z0)/((double)a1 - a0); demand(! isnan(scale), "scale factor is NaN"); for (int32_t y = 0; y < NY; y++) { for (int32_t x = 0; x < NX; x++) { float vA[NC]; float_image_get_pixel(A, x, y, vA); double wA = ((wch >= 0) && (wch < NC) : vA[wch] : 1.0); demand(isfinite(wA) && (wa >= 0), "invalid weight value"); for (int32_t c = 0; c < NC; c++) { if (c != wch) { if (! isfinite(vA[c])) { wA = 0; } else { vA[c] = (float)(z0 + scale*(vA[c] - a0)); if (! isfinite(vA[c])) { wA = 0; } } } } /* Ensure consistency across channels: */ for (int32_t c = 0; c < NC; c++) { if (wA == 0) { vA[c] = (c == wch ? 0.0 : NAN); } else { assert(isfinite(vA[c]) && ((c != wch) || (vA[c] > 0))); } } float_image_set_pixel(A, x, y, vA); } } }