diff --git a/src/desktop-style.cpp b/src/desktop-style.cpp
index 2afcd610958061c993ea5ee53304a946cadd41ba..049b5fcf80604bab290882db2933b793a83bbd85 100644 (file)
--- a/src/desktop-style.cpp
+++ b/src/desktop-style.cpp
|| SP_IS_FLOWDIV(o)
|| SP_IS_FLOWPARA(o)
|| SP_IS_TEXTPATH(o))
- && !SP_OBJECT_REPR(o)->attribute("style"))
+ && /*!SP_OBJECT_REPR(o)->attribute("style")*/ !o->getAttribute("style"))
&&
!(SP_IS_FLOWREGION(o) ||
SP_IS_FLOWREGIONEXCLUDE(o) ||
// Scale the style by the inverse of the accumulated parent transform in the paste context.
{
- Geom::Matrix const local(sp_item_i2doc_affine(SP_ITEM(o)));
+ Geom::Matrix const local(SP_ITEM(o)->i2doc_affine());
double const ex(local.descrim());
if ( ( ex != 0. )
&& ( ex != 1. ) ) {
}
}
- sp_repr_css_change(SP_OBJECT_REPR(o), css_set, "style");
+ //sp_repr_css_change(SP_OBJECT_REPR(o), css_set, "style");
+ o->changeCSS(css_set,"style");
sp_repr_css_attr_unref(css_set);
}
if (SP_IS_USE(o))
return;
- for (SPObject *child = sp_object_first_child(SP_OBJECT(o)) ; child != NULL ; child = SP_OBJECT_NEXT(child) ) {
+ for (SPObject *child = SP_OBJECT(o)->first_child() ; child != NULL ; child = SP_OBJECT_NEXT(child) ) {
if (sp_repr_css_property(css, "opacity", NULL) != NULL) {
// Unset properties which are accumulating and thus should not be set recursively.
// For example, setting opacity 0.5 on a group recursively would result in the visible opacity of 0.25 for an item in the group.
@@ -196,10 +197,29 @@ sp_desktop_set_style(SPDesktop *desktop, SPCSSAttr *css, bool change, bool write
// 3. If nobody has intercepted the signal, apply the style to the selection
if (!intercepted) {
+
+ // Remove text attributes if not text...
+ // Do this once in case a zillion objects are selected.
+ SPCSSAttr *css_no_text = sp_repr_css_attr_new();
+ sp_repr_css_merge(css_no_text, css);
+ css_no_text = sp_css_attr_unset_text(css_no_text);
+
for (GSList const *i = desktop->selection->itemList(); i != NULL; i = i->next) {
- /// \todo if the style is text-only, apply only to texts?
- sp_desktop_apply_css_recursive(SP_OBJECT(i->data), css, true);
+
+ // If not text, don't apply text attributes (can a group have text attributes?)
+ if ( SP_IS_TEXT(i->data) || SP_IS_FLOWTEXT(i->data)
+ || SP_IS_TSPAN(i->data) || SP_IS_TREF(i->data) || SP_IS_TEXTPATH(i->data)
+ || SP_IS_FLOWDIV(i->data) || SP_IS_FLOWPARA(i->data) || SP_IS_FLOWTSPAN(i->data)) {
+
+ sp_desktop_apply_css_recursive(SP_OBJECT(i->data), css, true);
+
+ } else {
+
+ sp_desktop_apply_css_recursive(SP_OBJECT(i->data), css_no_text, true);
+
+ }
}
+ sp_repr_css_attr_unref(css_no_text);
}
}
if (!SP_IS_ITEM (l->data))
continue;
- Geom::Matrix i2d = sp_item_i2d_affine (SP_ITEM(l->data));
+ Geom::Matrix i2d = (SP_ITEM(l->data))->i2d_affine ();
SPObject *object = SP_OBJECT(l->data);
@@ -475,8 +495,8 @@ objects_query_fillstroke (GSList *objects, SPStyle *style_res, bool const isfill
if (!SP_IS_LINEARGRADIENT(server))
return QUERY_STYLE_MULTIPLE_DIFFERENT; // different kind of server
- SPGradient *vector = sp_gradient_get_vector ( SP_GRADIENT (server), FALSE );
- SPGradient *vector_res = sp_gradient_get_vector ( SP_GRADIENT (server_res), FALSE );
+ SPGradient *vector = SP_GRADIENT(server)->getVector();
+ SPGradient *vector_res = SP_GRADIENT(server_res)->getVector();
if (vector_res != vector)
return QUERY_STYLE_MULTIPLE_DIFFERENT; // different gradient vectors
@@ -485,8 +505,8 @@ objects_query_fillstroke (GSList *objects, SPStyle *style_res, bool const isfill
if (!SP_IS_RADIALGRADIENT(server))
return QUERY_STYLE_MULTIPLE_DIFFERENT; // different kind of server
- SPGradient *vector = sp_gradient_get_vector ( SP_GRADIENT (server), FALSE );
- SPGradient *vector_res = sp_gradient_get_vector ( SP_GRADIENT (server_res), FALSE );
+ SPGradient *vector = SP_GRADIENT(server)->getVector();
+ SPGradient *vector_res = SP_GRADIENT(server_res)->getVector();
if (vector_res != vector)
return QUERY_STYLE_MULTIPLE_DIFFERENT; // different gradient vectors
noneSet &= style->stroke.isNone();
- Geom::Matrix i2d = sp_item_i2d_affine (SP_ITEM(obj));
+ Geom::Matrix i2d = SP_ITEM(obj)->i2d_affine ();
double sw = style->stroke_width.computed * i2d.descrim();
if (prev_sw != -1 && fabs(sw - prev_sw) > 1e-3)
double size = 0;
double letterspacing = 0;
+ double wordspacing = 0;
double linespacing = 0;
- bool linespacing_normal = false;
bool letterspacing_normal = false;
+ bool wordspacing_normal = false;
+ bool linespacing_normal = false;
double size_prev = 0;
double letterspacing_prev = 0;
+ double wordspacing_prev = 0;
double linespacing_prev = 0;
- /// \todo FIXME: add word spacing, kerns? rotates?
-
int texts = 0;
for (GSList const *i = objects; i != NULL; i = i->next) {
if (!style) continue;
texts ++;
- size += style->font_size.computed * Geom::Matrix(sp_item_i2d_affine(SP_ITEM(obj))).descrim(); /// \todo FIXME: we assume non-% units here
+ size += style->font_size.computed * Geom::Matrix(SP_ITEM(obj)->i2d_affine()).descrim(); /// \todo FIXME: we assume non-% units here
if (style->letter_spacing.normal) {
if (!different && (letterspacing_prev == 0 || letterspacing_prev == letterspacing))
letterspacing_normal = false;
}
+ if (style->word_spacing.normal) {
+ if (!different && (wordspacing_prev == 0 || wordspacing_prev == wordspacing))
+ wordspacing_normal = true;
+ } else {
+ wordspacing += style->word_spacing.computed; /// \todo FIXME: we assume non-% units here
+ wordspacing_normal = false;
+ }
+
double linespacing_current;
if (style->line_height.normal) {
linespacing_current = Inkscape::Text::Layout::LINE_HEIGHT_NORMAL;
if ((size_prev != 0 && style->font_size.computed != size_prev) ||
(letterspacing_prev != 0 && style->letter_spacing.computed != letterspacing_prev) ||
+ (wordspacing_prev != 0 && style->word_spacing.computed != wordspacing_prev) ||
(linespacing_prev != 0 && linespacing_current != linespacing_prev)) {
different = true;
}
size_prev = style->font_size.computed;
letterspacing_prev = style->letter_spacing.computed;
+ wordspacing_prev = style->word_spacing.computed;
linespacing_prev = linespacing_current;
// FIXME: we must detect MULTIPLE_DIFFERENT for these too
if (texts > 1) {
size /= texts;
letterspacing /= texts;
+ wordspacing /= texts;
linespacing /= texts;
}
style_res->letter_spacing.normal = letterspacing_normal;
style_res->letter_spacing.computed = letterspacing;
+ style_res->word_spacing.normal = wordspacing_normal;
+ style_res->word_spacing.computed = wordspacing;
+
style_res->line_height.normal = linespacing_normal;
style_res->line_height.computed = linespacing;
style_res->line_height.value = linespacing;
}
}
+/**
+ * Write to style_res the baseline numbers.
+ */
+int
+objects_query_baselines (GSList *objects, SPStyle *style_res)
+{
+ bool different = false;
+
+ // Only baseline-shift at the moment
+ // We will return:
+ // If baseline-shift is same for all objects:
+ // The full baseline-shift data (used for subscripts and superscripts)
+ // If baseline-shift is different:
+ // The average baseline-shift (not implemented at the moment as this is complicated June 2010)
+ SPIBaselineShift old;
+ old.value = 0.0;
+ old.computed = 0.0;
+
+ // double baselineshift = 0.0;
+ bool set = false;
+
+ int texts = 0;
+
+ for (GSList const *i = objects; i != NULL; i = i->next) {
+ SPObject *obj = SP_OBJECT (i->data);
+
+ if (!SP_IS_TEXT(obj) && !SP_IS_FLOWTEXT(obj)
+ && !SP_IS_TSPAN(obj) && !SP_IS_TREF(obj) && !SP_IS_TEXTPATH(obj)
+ && !SP_IS_FLOWDIV(obj) && !SP_IS_FLOWPARA(obj) && !SP_IS_FLOWTSPAN(obj))
+ continue;
+
+ SPStyle *style = SP_OBJECT_STYLE (obj);
+ if (!style) continue;
+
+ texts ++;
+
+ SPIBaselineShift current;
+ if(style->baseline_shift.set) {
+
+ current.set = style->baseline_shift.set;
+ current.inherit = style->baseline_shift.inherit;
+ current.type = style->baseline_shift.type;
+ current.literal = style->baseline_shift.literal;
+ current.value = style->baseline_shift.value;
+ current.computed = style->baseline_shift.computed;
+
+ if( set ) {
+ if( current.set != old.set ||
+ current.inherit != old.inherit ||
+ current.type != old.type ||
+ current.literal != old.literal ||
+ current.value != old.value ||
+ current.computed != old.computed ) {
+ // Maybe this needs to be better thought out.
+ different = true;
+ }
+ }
+
+ set = true;
+
+ old.set = current.set;
+ old.inherit = current.inherit;
+ old.type = current.type;
+ old.literal = current.literal;
+ old.value = current.value;
+ old.computed = current.computed;
+ }
+ }
+
+ if (different || !set ) {
+ style_res->baseline_shift.set = false;
+ style_res->baseline_shift.computed = 0.0;
+ } else {
+ style_res->baseline_shift.set = old.set;
+ style_res->baseline_shift.inherit = old.inherit;
+ style_res->baseline_shift.type = old.type;
+ style_res->baseline_shift.literal = old.literal;
+ style_res->baseline_shift.value = old.value;
+ style_res->baseline_shift.computed = old.computed;
+ }
+
+ if (texts == 0 || !set)
+ return QUERY_STYLE_NOTHING;
+
+ if (texts > 1) {
+ if (different) {
+ return QUERY_STYLE_MULTIPLE_DIFFERENT;
+ } else {
+ return QUERY_STYLE_MULTIPLE_SAME;
+ }
+ } else {
+ return QUERY_STYLE_SINGLE;
+ }
+}
+
/**
* Write to style_res the average font family of objects.
*/
for (GSList const *i = objects; i != NULL; i = i->next) {
SPObject *obj = SP_OBJECT (i->data);
+ // std::cout << " " << SP_OBJECT_ID (i->data) << std::endl;
if (!SP_IS_TEXT(obj) && !SP_IS_FLOWTEXT(obj)
&& !SP_IS_TSPAN(obj) && !SP_IS_TREF(obj) && !SP_IS_TEXTPATH(obj)
&& !SP_IS_FLOWDIV(obj) && !SP_IS_FLOWPARA(obj) && !SP_IS_FLOWTSPAN(obj))
for (GSList const *i = objects; i != NULL; i = i->next) {
SPObject *obj = SP_OBJECT (i->data);
+ // std::cout << " " << SP_OBJECT_ID (i->data) << std::endl;
if (!SP_IS_TEXT(obj) && !SP_IS_FLOWTEXT(obj)
&& !SP_IS_TSPAN(obj) && !SP_IS_TREF(obj) && !SP_IS_TEXTPATH(obj)
&& !SP_IS_FLOWDIV(obj) && !SP_IS_FLOWPARA(obj) && !SP_IS_FLOWTSPAN(obj))
if (!style) continue;
if (!SP_IS_ITEM(obj)) continue;
- Geom::Matrix i2d = sp_item_i2d_affine (SP_ITEM(obj));
+ Geom::Matrix i2d = SP_ITEM(obj)->i2d_affine ();
items ++;
return objects_query_fontstyle (list, style);
} else if (property == QUERY_STYLE_PROPERTY_FONTNUMBERS) {
return objects_query_fontnumbers (list, style);
+ } else if (property == QUERY_STYLE_PROPERTY_BASELINES) {
+ return objects_query_baselines (list, style);
} else if (property == QUERY_STYLE_PROPERTY_BLEND) {
return objects_query_blend (list, style);