diff --git a/src/desktop-style.cpp b/src/desktop-style.cpp
index 7ff2be2c880b15d1462cdab9e054abffd737a2c6..c92bcfdf5ca2366d9c66e51f45fff3ab893d4114 100644 (file)
--- a/src/desktop-style.cpp
+++ b/src/desktop-style.cpp
#include "selection.h"
#include "inkscape.h"
#include "style.h"
-#include "prefs-utils.h"
+#include "preferences.h"
#include "sp-use.h"
-#include "sp-feblend.h"
+#include "filters/blend.h"
#include "sp-filter.h"
#include "sp-filter-reference.h"
#include "sp-gaussian-blur.h"
// Scale the style by the inverse of the accumulated parent transform in the paste context.
{
- NR::Matrix const local(sp_item_i2doc_affine(SP_ITEM(o)));
- double const ex(NR::expansion(local));
+ Geom::Matrix const local(sp_item_i2doc_affine(SP_ITEM(o)));
+ double const ex(local.descrim());
if ( ( ex != 0. )
&& ( ex != 1. ) ) {
sp_css_attr_scale(css_set, 1/ex);
sp_desktop_set_style(SPDesktop *desktop, SPCSSAttr *css, bool change, bool write_current)
{
if (write_current) {
-// 1. Set internal value
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ // 1. Set internal value
sp_repr_css_merge(desktop->current, css);
-// 1a. Write to prefs; make a copy and unset any URIs first
+ // 1a. Write to prefs; make a copy and unset any URIs first
SPCSSAttr *css_write = sp_repr_css_attr_new();
sp_repr_css_merge(css_write, css);
sp_css_attr_unset_uris(css_write);
- sp_repr_css_change(inkscape_get_repr(INKSCAPE, "desktop"), css_write, "style");
+ prefs->mergeStyle("/desktop/style", css_write);
+
for (const GSList *i = desktop->selection->itemList(); i != NULL; i = i->next) {
/* last used styles for 3D box faces are stored separately */
if (SP_IS_BOX3D_SIDE (i->data)) {
const char * descr = box3d_side_axes_string(SP_BOX3D_SIDE(i->data));
if (descr != NULL) {
- gchar *style_grp = g_strconcat ("desktop.", descr, NULL);
- sp_repr_css_change(inkscape_get_repr(INKSCAPE, style_grp), css_write, "style");
- g_free (style_grp);
+ prefs->mergeStyle(Glib::ustring("/desktop/") + descr + "/style", css_write);
}
}
}
}
double
-sp_desktop_get_master_opacity_tool(SPDesktop *desktop, char const *tool)
+sp_desktop_get_master_opacity_tool(SPDesktop *desktop, Glib::ustring const &tool, bool *has_opacity)
{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
SPCSSAttr *css = NULL;
gfloat value = 1.0; // default if nothing else found
- if (prefs_get_double_attribute(tool, "usecurrent", 0) != 0) {
+ if (has_opacity)
+ *has_opacity = false;
+ if (prefs->getBool(tool + "/usecurrent")) {
css = sp_desktop_get_style(desktop, true);
- } else {
- Inkscape::XML::Node *tool_repr = inkscape_get_repr(INKSCAPE, tool);
- if (tool_repr) {
- css = sp_repr_css_attr_inherited(tool_repr, "style");
- }
+ } else {
+ css = prefs->getStyle(tool + "/style");
}
if (css) {
if (desktop->current && property) { // if there is style and the property in it,
if ( !sp_svg_number_read_f(property, &value) ) {
value = 1.0; // things failed. set back to the default
+ } else {
+ if (has_opacity)
+ *has_opacity = false;
}
}
return value;
}
double
-sp_desktop_get_opacity_tool(SPDesktop *desktop, char const *tool, bool is_fill)
+sp_desktop_get_opacity_tool(SPDesktop *desktop, Glib::ustring const &tool, bool is_fill)
{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
SPCSSAttr *css = NULL;
gfloat value = 1.0; // default if nothing else found
- if (prefs_get_double_attribute(tool, "usecurrent", 0) != 0) {
+ if (prefs->getBool(tool + "/usecurrent")) {
css = sp_desktop_get_style(desktop, true);
} else {
- Inkscape::XML::Node *tool_repr = inkscape_get_repr(INKSCAPE, tool);
- if (tool_repr) {
- css = sp_repr_css_attr_inherited(tool_repr, "style");
- }
+ css = prefs->getStyle(tool + "/style");
}
if (css) {
@@ -298,27 +299,30 @@ sp_desktop_get_opacity_tool(SPDesktop *desktop, char const *tool, bool is_fill)
return value;
}
+
guint32
-sp_desktop_get_color_tool(SPDesktop *desktop, char const *tool, bool is_fill)
-{
+sp_desktop_get_color_tool(SPDesktop *desktop, Glib::ustring const &tool, bool is_fill, bool *has_color)
+{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
SPCSSAttr *css = NULL;
guint32 r = 0; // if there's no color, return black
- if (prefs_get_int_attribute(tool, "usecurrent", 0) != 0) {
+ if (has_color)
+ *has_color = false;
+ if (prefs->getBool(tool + "/usecurrent")) {
css = sp_desktop_get_style(desktop, true);
} else {
- Inkscape::XML::Node *tool_repr = inkscape_get_repr(INKSCAPE, tool);
- if (tool_repr) {
- css = sp_repr_css_attr_inherited(tool_repr, "style");
- }
+ css = prefs->getStyle(tool + "/style");
}
if (css) {
gchar const *property = sp_repr_css_property(css, is_fill ? "fill" : "stroke", "#000");
if (desktop->current && property) { // if there is style and the property in it,
- if (strncmp(property, "url", 3)) { // and if it's not url,
+ if (strncmp(property, "url", 3) && strncmp(property, "none", 4)) { // and if it's not url or none,
// read it
r = sp_svg_read_color(property, r);
+ if (has_color)
+ *has_color = true;
}
}
return r | 0xff;
}
+
/**
* Apply the desktop's current style or the tool style to repr.
*/
void
-sp_desktop_apply_style_tool(SPDesktop *desktop, Inkscape::XML::Node *repr, char const *tool, bool with_text)
+sp_desktop_apply_style_tool(SPDesktop *desktop, Inkscape::XML::Node *repr, Glib::ustring const &tool_path, bool with_text)
{
SPCSSAttr *css_current = sp_desktop_get_style(desktop, with_text);
- if ((prefs_get_int_attribute(tool, "usecurrent", 0) != 0) && css_current) {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+
+ if (prefs->getBool(tool_path + "/usecurrent") && css_current) {
sp_repr_css_set(repr, css_current, "style");
} else {
- Inkscape::XML::Node *tool_repr = inkscape_get_repr(INKSCAPE, tool);
- if (tool_repr) {
- SPCSSAttr *css = sp_repr_css_attr_inherited(tool_repr, "style");
- sp_repr_css_set(repr, css, "style");
- sp_repr_css_attr_unref(css);
- }
+ SPCSSAttr *css = prefs->getStyle(tool_path + "/style");
+ sp_repr_css_set(repr, css, "style");
+ sp_repr_css_attr_unref(css);
}
if (css_current) {
sp_repr_css_attr_unref(css_current);
sp_desktop_get_font_size_tool(SPDesktop *desktop)
{
(void)desktop; // TODO cleanup
- gchar const *desktop_style = inkscape_get_repr(INKSCAPE, "desktop")->attribute("style");
- gchar const *style_str = NULL;
- if ((prefs_get_int_attribute("tools.text", "usecurrent", 0) != 0) && desktop_style) {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ Glib::ustring desktop_style = prefs->getString("/desktop/style");
+ Glib::ustring style_str;
+ if ((prefs->getBool("/tools/text/usecurrent")) && !desktop_style.empty()) {
style_str = desktop_style;
} else {
- Inkscape::XML::Node *tool_repr = inkscape_get_repr(INKSCAPE, "tools.text");
- if (tool_repr) {
- style_str = tool_repr->attribute("style");
- }
+ style_str = prefs->getString("/tools/text/style");
}
double ret = 12;
- if (style_str) {
+ if (!style_str.empty()) {
SPStyle *style = sp_style_new(SP_ACTIVE_DOCUMENT);
- sp_style_merge_from_style_string(style, style_str);
+ sp_style_merge_from_style_string(style, style_str.data());
ret = style->font_size.computed;
sp_style_unref(style);
}
if (!SP_IS_ITEM (l->data))
continue;
- NR::Matrix i2d = sp_item_i2d_affine (SP_ITEM(l->data));
+ Geom::Matrix i2d = sp_item_i2d_affine (SP_ITEM(l->data));
SPObject *object = SP_OBJECT(l->data);
notstroked = false;
}
- avgwidth += SP_OBJECT_STYLE (object)->stroke_width.computed * i2d.expansion();
+ avgwidth += SP_OBJECT_STYLE (object)->stroke_width.computed * i2d.descrim();
}
if (notstroked)
n_stroked ++;
- NR::Matrix i2d = sp_item_i2d_affine (SP_ITEM(obj));
- double sw = style->stroke_width.computed * i2d.expansion();
+ Geom::Matrix i2d = sp_item_i2d_affine (SP_ITEM(obj));
+ double sw = style->stroke_width.computed * i2d.descrim();
if (prev_sw != -1 && fabs(sw - prev_sw) > 1e-3)
same_sw = false;
if (!style) continue;
texts ++;
- size += style->font_size.computed * NR::expansion(sp_item_i2d_affine(SP_ITEM(obj))); /// \todo FIXME: we assume non-% units here
+ size += style->font_size.computed * Geom::Matrix(sp_item_i2d_affine(SP_ITEM(obj))).descrim(); /// \todo FIXME: we assume non-% units here
if (style->letter_spacing.normal) {
if (!different && (letterspacing_prev == 0 || letterspacing_prev == letterspacing))
}
}
- if (texts == 0 || !style_res->text->font_specification.set)
+ if (texts == 0)
return QUERY_STYLE_NOTHING;
if (texts > 1) {
if (!style) continue;
if (!SP_IS_ITEM(obj)) continue;
- NR::Matrix i2d = sp_item_i2d_affine (SP_ITEM(obj));
+ Geom::Matrix i2d = sp_item_i2d_affine (SP_ITEM(obj));
items ++;
if(SP_IS_GAUSSIANBLUR(primitive)) {
SPGaussianBlur * spblur = SP_GAUSSIANBLUR(primitive);
float num = spblur->stdDeviation.getNumber();
- blur_sum += num * NR::expansion(i2d);
+ blur_sum += num * i2d.descrim();
if (blur_prev != -1 && fabs (num - blur_prev) > 1e-2) // rather low tolerance because difference in blur radii is much harder to notice than e.g. difference in sizes
same_blur = false;
blur_prev = num;
}
/**
- * Do the same as sp_desktop_query_style for all (defined) style properties, return true if none of
- * the properties returned QUERY_STYLE_NOTHING.
+ * Do the same as sp_desktop_query_style for all (defined) style properties, return true if at
+ * least one of the properties did not return QUERY_STYLE_NOTHING.
*/
bool
sp_desktop_query_style_all (SPDesktop *desktop, SPStyle *query)
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);
- return (result_family != QUERY_STYLE_NOTHING && result_fstyle != QUERY_STYLE_NOTHING && result_fnumbers != QUERY_STYLE_NOTHING && result_fill != QUERY_STYLE_NOTHING && result_stroke != QUERY_STYLE_NOTHING && result_opacity != QUERY_STYLE_NOTHING && result_strokewidth != QUERY_STYLE_NOTHING && result_strokemiterlimit != QUERY_STYLE_NOTHING && result_strokecap != QUERY_STYLE_NOTHING && result_strokejoin != QUERY_STYLE_NOTHING && result_blur != QUERY_STYLE_NOTHING);
+ return (result_family != QUERY_STYLE_NOTHING ||
+ result_fstyle != QUERY_STYLE_NOTHING ||
+ result_fnumbers != QUERY_STYLE_NOTHING ||
+ result_fill != QUERY_STYLE_NOTHING ||
+ result_stroke != QUERY_STYLE_NOTHING ||
+ result_opacity != QUERY_STYLE_NOTHING ||
+ result_strokewidth != QUERY_STYLE_NOTHING ||
+ result_strokemiterlimit != QUERY_STYLE_NOTHING ||
+ result_strokecap != QUERY_STYLE_NOTHING ||
+ result_strokejoin != QUERY_STYLE_NOTHING ||
+ result_blur != QUERY_STYLE_NOTHING);
}