static gboolean process (GeglOperation *operation, void *out_buf, glong n_pixels, const GeglRectangle *roi, gint level) { GeglProperties *o = GEGL_PROPERTIES (operation); gfloat *out_pixel = out_buf; gfloat color1[4]; gfloat color2[4]; gfloat length = dist (o->start_x, o->start_y, o->end_x, o->end_y); gegl_color_get_pixel (o->start_color, babl_format ("R'G'B'A float"), color1); gegl_color_get_pixel (o->end_color, babl_format ("R'G'B'A float"), color2); if (GEGL_FLOAT_IS_ZERO (length)) { gegl_memset_pattern (out_buf, color2, sizeof(float) * 4, n_pixels); } else { gint x, y; for (y = roi->y; y < roi->y + roi->height; ++y) { for (x = roi->x; x < roi->x + roi->width; ++x) { gint c; gfloat v = dist (x, y, o->start_x, o->start_y) / length; if (v > 1.0f - GEGL_FLOAT_EPSILON) v = 1.0f; for (c = 0; c < 4; c++) out_pixel[c] = color1[c] * v + color2[c] * (1.0f - v); out_pixel += 4; } } } return TRUE; }
static gboolean checkerboard_process (GeglOperation *operation, void *out_buf, glong n_pixels, const GeglRectangle *roi, gint level) { GeglProperties *o = GEGL_PROPERTIES (operation); const Babl *out_format = gegl_operation_get_format (operation, "output"); gint pixel_size = babl_format_get_bytes_per_pixel (out_format); guchar *out_pixel = out_buf; void *color1 = alloca(pixel_size); void *color2 = alloca(pixel_size); gint y; const gint x_min = roi->x - o->x_offset; const gint y_min = roi->y - o->y_offset; const gint x_max = roi->x + roi->width - o->x_offset; const gint y_max = roi->y + roi->height - o->y_offset; const gint square_width = o->x; const gint square_height = o->y; if (level) return checkerboard_process_simple (operation, out_buf, n_pixels, roi, level); gegl_color_get_pixel (o->color1, out_format, color1); gegl_color_get_pixel (o->color2, out_format, color2); for (y = y_min; y < y_max; y++) { gint x = x_min; void *cur_color; /* Figure out which box we're in */ gint tilex = TILE_INDEX (x, square_width); gint tiley = TILE_INDEX (y, square_height); if ((tilex + tiley) % 2 == 0) cur_color = color1; else cur_color = color2; while (x < x_max) { /* Figure out how long this stripe is */ gint count; gint stripe_end = (TILE_INDEX (x, square_width) + 1) * square_width; stripe_end = stripe_end > x_max ? x_max : stripe_end; count = stripe_end - x; gegl_memset_pattern (out_pixel, cur_color, pixel_size, count); out_pixel += count * pixel_size; x = stripe_end; if (cur_color == color1) cur_color = color2; else cur_color = color1; } } return TRUE; }