/* The number of entries needed to invert a lookup table should not necessarily be the same as the original number of entries. This is especially true of lookup tables that have a small number of entries. For example: Using a table like: {0, 3104, 14263, 34802, 65535} invert_lut will produce an inverse of: {3, 34459, 47529, 56801, 65535} which has an maximum error of about 9855 (pixel difference of ~38.346) For now, we punt the decision of output size to the caller. */ static uint16_t *invert_lut(uint16_t *table, int length, size_t out_length) { int i; /* for now we invert the lut by creating a lut of size out_length * and attempting to lookup a value for each entry using lut_inverse_interp16 */ uint16_t *output = malloc(sizeof(uint16_t)*out_length); if (!output) return NULL; for (i = 0; i < out_length; i++) { double x = ((double) i * 65535.) / (double) (out_length - 1); uint16_fract_t input = floor(x + .5); output[i] = lut_inverse_interp16(input, table, length); } return output; }
/* The number of entries needed to invert a lookup table should not necessarily be the same as the original number of entries. This is especially true of lookup tables that have a small number of entries. For example: Using a table like: {0, 3104, 14263, 34802, 65535} invert_lut will produce an inverse of: {3, 34459, 47529, 56801, 65535} which has an maximum error of about 9855 (pixel difference of ~38.346) For now, we punt the decision of output size to the caller. */ static uint16_t *invert_lut(uint16_t *table, int length, size_t out_length) { int NumZeroes; int NumPoles; int i; /* for now we invert the lut by creating a lut of size out_length * and attempting to lookup a value for each entry using lut_inverse_interp16 */ uint16_t *output = malloc(sizeof(uint16_t)*out_length); if (!output) return NULL; // December/16 2015 - Compute the input curve zero and pole extents outside // the loop and pass them to lut_inverse_interp16. count_zeroes_and_poles(table, length, &NumZeroes, &NumPoles); for (i = 0; i < out_length; i++) { double x = ((double) i * 65535.) / (double) (out_length - 1); uint16_fract_t input = floor(x + .5); output[i] = lut_inverse_interp16(input, table, length, NumZeroes, NumPoles); } return output; }