summaryrefslogtreecommitdiffstats
path: root/src/desktop-style.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/desktop-style.cpp')
-rw-r--r--src/desktop-style.cpp182
1 files changed, 148 insertions, 34 deletions
diff --git a/src/desktop-style.cpp b/src/desktop-style.cpp
index 02c18339b..c28302d22 100644
--- a/src/desktop-style.cpp
+++ b/src/desktop-style.cpp
@@ -195,7 +195,7 @@ sp_desktop_set_style(SPDesktop *desktop, SPCSSAttr *css, bool change, bool write
sp_css_attr_unset_uris(css_write);
prefs->mergeStyle("/desktop/style", css_write);
std::vector<SPItem*> const itemlist = desktop->selection->itemList();
- for (std::vector<SPItem*>::const_iterator i = itemlist.begin(); i!= itemlist.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = itemlist.begin(); i!= itemlist.end(); ++i) {
/* last used styles for 3D box faces are stored separately */
SPObject *obj = *i;
Box3DSide *side = dynamic_cast<Box3DSide *>(obj);
@@ -235,7 +235,7 @@ sp_desktop_set_style(SPDesktop *desktop, SPCSSAttr *css, bool change, bool write
css_no_text = sp_css_attr_unset_text(css_no_text);
std::vector<SPItem*> const itemlist = desktop->selection->itemList();
- for (std::vector<SPItem*>::const_iterator i = itemlist.begin(); i!= itemlist.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = itemlist.begin(); i!= itemlist.end(); ++i) {
SPItem *item = *i;
// If not text, don't apply text attributes (can a group have text attributes? Yes! FIXME)
@@ -447,7 +447,7 @@ stroke_average_width (const std::vector<SPItem*> &objects)
gdouble avgwidth = 0.0;
bool notstroked = true;
int n_notstroked = 0;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPItem *item = *i;
if (!item) {
continue;
@@ -500,7 +500,7 @@ objects_query_fillstroke (const std::vector<SPItem*> &objects, SPStyle *style_re
SPIPaint *paint_res = isfill? &style_res->fill : &style_res->stroke;
bool paintImpossible = true;
- paint_res->set = TRUE;
+ paint_res->set = true;
SVGICCColor* iccColor = 0;
@@ -513,7 +513,7 @@ objects_query_fillstroke (const std::vector<SPItem*> &objects, SPStyle *style_re
prev[0] = prev[1] = prev[2] = 0.0;
bool same_color = true;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i!= objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i!= objects.end(); ++i) {
SPObject *obj = *i;
if (!obj) {
continue;
@@ -697,7 +697,7 @@ objects_query_opacity (const std::vector<SPItem*> &objects, SPStyle *style_res)
guint opacity_items = 0;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
if (!obj) {
continue;
@@ -753,7 +753,7 @@ objects_query_strokewidth (const std::vector<SPItem*> &objects, SPStyle *style_r
int n_stroked = 0;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
if (!obj) {
continue;
@@ -827,7 +827,7 @@ objects_query_miterlimit (const std::vector<SPItem*> &objects, SPStyle *style_re
gdouble prev_ml = -1;
bool same_ml = true;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
if (!dynamic_cast<SPItem *>(obj)) {
continue;
@@ -881,12 +881,11 @@ objects_query_strokecap (const std::vector<SPItem*> &objects, SPStyle *style_res
return QUERY_STYLE_NOTHING;
}
- int cap = -1;
- gdouble prev_cap = -1;
+ int prev_cap = -1;
bool same_cap = true;
int n_stroked = 0;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
if (!dynamic_cast<SPItem *>(obj)) {
continue;
@@ -905,11 +904,9 @@ objects_query_strokecap (const std::vector<SPItem*> &objects, SPStyle *style_res
if (prev_cap != -1 && style->stroke_linecap.value != prev_cap)
same_cap = false;
prev_cap = style->stroke_linecap.value;
-
- cap = style->stroke_linecap.value;
}
- style_res->stroke_linecap.value = cap;
+ style_res->stroke_linecap.value = prev_cap;
style_res->stroke_linecap.set = true;
if (n_stroked == 0) {
@@ -935,12 +932,11 @@ objects_query_strokejoin (const std::vector<SPItem*> &objects, SPStyle *style_re
return QUERY_STYLE_NOTHING;
}
- int join = -1;
- gdouble prev_join = -1;
+ int prev_join = -1;
bool same_join = true;
int n_stroked = 0;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
if (!dynamic_cast<SPItem *>(obj)) {
continue;
@@ -960,11 +956,9 @@ objects_query_strokejoin (const std::vector<SPItem*> &objects, SPStyle *style_re
same_join = false;
}
prev_join = style->stroke_linejoin.value;
-
- join = style->stroke_linejoin.value;
}
- style_res->stroke_linejoin.value = join;
+ style_res->stroke_linejoin.value = prev_join;
style_res->stroke_linejoin.set = true;
if (n_stroked == 0) {
@@ -980,6 +974,62 @@ objects_query_strokejoin (const std::vector<SPItem*> &objects, SPStyle *style_re
}
/**
+ * Write to style_res the paint order of a list of objects.
+ */
+int
+objects_query_paintorder (const std::vector<SPItem*> &objects, SPStyle *style_res)
+{
+ if (objects.empty()) {
+ /* No objects, set empty */
+ return QUERY_STYLE_NOTHING;
+ }
+
+ std::string prev_order;
+ bool same_order = true;
+ int n_order = 0;
+
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
+ SPObject *obj = *i;
+ if (!dynamic_cast<SPItem *>(obj)) {
+ continue;
+ }
+ SPStyle *style = obj->style;
+ if (!style) {
+ continue;
+ }
+
+ if ( style->stroke.isNone() ) {
+ continue;
+ }
+
+ n_order ++;
+
+ if (!prev_order.empty() && prev_order.compare( style->paint_order.value ) != 0) {
+ same_order = false;
+ }
+ if (style->paint_order.set) {
+ prev_order = style->paint_order.value;
+ }
+ }
+
+
+ g_free( style_res->paint_order.value );
+ style_res->paint_order.value= g_strdup( prev_order.c_str() );
+ style_res->paint_order.set = true;
+
+ if (n_order == 0) {
+ return QUERY_STYLE_NOTHING;
+ } else if (n_order == 1) {
+ return QUERY_STYLE_SINGLE;
+ } else {
+ if (same_order)
+ return QUERY_STYLE_MULTIPLE_SAME;
+ else
+ return QUERY_STYLE_MULTIPLE_DIFFERENT;
+ }
+}
+
+/**
* Write to style_res the average font size and spacing of objects.
*/
int
@@ -999,11 +1049,12 @@ objects_query_fontnumbers (const std::vector<SPItem*> &objects, SPStyle *style_r
double letterspacing_prev = 0;
double wordspacing_prev = 0;
double linespacing_prev = 0;
+ int linespacing_unit = 0;
int texts = 0;
int no_size = 0;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
if (!isTextualItem(obj)) {
@@ -1055,6 +1106,11 @@ objects_query_fontnumbers (const std::vector<SPItem*> &objects, SPStyle *style_r
linespacing_current = style->line_height.computed;
linespacing_normal = false;
}
+ if (linespacing_unit == 0) {
+ linespacing_unit = style->line_height.unit;
+ } else if (linespacing_unit != style->line_height.unit) {
+ linespacing_unit = SP_CSS_UNIT_PERCENT;
+ }
linespacing += linespacing_current;
if ((size_prev != 0 && style->font_size.computed != size_prev) ||
@@ -1098,7 +1154,7 @@ objects_query_fontnumbers (const std::vector<SPItem*> &objects, SPStyle *style_r
style_res->line_height.normal = linespacing_normal;
style_res->line_height.computed = linespacing;
style_res->line_height.value = linespacing;
- style_res->line_height.unit = SP_CSS_UNIT_PERCENT;
+ style_res->line_height.unit = linespacing_unit;
if (texts > 1) {
if (different) {
@@ -1122,7 +1178,7 @@ objects_query_fontstyle (const std::vector<SPItem*> &objects, SPStyle *style_res
int texts = 0;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
if (!isTextualItem(obj)) {
@@ -1144,7 +1200,7 @@ objects_query_fontstyle (const std::vector<SPItem*> &objects, SPStyle *style_res
different = true; // different styles
}
- set = TRUE;
+ set = true;
style_res->font_weight.value = style_res->font_weight.computed = style->font_weight.computed;
style_res->font_style.value = style_res->font_style.computed = style->font_style.computed;
style_res->font_stretch.value = style_res->font_stretch.computed = style->font_stretch.computed;
@@ -1192,7 +1248,7 @@ objects_query_fontvariants (const std::vector<SPItem*> &objects, SPStyle *style_
caps_res->value = 0;
numeric_res->value = 0;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
if (!isTextualItem(obj)) {
@@ -1256,6 +1312,56 @@ objects_query_fontvariants (const std::vector<SPItem*> &objects, SPStyle *style_
}
+/**
+ * Write to style_res the average writing modes style of objects.
+ */
+int
+objects_query_writing_modes (const std::vector<SPItem*> &objects, SPStyle *style_res)
+{
+ bool different = false;
+ bool set = false;
+
+ int texts = 0;
+
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
+ SPObject *obj = *i;
+
+ if (!isTextualItem(obj)) {
+ continue;
+ }
+
+ SPStyle *style = obj->style;
+ if (!style) {
+ continue;
+ }
+
+ texts ++;
+
+ if (set &&
+ ( ( style_res->writing_mode.computed != style->writing_mode.computed ) ||
+ ( style_res->text_orientation.computed != style->text_orientation.computed ) ) ) {
+ different = true; // different styles
+ }
+
+ set = true;
+ style_res->writing_mode.computed = style->writing_mode.computed;
+ style_res->text_orientation.computed = style->text_orientation.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;
+ }
+}
+
int
objects_query_fontfeaturesettings (const std::vector<SPItem*> &objects, SPStyle *style_res)
{
@@ -1268,7 +1374,7 @@ objects_query_fontfeaturesettings (const std::vector<SPItem*> &objects, SPStyle
}
style_res->font_feature_settings.set = FALSE;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
// std::cout << " " << reinterpret_cast<SPObject*>(i->data)->getId() << std::endl;
@@ -1293,7 +1399,7 @@ objects_query_fontfeaturesettings (const std::vector<SPItem*> &objects, SPStyle
style_res->font_feature_settings.value = NULL;
}
- style_res->font_feature_settings.set = TRUE;
+ style_res->font_feature_settings.set = true;
style_res->font_feature_settings.value = g_strdup(style->font_feature_settings.value);
}
@@ -1336,7 +1442,7 @@ objects_query_baselines (const std::vector<SPItem*> &objects, SPStyle *style_res
int texts = 0;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
if (!isTextualItem(obj)) {
@@ -1424,7 +1530,7 @@ objects_query_fontfamily (const std::vector<SPItem*> &objects, SPStyle *style_re
}
style_res->font_family.set = FALSE;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
// std::cout << " " << reinterpret_cast<SPObject*>(i->data)->getId() << std::endl;
@@ -1449,7 +1555,7 @@ objects_query_fontfamily (const std::vector<SPItem*> &objects, SPStyle *style_re
style_res->font_family.value = NULL;
}
- style_res->font_family.set = TRUE;
+ style_res->font_family.set = true;
style_res->font_family.value = g_strdup(style->font_family.value);
}
@@ -1480,7 +1586,7 @@ objects_query_fontspecification (const std::vector<SPItem*> &objects, SPStyle *s
}
style_res->font_specification.set = FALSE;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
// std::cout << " " << reinterpret_cast<SPObject*>(i->data)->getId() << std::endl;
@@ -1508,7 +1614,7 @@ objects_query_fontspecification (const std::vector<SPItem*> &objects, SPStyle *s
style_res->font_specification.value = NULL;
}
- style_res->font_specification.set = TRUE;
+ style_res->font_specification.set = true;
style_res->font_specification.value = g_strdup(style->font_specification.value);
}
}
@@ -1538,7 +1644,7 @@ objects_query_blend (const std::vector<SPItem*> &objects, SPStyle *style_res)
bool same_blend = true;
guint items = 0;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
if (!obj) {
continue;
@@ -1628,7 +1734,7 @@ objects_query_blur (const std::vector<SPItem*> &objects, SPStyle *style_res)
guint blur_items = 0;
guint items = 0;
- for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); ++i) {
SPObject *obj = *i;
if (!obj) {
continue;
@@ -1713,6 +1819,8 @@ sp_desktop_query_style_from_list (const std::vector<SPItem*> &list, SPStyle *sty
} else if (property == QUERY_STYLE_PROPERTY_STROKEJOIN) {
return objects_query_strokejoin (list, style);
+ } else if (property == QUERY_STYLE_PROPERTY_PAINTORDER) {
+ return objects_query_paintorder (list, style);
} else if (property == QUERY_STYLE_PROPERTY_MASTEROPACITY) {
return objects_query_opacity (list, style);
@@ -1728,6 +1836,8 @@ sp_desktop_query_style_from_list (const std::vector<SPItem*> &list, SPStyle *sty
return objects_query_fontfeaturesettings (list, style);
} else if (property == QUERY_STYLE_PROPERTY_FONTNUMBERS) {
return objects_query_fontnumbers (list, style);
+ } else if (property == QUERY_STYLE_PROPERTY_WRITINGMODES) {
+ return objects_query_writing_modes (list, style);
} else if (property == QUERY_STYLE_PROPERTY_BASELINES) {
return objects_query_baselines (list, style);
@@ -1777,6 +1887,9 @@ sp_desktop_query_style_all (SPDesktop *desktop, SPStyle *query)
int result_strokemiterlimit = sp_desktop_query_style (desktop, query, QUERY_STYLE_PROPERTY_STROKEMITERLIMIT);
int result_strokecap = sp_desktop_query_style (desktop, query, QUERY_STYLE_PROPERTY_STROKECAP);
int result_strokejoin = sp_desktop_query_style (desktop, query, QUERY_STYLE_PROPERTY_STROKEJOIN);
+
+ int result_paintorder = sp_desktop_query_style (desktop, query, QUERY_STYLE_PROPERTY_PAINTORDER);
+
int result_opacity = sp_desktop_query_style (desktop, query, QUERY_STYLE_PROPERTY_MASTEROPACITY);
int result_blur = sp_desktop_query_style (desktop, query, QUERY_STYLE_PROPERTY_BLUR);
@@ -1790,6 +1903,7 @@ sp_desktop_query_style_all (SPDesktop *desktop, SPStyle *query)
result_strokemiterlimit != QUERY_STYLE_NOTHING ||
result_strokecap != QUERY_STYLE_NOTHING ||
result_strokejoin != QUERY_STYLE_NOTHING ||
+ result_paintorder != QUERY_STYLE_NOTHING ||
result_blur != QUERY_STYLE_NOTHING);
}