/********************************/ /* film valdes 8 30 82 */ /* */ /* Intensity relation */ /********************************/ #include "focas1.h" float film (d) int d; { register int i; float func (); if (sp.pflags & LNR) return (pthdr.bscale * d + pthdr.bzero); if (sp.pflags & DLUT) { if (d <= flmcv[0].d) return (flmcv[0].i); if (d >= sp.nden) return (flmcv[sp.nden - 1].i); else return (flmcv[d].i); } if (sp.pflags & INTP) { if (d <= flmcv[0].d) return (flmcv[0].i); if (d >= flmcv[sp.nden - 1].d) return (flmcv[sp.nden - 1].i); for (i = 0; d > flmcv[i + 1].d; i++); return ((d - flmcv[i].d) * flmcv[i].slope + flmcv[i].i); } if (sp.pflags & FUNC) return (func (d)); focaserr (1, "film: D-to-I relation is unknown", ""); } PIXEL ifilm (d) float d; { register i; if (sp.nden == 0) return ((PIXEL) ((d - pthdr.bzero) / pthdr.bscale)); if (d <= flmcv[0].i) return (flmcv[0].d); if (d >= flmcv[sp.nden - 1].i) return (flmcv[sp.nden - 1].d); for (i = 0; d > flmcv[i + 1].i; i++); if (flmcv[i].slope != 0.) return ((d - flmcv[i].i) / flmcv[i].slope + flmcv[i].d); else return (flmcv[i].d); } float func (d) int d; { float c, i, f, g; if (d <= 0) return (0.); if (flmcv[0].i == 0.) return ((float) d); i = (float) d / sp.satr; g = exp (flmcv[0].i * i); f = log (g - 1.0); c = flmcv[1].i + i * flmcv[2].i + f * flmcv[3].i + g * flmcv[4].i; c = c < 0.? 0.: c; c = c > 4.? 4.: c; return (exp (2.303 * c)); }