static void mean_rectangle_noalloc (GeglBuffer *input, GeglRectangle *rect, GeglColor *color) { GeglBufferIterator *gi; gfloat col[] = {0.0, 0.0, 0.0, 0.0}; gint c; gi = gegl_buffer_iterator_new (input, rect, 0, babl_format ("RaGaBaA float"), GEGL_ACCESS_READ, GEGL_ABYSS_CLAMP); while (gegl_buffer_iterator_next (gi)) { gint k; gfloat *data = (gfloat*) gi->data[0]; for (k = 0; k < gi->length; k++) { for (c = 0; c < 4; c++) col[c] += data[c]; data += 4; } } for (c = 0; c < 4; c++) col[c] /= rect->width * rect->height; gegl_color_set_pixel (color, babl_format ("RaGaBaA float"), col); }
GeglColor * gimp_gegl_color_new (const GimpRGB *rgb) { GeglColor *color; g_return_val_if_fail (rgb != NULL, NULL); color = gegl_color_new (NULL); gegl_color_set_pixel (color, babl_format ("R'G'B'A double"), rgb); return color; }
void gegl_color_set_components (GeglColor *color, GValue *value, gdouble *components, gint components_length) { Babl *format; if (!(G_TYPE_POINTER == G_VALUE_TYPE(value))) return; format = g_value_get_pointer (value); if (!color || !format || components_length != babl_format_get_n_components (format)) return; else { gint bpp = babl_format_get_bytes_per_pixel (format); const Babl *comp_type = babl_format_get_type (format, 0); if (comp_type == babl_type ("u8")) { int i; guint8 *pixel_buf = alloca (bpp * components_length); for (i = 0; i < components_length; ++i) pixel_buf[i] = components[i]; gegl_color_set_pixel (color, format, pixel_buf); } else if (comp_type == babl_type ("u16")) { int i; guint16 *pixel_buf = alloca (bpp * components_length); for (i = 0; i < components_length; ++i) pixel_buf[i] = components[i]; gegl_color_set_pixel (color, format, pixel_buf); } else if (comp_type == babl_type ("u32")) { int i; guint32 *pixel_buf = alloca (bpp * components_length); for (i = 0; i < components_length; ++i) pixel_buf[i] = components[i]; gegl_color_set_pixel (color, format, pixel_buf); } else if (comp_type == babl_type ("float")) { int i; float *pixel_buf = alloca (bpp * components_length); for (i = 0; i < components_length; ++i) pixel_buf[i] = components[i]; gegl_color_set_pixel (color, format, pixel_buf); } else if (comp_type == babl_type ("double")) { gegl_color_set_pixel (color, format, components); } } }