Ejemplo n.º 1
0
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;
        }
    }
}
Ejemplo n.º 2
0
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;
        }
    }
}