static void gimp_desaturate_tool_config_notify (GObject *object, GParamSpec *pspec, GimpDesaturateTool *desaturate_tool) { GimpDesaturateConfig *config = GIMP_DESATURATE_CONFIG (object); if (! desaturate_tool->button) return; gimp_int_radio_group_set_active (GTK_RADIO_BUTTON (desaturate_tool->button), config->mode); gimp_image_map_tool_preview (GIMP_IMAGE_MAP_TOOL (desaturate_tool)); }
static void gimp_desaturate_config_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GimpDesaturateConfig *self = GIMP_DESATURATE_CONFIG (object); switch (property_id) { case PROP_MODE: self->mode = g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } }
static gboolean gimp_operation_desaturate_process (GeglOperation *operation, void *in_buf, void *out_buf, glong samples, const GeglRectangle *roi, gint level) { GimpOperationPointFilter *point = GIMP_OPERATION_POINT_FILTER (operation); GimpDesaturateConfig *config = GIMP_DESATURATE_CONFIG (point->config); gfloat *src = in_buf; gfloat *dest = out_buf; if (! config) return FALSE; switch (config->mode) { case GIMP_DESATURATE_LIGHTNESS: while (samples--) { gfloat min, max, value; max = MAX (src[0], src[1]); max = MAX (max, src[2]); min = MIN (src[0], src[1]); min = MIN (min, src[2]); value = (max + min) / 2; dest[0] = value; dest[1] = value; dest[2] = value; dest[3] = src[3]; src += 4; dest += 4; } break; case GIMP_DESATURATE_LUMINOSITY: while (samples--) { gfloat value = GIMP_RGB_LUMINANCE (src[0], src[1], src[2]); dest[0] = value; dest[1] = value; dest[2] = value; dest[3] = src[3]; src += 4; dest += 4; } break; case GIMP_DESATURATE_AVERAGE: while (samples--) { gfloat value = (src[0] + src[1] + src[2]) / 3; dest[0] = value; dest[1] = value; dest[2] = value; dest[3] = src[3]; src += 4; dest += 4; } break; } return TRUE; }