static void process_row_resilient (GeglBufferIterator *gi, guint channel_mask [4], guint channel_bits [4], gint y, GeglRandom *rand) { guint16 *data_in = (guint16*) gi->data [0]; guint16 *data_out = (guint16*) gi->data [1]; guint x; for (x = 0; x < gi->roi->width; x++) { guint pixel = 4 * (gi->roi->width * y + x); guint ch; for (ch = 0; ch < 4; ch++) { gdouble value; gdouble value_clamped; gdouble quantized; gint r = REDUCE_16B (gegl_random_int (rand, gi->roi->x + x, gi->roi->y + y, 0, ch)); value = data_in [pixel + ch]; value = value + ((65535.0 / (8 * value + 48 * 65535)) + 1.2) * (r / (1 << channel_bits [ch])); value_clamped = CLAMP (value, 0.0, 65535.0); quantized = quantize_value ((guint) (value_clamped + 0.5), channel_bits [ch], channel_mask [ch]); data_out [pixel + ch] = (guint16) quantized; } } }
static void inline process_row_random_covariant (GeglBufferIterator *gi, guint channel_mask [4], guint channel_bits [4], gint y, GeglRandom *rand) { guint16 *data_in = (guint16*) gi->data [0]; guint16 *data_out = (guint16*) gi->data [1]; guint x; for (x = 0; x < gi->roi->width; x++) { guint pixel = 4 * (gi->roi->width * y + x); guint ch; gint r = REDUCE_16B (gegl_random_int (rand, gi->roi->x + x, gi->roi->y + y, 0, 0)); for (ch = 0; ch < 4; ch++) { gfloat value; gfloat value_clamped; gfloat quantized; value = data_in [pixel + ch] + (r / (1 << channel_bits [ch])); value_clamped = CLAMP (value, 0.0, 65535.0); quantized = quantize_value ((guint) (value_clamped + 0.5), channel_bits [ch], channel_mask [ch]); data_out [pixel + ch] = (guint16) quantized; } } }