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; } } }
static void randomize_tiles (GeglProperties *o, const GeglRectangle *rect, gint division_x, gint division_y, gint offset_x, gint offset_y, gint n_tiles, Tile *tiles) { Tile *t = tiles; gint move_max_pixels = o->move_rate * o->tile_width / 100; gint x; gint y; for (y = 0; y < division_y; y++) { gint srcy = offset_y + o->tile_height * y; for (x = 0; x < division_x; x++, t++) { gint srcx = offset_x + o->tile_width * x; if (srcx < 0) { t->x = 0; t->width = srcx + o->tile_width; } else if (srcx + o->tile_width < rect->width) { t->x = srcx; t->width = o->tile_width; } else { t->x = srcx; t->width = rect->width - srcx; } if (srcy < 0) { t->y = 0; t->height = srcy + o->tile_height; } else if (srcy + o->tile_height < rect->height) { t->y = srcy; t->height = o->tile_height; } else { t->y = srcy; t->height = rect->height - srcy; } t->z = gegl_random_int (o->rand, x, y, 0, 0); random_move (x, y, &t->move_x, &t->move_y, move_max_pixels, o); } } qsort (tiles, n_tiles, sizeof (*tiles), tile_compare); }