static void sp_fill_style_widget_update_repr (SPWidget *spw, SPRepr *repr) { SPPaintSelector *psel; GtkWidget *fillrule; SPPaintSelectorMode pselmode; SPStyle *style; gfloat c[5]; 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: Set update flag\n"); #endif psel = SP_PAINT_SELECTOR(g_object_get_data (G_OBJECT (spw), "paint-selector")); style = sp_style_new (); sp_style_read_from_repr (style, repr); pselmode = sp_fill_style_determine_paint_selector_mode (style); #ifdef SP_FS_VERBOSE g_print ("FillStyleWidget: paint selector mode %d\n", pselmode); #endif switch (pselmode) { case SP_PAINT_SELECTOR_MODE_NONE: /* No paint at all */ sp_paint_selector_set_mode (psel, SP_PAINT_SELECTOR_MODE_NONE); break; case SP_PAINT_SELECTOR_MODE_COLOR_RGB: sp_paint_selector_set_mode (psel, SP_PAINT_SELECTOR_MODE_COLOR_RGB); sp_color_get_rgb_floatv (&style->fill.value.color, c); c[3] = SP_SCALE24_TO_FLOAT (style->fill_opacity.value); sp_paint_selector_set_color_rgba_floatv (psel, c); break; case SP_PAINT_SELECTOR_MODE_COLOR_CMYK: sp_paint_selector_set_mode (psel, SP_PAINT_SELECTOR_MODE_COLOR_CMYK); sp_color_get_cmyk_floatv (&style->fill.value.color, c); c[4] = SP_SCALE24_TO_FLOAT (style->fill_opacity.value); sp_paint_selector_set_color_cmyka_floatv (psel, c); break; case SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR: break; default: break; } fillrule = GTK_WIDGET(g_object_get_data (G_OBJECT (spw), "fill-rule")); gtk_option_menu_set_history (GTK_OPTION_MENU (fillrule), (style->fill_rule.computed == ART_WIND_RULE_NONZERO) ? 0 : 1); sp_style_unref (style); g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (FALSE)); #ifdef SP_FS_VERBOSE g_print ("FillStyleWidget: Cleared update flag\n"); #endif }
static void sp_fill_style_get_average_color_cmyka (const GSList *objects, gfloat *c) { gint num; c[0] = 0.0; c[1] = 0.0; c[2] = 0.0; c[3] = 0.0; c[4] = 0.0; num = 0; while (objects) { SPObject *object; gfloat d[4]; object = SP_OBJECT (objects->data); if (object->style->fill.type == SP_PAINT_TYPE_COLOR) { sp_color_get_cmyk_floatv (&object->style->fill.value.color, d); c[0] += d[0]; c[1] += d[1]; c[2] += d[2]; c[3] += d[3]; c[4] += SP_SCALE24_TO_FLOAT (object->style->fill_opacity.value); } num += 1; objects = objects->next; } c[0] /= num; c[1] /= num; c[2] /= num; c[3] /= num; c[4] /= num; }
void StyleSwatch::setStyle(SPStyle *query) { _place[SS_FILL].remove(); _place[SS_STROKE].remove(); bool has_stroke = true; for (int i = SS_FILL; i <= SS_STROKE; i++) { Gtk::EventBox *place = &(_place[i]); SPIPaint *paint; if (i == SS_FILL) { paint = &(query->fill); } else { paint = &(query->stroke); } if (paint->set && paint->isPaintserver()) { SPPaintServer *server = (i == SS_FILL)? SP_STYLE_FILL_SERVER (query) : SP_STYLE_STROKE_SERVER (query); if (SP_IS_LINEARGRADIENT (server)) { _value[i].set_markup(_("L Gradient")); place->add(_value[i]); _tooltips.set_tip(*place, (i == SS_FILL)? (_("Linear gradient fill")) : (_("Linear gradient stroke"))); } else if (SP_IS_RADIALGRADIENT (server)) { _value[i].set_markup(_("R Gradient")); place->add(_value[i]); _tooltips.set_tip(*place, (i == SS_FILL)? (_("Radial gradient fill")) : (_("Radial gradient stroke"))); } else if (SP_IS_PATTERN (server)) { _value[i].set_markup(_("Pattern")); place->add(_value[i]); _tooltips.set_tip(*place, (i == SS_FILL)? (_("Pattern fill")) : (_("Pattern stroke"))); } } else if (paint->set && paint->isColor()) { guint32 color = paint->value.color.toRGBA32( SP_SCALE24_TO_FLOAT ((i == SS_FILL)? query->fill_opacity.value : query->stroke_opacity.value) ); ((Inkscape::UI::Widget::ColorPreview*)_color_preview[i])->setRgba32 (color); _color_preview[i]->show_all(); place->add(*_color_preview[i]); gchar *tip; if (i == SS_FILL) { tip = g_strdup_printf (_("Fill: %06x/%.3g"), color >> 8, SP_RGBA32_A_F(color)); } else {
void NRStyle::set(SPStyle *style) { if ( style->fill.isPaintserver() ) { fill.set(style->getFillPaintServer()); } else if ( style->fill.isColor() ) { fill.set(style->fill.value.color); } else if ( style->fill.isNone() ) { fill.clear(); } else { g_assert_not_reached(); } fill.opacity = SP_SCALE24_TO_FLOAT(style->fill_opacity.value); switch (style->fill_rule.computed) { case SP_WIND_RULE_EVENODD: fill_rule = CAIRO_FILL_RULE_EVEN_ODD; break; case SP_WIND_RULE_NONZERO: fill_rule = CAIRO_FILL_RULE_WINDING; break; default: g_assert_not_reached(); } if ( style->stroke.isPaintserver() ) { stroke.set(style->getStrokePaintServer()); } else if ( style->stroke.isColor() ) { stroke.set(style->stroke.value.color); } else if ( style->stroke.isNone() ) { stroke.clear(); } else { g_assert_not_reached(); } stroke.opacity = SP_SCALE24_TO_FLOAT(style->stroke_opacity.value); stroke_width = style->stroke_width.computed; switch (style->stroke_linecap.computed) { case SP_STROKE_LINECAP_ROUND: line_cap = CAIRO_LINE_CAP_ROUND; break; case SP_STROKE_LINECAP_SQUARE: line_cap = CAIRO_LINE_CAP_SQUARE; break; case SP_STROKE_LINECAP_BUTT: line_cap = CAIRO_LINE_CAP_BUTT; break; default: g_assert_not_reached(); } switch (style->stroke_linejoin.computed) { case SP_STROKE_LINEJOIN_ROUND: line_join = CAIRO_LINE_JOIN_ROUND; break; case SP_STROKE_LINEJOIN_BEVEL: line_join = CAIRO_LINE_JOIN_BEVEL; break; case SP_STROKE_LINEJOIN_MITER: line_join = CAIRO_LINE_JOIN_MITER; break; default: g_assert_not_reached(); } miter_limit = style->stroke_miterlimit.value; if (dash){ delete [] dash; } n_dash = style->stroke_dasharray.values.size(); if (n_dash != 0) { dash_offset = style->stroke_dashoffset.value; dash = new double[n_dash]; for (unsigned int i = 0; i < n_dash; ++i) { dash[i] = style->stroke_dasharray.values[i]; } } else { dash_offset = 0.0; dash = NULL; } for( unsigned i = 0; i < PAINT_ORDER_LAYERS; ++i) { switch (style->paint_order.layer[i]) { case SP_CSS_PAINT_ORDER_NORMAL: paint_order_layer[i]=PAINT_ORDER_NORMAL; break; case SP_CSS_PAINT_ORDER_FILL: paint_order_layer[i]=PAINT_ORDER_FILL; break; case SP_CSS_PAINT_ORDER_STROKE: paint_order_layer[i]=PAINT_ORDER_STROKE; break; case SP_CSS_PAINT_ORDER_MARKER: paint_order_layer[i]=PAINT_ORDER_MARKER; break; } } text_decoration_line = TEXT_DECORATION_LINE_CLEAR; if(style->text_decoration_line.inherit ){ text_decoration_line |= TEXT_DECORATION_LINE_INHERIT; } if(style->text_decoration_line.underline ){ text_decoration_line |= TEXT_DECORATION_LINE_UNDERLINE + TEXT_DECORATION_LINE_SET; } if(style->text_decoration_line.overline ){ text_decoration_line |= TEXT_DECORATION_LINE_OVERLINE + TEXT_DECORATION_LINE_SET; } if(style->text_decoration_line.line_through){ text_decoration_line |= TEXT_DECORATION_LINE_LINETHROUGH + TEXT_DECORATION_LINE_SET; } if(style->text_decoration_line.blink ){ text_decoration_line |= TEXT_DECORATION_LINE_BLINK + TEXT_DECORATION_LINE_SET; } text_decoration_style = TEXT_DECORATION_STYLE_CLEAR; if(style->text_decoration_style.inherit ){ text_decoration_style |= TEXT_DECORATION_STYLE_INHERIT; } if(style->text_decoration_style.solid ){ text_decoration_style |= TEXT_DECORATION_STYLE_SOLID + TEXT_DECORATION_STYLE_SET; } if(style->text_decoration_style.isdouble ){ text_decoration_style |= TEXT_DECORATION_STYLE_ISDOUBLE + TEXT_DECORATION_STYLE_SET; } if(style->text_decoration_style.dotted ){ text_decoration_style |= TEXT_DECORATION_STYLE_DOTTED + TEXT_DECORATION_STYLE_SET; } if(style->text_decoration_style.dashed ){ text_decoration_style |= TEXT_DECORATION_STYLE_DASHED + TEXT_DECORATION_STYLE_SET; } if(style->text_decoration_style.wavy ){ text_decoration_style |= TEXT_DECORATION_STYLE_WAVY + TEXT_DECORATION_STYLE_SET; } /* FIXME The meaning of text-decoration-color in CSS3 for SVG is ambiguous (2014-05-06). Set it for fill, for stroke, for both? Both would seem like the obvious choice but what happens is that for text which is just fill (very common) it makes the lines fatter because it enables stroke on the decorations when it wasn't present on the text. That contradicts the usual behavior where the text and decorations by default have the same fill/stroke. The behavior here is that if color is defined it is applied to text_decoration_fill/stroke ONLY if the corresponding fill/stroke is also present. Hopefully the standard will be clarified to resolve this issue. */ SPStyle* style_td = style; if ( style->text_decoration.style_td ) style_td = style->text_decoration.style_td; text_decoration_stroke.opacity = SP_SCALE24_TO_FLOAT(style_td->stroke_opacity.value); text_decoration_stroke_width = style_td->stroke_width.computed; if( style->text_decoration_color.set || style->text_decoration_color.inherit || style->text_decoration_color.currentcolor ) { if(style->fill.isPaintserver() || style->fill.isColor()) { // SVG sets color specifically text_decoration_fill.set(style->text_decoration_color.value.color); } else { // No decoration fill because no text fill text_decoration_fill.clear(); } if(style->stroke.isPaintserver() || style->stroke.isColor()) { // SVG sets color specifically text_decoration_stroke.set(style->text_decoration_color.value.color); } else { // No decoration stroke because no text stroke text_decoration_stroke.clear(); } } else { // Pick color/pattern from text if ( style_td->fill.isPaintserver() ) { text_decoration_fill.set(style_td->getFillPaintServer()); } else if ( style_td->fill.isColor() ) { text_decoration_fill.set(style_td->fill.value.color); } else if ( style_td->fill.isNone() ) { text_decoration_fill.clear(); } else { g_assert_not_reached(); } if ( style_td->stroke.isPaintserver() ) { text_decoration_stroke.set(style_td->getStrokePaintServer()); } else if ( style_td->stroke.isColor() ) { text_decoration_stroke.set(style_td->stroke.value.color); } else if ( style_td->stroke.isNone() ) { text_decoration_stroke.clear(); } else { g_assert_not_reached(); } } if(text_decoration_line != TEXT_DECORATION_LINE_CLEAR){ phase_length = style->text_decoration_data.phase_length; tspan_line_start = style->text_decoration_data.tspan_line_start; tspan_line_end = style->text_decoration_data.tspan_line_end; tspan_width = style->text_decoration_data.tspan_width; ascender = style->text_decoration_data.ascender; descender = style->text_decoration_data.descender; line_gap = style->text_decoration_data.line_gap; underline_thickness = style->text_decoration_data.underline_thickness; underline_position = style->text_decoration_data.underline_position; line_through_thickness = style->text_decoration_data.line_through_thickness; line_through_position = style->text_decoration_data.line_through_position; font_size = style->font_size.computed; } text_direction = style->direction.computed; update(); }
cairo_pattern_t* SPSolidColor::pattern_new(cairo_t * /*ct*/, Geom::OptRect const & /*bbox*/, double opacity) { SPIColor *c = &(this->style->solid_color); cairo_pattern_t *cp = cairo_pattern_create_rgba ( c->value.color.v.c[0], c->value.color.v.c[1], c->value.color.v.c[2], SP_SCALE24_TO_FLOAT(this->style->solid_opacity.value) * opacity ); return cp; }
void ObjectCompositeSettings::_subjectChanged() { if (!_subject) { return; } SPDesktop *desktop = _subject->getDesktop(); if (!desktop) { return; } if (_blocked) return; _blocked = true; SPStyle *query = sp_style_new (sp_desktop_document(desktop)); int result = _subject->queryStyle(query, QUERY_STYLE_PROPERTY_MASTEROPACITY); switch (result) { case QUERY_STYLE_NOTHING: _opacity_vbox.set_sensitive(false); // gtk_widget_set_sensitive (opa, FALSE); break; case QUERY_STYLE_SINGLE: case QUERY_STYLE_MULTIPLE_AVERAGED: // TODO: treat this slightly differently case QUERY_STYLE_MULTIPLE_SAME: _opacity_vbox.set_sensitive(true); _opacity_scale.get_adjustment()->set_value(100 * SP_SCALE24_TO_FLOAT(query->opacity.value)); break; } //query now for current filter mode and average blurring of selection const int blend_result = _subject->queryStyle(query, QUERY_STYLE_PROPERTY_BLEND); switch(blend_result) { case QUERY_STYLE_NOTHING: _fe_cb.set_sensitive(false); break; case QUERY_STYLE_SINGLE: case QUERY_STYLE_MULTIPLE_SAME: _fe_cb.set_blend_mode(query->filter_blend_mode.value); _fe_cb.set_sensitive(true); break; case QUERY_STYLE_MULTIPLE_DIFFERENT: // TODO: set text _fe_cb.set_sensitive(false); break; } if(blend_result == QUERY_STYLE_SINGLE || blend_result == QUERY_STYLE_MULTIPLE_SAME) { int blur_result = _subject->queryStyle(query, QUERY_STYLE_PROPERTY_BLUR); switch (blur_result) { case QUERY_STYLE_NOTHING: //no blurring _fe_cb.set_blur_sensitive(false); break; case QUERY_STYLE_SINGLE: case QUERY_STYLE_MULTIPLE_AVERAGED: case QUERY_STYLE_MULTIPLE_SAME: Geom::OptRect bbox = _subject->getBounds(SPItem::GEOMETRIC_BBOX); if (bbox) { double perimeter = bbox->dimensions()[Geom::X] + bbox->dimensions()[Geom::Y]; // fixme: this is only half the perimeter, is that correct? _fe_cb.set_blur_sensitive(true); //update blur widget value float radius = query->filter_gaussianBlur_deviation.value; float percent = radius * 400 / perimeter; // so that for a square, 100% == half side _fe_cb.set_blur_value(percent); } break; } } sp_style_unref(query); _blocked = false; }
void NRStyle::set(SPStyle *style) { if ( style->fill.isPaintserver() ) { fill.set(style->getFillPaintServer()); } else if ( style->fill.isColor() ) { fill.set(style->fill.value.color); } else if ( style->fill.isNone() ) { fill.clear(); } else { g_assert_not_reached(); } fill.opacity = SP_SCALE24_TO_FLOAT(style->fill_opacity.value); switch (style->fill_rule.computed) { case SP_WIND_RULE_EVENODD: fill_rule = CAIRO_FILL_RULE_EVEN_ODD; break; case SP_WIND_RULE_NONZERO: fill_rule = CAIRO_FILL_RULE_WINDING; break; default: g_assert_not_reached(); } if ( style->stroke.isPaintserver() ) { stroke.set(style->getStrokePaintServer()); } else if ( style->stroke.isColor() ) { stroke.set(style->stroke.value.color); } else if ( style->stroke.isNone() ) { stroke.clear(); } else { g_assert_not_reached(); } stroke.opacity = SP_SCALE24_TO_FLOAT(style->stroke_opacity.value); stroke_width = style->stroke_width.computed; switch (style->stroke_linecap.computed) { case SP_STROKE_LINECAP_ROUND: line_cap = CAIRO_LINE_CAP_ROUND; break; case SP_STROKE_LINECAP_SQUARE: line_cap = CAIRO_LINE_CAP_SQUARE; break; case SP_STROKE_LINECAP_BUTT: line_cap = CAIRO_LINE_CAP_BUTT; break; default: g_assert_not_reached(); } switch (style->stroke_linejoin.computed) { case SP_STROKE_LINEJOIN_ROUND: line_join = CAIRO_LINE_JOIN_ROUND; break; case SP_STROKE_LINEJOIN_BEVEL: line_join = CAIRO_LINE_JOIN_BEVEL; break; case SP_STROKE_LINEJOIN_MITER: line_join = CAIRO_LINE_JOIN_MITER; break; default: g_assert_not_reached(); } miter_limit = style->stroke_miterlimit.value; if (dash){ delete [] dash; } n_dash = style->stroke_dash.n_dash; if (n_dash != 0) { dash_offset = style->stroke_dash.offset; dash = new double[n_dash]; for (unsigned int i = 0; i < n_dash; ++i) { dash[i] = style->stroke_dash.dash[i]; } } else { dash_offset = 0.0; dash = NULL; } update(); }