static void sp_fill_style_widget_paint_dragged (SPPaintSelector *psel, SPWidget *spw) { const GSList *items, *i; SPGradient *vector; gfloat c[5]; if (!spw->inkscape) return; if (g_object_get_data (G_OBJECT (spw), "update")) return; g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (TRUE)); #ifdef SP_FS_VERBOSE g_print ("FillStyleWidget: paint dragged\n"); #endif switch (psel->mode) { case SP_PAINT_SELECTOR_MODE_EMPTY: case SP_PAINT_SELECTOR_MODE_MULTIPLE: case SP_PAINT_SELECTOR_MODE_NONE: g_warning ("file %s: line %d: Paint %d should not emit 'dragged'", __FILE__, __LINE__, psel->mode); break; case SP_PAINT_SELECTOR_MODE_COLOR_RGB: sp_paint_selector_get_rgba_floatv (psel, c); items = sp_widget_get_item_list (spw); for (i = items; i != NULL; i = i->next) { sp_style_set_fill_color_rgba (SP_OBJECT_STYLE (i->data), c[0], c[1], c[2], c[3], TRUE, TRUE); } break; case SP_PAINT_SELECTOR_MODE_COLOR_CMYK: sp_paint_selector_get_cmyka_floatv (psel, c); items = sp_widget_get_item_list (spw); for (i = items; i != NULL; i = i->next) { sp_style_set_fill_color_cmyka (SP_OBJECT_STYLE (i->data), c[0], c[1], c[2], c[3], c[4], TRUE, TRUE); } break; case SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR: vector = sp_paint_selector_get_gradient_vector (psel); vector = sp_gradient_ensure_vector_normalized (vector); items = sp_widget_get_item_list (spw); for (i = items; i != NULL; i = i->next) { SPGradient *lg; lg = sp_item_force_fill_lineargradient_vector (SP_ITEM (i->data), vector); sp_paint_selector_write_lineargradient (psel, SP_LINEARGRADIENT (lg), SP_ITEM (i->data)); } break; case SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL: vector = sp_paint_selector_get_gradient_vector (psel); vector = sp_gradient_ensure_vector_normalized (vector); items = sp_widget_get_item_list (spw); for (i = items; i != NULL; i = i->next) { SPGradient *rg; rg = sp_item_force_fill_radialgradient_vector (SP_ITEM (i->data), vector); sp_paint_selector_write_radialgradient (psel, SP_RADIALGRADIENT (rg), SP_ITEM (i->data)); } break; default: g_warning ("file %s: line %d: Paint selector should not be in mode %d", __FILE__, __LINE__, psel->mode); break; } g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (FALSE)); }
SPGradient *SPGradient::getVector(bool force_vector) { SPGradient * src = chase_hrefs(this, has_stopsFN); if (force_vector) { src = sp_gradient_ensure_vector_normalized(src); } return src; }
void gr_item_activate (GtkMenuItem *menuitem, gpointer data) { SPGradient *gr = (SPGradient *) g_object_get_data (G_OBJECT (menuitem), "gradient"); gr = sp_gradient_ensure_vector_normalized(gr); SPDesktop *desktop = (SPDesktop *) data; Inkscape::Selection *selection = sp_desktop_selection (desktop); SPEventContext *ev = sp_desktop_event_context (desktop); gr_apply_gradient (selection, ev? ev->get_drag() : NULL, gr); sp_document_done (sp_desktop_document (desktop), SP_VERB_CONTEXT_GRADIENT, _("Assign gradient to object")); }
static void sp_fill_style_widget_paint_changed (SPPaintSelector *psel, SPWidget *spw) { const GSList *items, *i, *r; GSList *reprs; SPCSSAttr *css; gfloat rgba[4], cmyka[5]; SPGradient *vector; gchar b[64]; if (g_object_get_data (G_OBJECT (spw), "update")) return; g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (TRUE)); #ifdef SP_FS_VERBOSE g_print ("FillStyleWidget: paint changed\n"); #endif if (spw->inkscape) { /* fixme: */ if (!SP_WIDGET_DOCUMENT (spw)) { g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (FALSE)); return; } reprs = NULL; items = sp_widget_get_item_list (spw); for (i = items; i != NULL; i = i->next) { reprs = g_slist_prepend (reprs, SP_OBJECT_REPR (i->data)); } } else { reprs = g_slist_prepend (NULL, spw->repr); items = NULL; } switch (psel->mode) { case SP_PAINT_SELECTOR_MODE_EMPTY: case SP_PAINT_SELECTOR_MODE_MULTIPLE: g_warning ("file %s: line %d: Paint %d should not emit 'changed'", __FILE__, __LINE__, psel->mode); break; case SP_PAINT_SELECTOR_MODE_NONE: css = sp_repr_css_attr_new (); sp_repr_css_set_property (css, "fill", "none"); for (r = reprs; r != NULL; r = r->next) { sp_repr_css_change_recursive ((SPRepr *) r->data, css, "style"); sp_repr_set_attr_recursive ((SPRepr *) r->data, "sodipodi:fill-cmyk", NULL); } sp_repr_css_attr_unref (css); if (spw->inkscape) sp_document_done (SP_WIDGET_DOCUMENT (spw)); break; case SP_PAINT_SELECTOR_MODE_COLOR_RGB: css = sp_repr_css_attr_new (); sp_paint_selector_get_rgba_floatv (psel, rgba); sp_svg_write_color (b, 64, SP_RGBA32_F_COMPOSE (rgba[0], rgba[1], rgba[2], 0.0)); sp_repr_css_set_property (css, "fill", b); g_snprintf (b, 64, "%g", rgba[3]); sp_repr_css_set_property (css, "fill-opacity", b); for (r = reprs; r != NULL; r = r->next) { sp_repr_set_attr_recursive ((SPRepr *) r->data, "sodipodi:fill-cmyk", NULL); sp_repr_css_change_recursive ((SPRepr *) r->data, css, "style"); } sp_repr_css_attr_unref (css); if (spw->inkscape) sp_document_done (SP_WIDGET_DOCUMENT (spw)); break; case SP_PAINT_SELECTOR_MODE_COLOR_CMYK: css = sp_repr_css_attr_new (); sp_paint_selector_get_cmyka_floatv (psel, cmyka); sp_color_cmyk_to_rgb_floatv (rgba, cmyka[0], cmyka[1], cmyka[2], cmyka[3]); sp_svg_write_color (b, 64, SP_RGBA32_F_COMPOSE (rgba[0], rgba[1], rgba[2], 0.0)); sp_repr_css_set_property (css, "fill", b); g_snprintf (b, 64, "%g", cmyka[4]); sp_repr_css_set_property (css, "fill-opacity", b); g_snprintf (b, 64, "(%g %g %g %g)", cmyka[0], cmyka[1], cmyka[2], cmyka[3]); for (r = reprs; r != NULL; r = r->next) { sp_repr_set_attr_recursive ((SPRepr *) r->data, "sodipodi:fill-cmyk", b); sp_repr_css_change_recursive ((SPRepr *) r->data, css, "style"); } sp_repr_css_attr_unref (css); if (spw->inkscape) sp_document_done (SP_WIDGET_DOCUMENT (spw)); break; case SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR: if (items) { vector = sp_paint_selector_get_gradient_vector (psel); if (!vector) { /* No vector in paint selector should mean that we just changed mode */ vector = sp_document_default_gradient_vector (SP_WIDGET_DOCUMENT (spw)); for (i = items; i != NULL; i = i->next) { sp_item_force_fill_lineargradient_vector (SP_ITEM (i->data), vector); } } else { vector = sp_gradient_ensure_vector_normalized (vector); for (i = items; i != NULL; i = i->next) { SPGradient *lg; lg = sp_item_force_fill_lineargradient_vector (SP_ITEM (i->data), vector); sp_paint_selector_write_lineargradient (psel, SP_LINEARGRADIENT (lg), SP_ITEM (i->data)); sp_object_invoke_write (SP_OBJECT (lg), SP_OBJECT_REPR (lg), SP_OBJECT_WRITE_EXT); } } sp_document_done (SP_WIDGET_DOCUMENT (spw)); } break; case SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL: if (items) { vector = sp_paint_selector_get_gradient_vector (psel); if (!vector) { /* No vector in paint selector should mean that we just changed mode */ vector = sp_document_default_gradient_vector (SP_WIDGET_DOCUMENT (spw)); for (i = items; i != NULL; i = i->next) { sp_item_force_fill_radialgradient_vector (SP_ITEM (i->data), vector); } } else { vector = sp_gradient_ensure_vector_normalized (vector); for (i = items; i != NULL; i = i->next) { SPGradient *rg; rg = sp_item_force_fill_radialgradient_vector (SP_ITEM (i->data), vector); sp_paint_selector_write_radialgradient (psel, SP_RADIALGRADIENT (rg), SP_ITEM (i->data)); sp_object_invoke_write (SP_OBJECT (rg), SP_OBJECT_REPR (rg), SP_OBJECT_WRITE_EXT); } } sp_document_done (SP_WIDGET_DOCUMENT (spw)); } break; default: g_warning ("file %s: line %d: Paint selector should not be in mode %d", __FILE__, __LINE__, psel->mode); break; } g_slist_free (reprs); g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (FALSE)); }