summaryrefslogtreecommitdiffstats
path: root/src/style.cpp
diff options
context:
space:
mode:
authorHugo Rodrigues <me@hugorodrigues.com>2006-08-02 21:31:59 +0000
committerhaa_rodrigues <haa_rodrigues@users.sourceforge.net>2006-08-02 21:31:59 +0000
commit8b5a13ebdf2b288d3f888a70e18d143039cb9b3f (patch)
treef3cbff6eadac212f95620dfdcdf445e2f91ee106 /src/style.cpp
parentrefactored session establishment (diff)
downloadinkscape-8b5a13ebdf2b288d3f888a70e18d143039cb9b3f.tar.gz
inkscape-8b5a13ebdf2b288d3f888a70e18d143039cb9b3f.zip
Added skeleton files for other filter primitives' SP-objects. Added blur slider on fill/stroke dialog (uncomment on object-properties.cpp).
(bzr r1542)
Diffstat (limited to 'src/style.cpp')
-rw-r--r--src/style.cpp49
1 files changed, 39 insertions, 10 deletions
diff --git a/src/style.cpp b/src/style.cpp
index 0eb8b0869..bd880b857 100644
--- a/src/style.cpp
+++ b/src/style.cpp
@@ -118,7 +118,7 @@ static void sp_style_clear(SPStyle *style);
static void sp_style_merge_property(SPStyle *style, gint id, gchar const *val);
static void sp_style_merge_ipaint(SPStyle *style, SPIPaint *paint, SPIPaint const *parent);
-static void sp_style_merge_ifilter(SPIFilter *child, SPIFilter const *parent);
+static void sp_style_merge_ifilter(SPStyle *style, SPIFilter *child, SPIFilter const *parent);
static void sp_style_read_dash(SPStyle *style, gchar const *str);
static SPTextStyle *sp_text_style_new(void);
@@ -138,7 +138,7 @@ static void sp_style_read_itextdecoration(SPITextDecoration *val, gchar const *s
static void sp_style_read_icolor(SPIPaint *paint, gchar const *str, SPStyle *style, SPDocument *document);
static void sp_style_read_ipaint(SPIPaint *paint, gchar const *str, SPStyle *style, SPDocument *document);
static void sp_style_read_ifontsize(SPIFontSize *val, gchar const *str);
-static void sp_style_read_ifilter(SPIFilter *f, gchar const *str, SPDocument *document);
+static void sp_style_read_ifilter(SPIFilter *f, gchar const *str, SPStyle *style, SPDocument *document);
static void sp_style_read_penum(SPIEnum *val, Inkscape::XML::Node *repr, gchar const *key, SPStyleEnum const *dict, bool can_explicitly_inherit);
static void sp_style_read_plength(SPILength *val, Inkscape::XML::Node *repr, gchar const *key);
@@ -160,6 +160,8 @@ static void css2_unescape_unquote(SPIString *val);
static void sp_style_paint_clear(SPStyle *style, SPIPaint *paint);
+static void sp_style_filter_clear(SPStyle *style, SPIFilter *filter);
+
#define SPS_READ_IENUM_IF_UNSET(v,s,d,i) if (!(v)->set) {sp_style_read_ienum((v), (s), (d), (i));}
#define SPS_READ_PENUM_IF_UNSET(v,r,k,d,i) if (!(v)->set) {sp_style_read_penum((v), (r), (k), (d), (i));}
@@ -409,6 +411,7 @@ sp_style_new()
style->fill_hreffed = false;
style->stroke_hreffed = false;
+ style->filter_hreffed = false;
new (&style->release_connection) sigc::connection();
@@ -475,6 +478,7 @@ sp_style_unref(SPStyle *style)
if (style->text) sp_text_style_unref(style->text);
sp_style_paint_clear(style, &style->fill);
sp_style_paint_clear(style, &style->stroke);
+ sp_style_filter_clear(style, &style->filter);
style->fill_release_connection.disconnect();
style->fill_release_connection.~connection();
style->fill_modified_connection.disconnect();
@@ -676,8 +680,7 @@ sp_style_read(SPStyle *style, SPObject *object, Inkscape::XML::Node *repr)
if (!style->filter.set) {
val = repr->attribute("filter");
if (val) {
- sp_style_read_ifilter(&style->filter, val,
- (object) ? SP_OBJECT_DOCUMENT(object) : NULL);
+ sp_style_read_ifilter(&style->filter, val, style, (object) ? SP_OBJECT_DOCUMENT(object) : NULL);
}
}
SPS_READ_PENUM_IF_UNSET(&style->enable_background, repr,
@@ -917,7 +920,7 @@ sp_style_merge_property(SPStyle *style, gint id, gchar const *val)
/* Filter */
case SP_PROP_FILTER:
if (!style->filter.set && !style->filter.inherit) {
- sp_style_read_ifilter(&style->filter, val, (style->object) ? SP_OBJECT_DOCUMENT(style->object) : NULL);
+ sp_style_read_ifilter(&style->filter, val, style, (style->object) ? SP_OBJECT_DOCUMENT(style->object) : NULL);
}
break;
case SP_PROP_FLOOD_COLOR:
@@ -1456,7 +1459,7 @@ sp_style_merge_from_parent(SPStyle *const style, SPStyle const *const parent)
/* Filter effects */
if(style->filter.set && style->filter.inherit) {
- sp_style_merge_ifilter(&style->filter, &parent->filter);
+ sp_style_merge_ifilter(style, &style->filter, &parent->filter);
}
if(style->enable_background.inherit) {
@@ -2113,12 +2116,15 @@ sp_style_merge_ipaint(SPStyle *style, SPIPaint *paint, SPIPaint const *parent)
* Filter effects do not inherit by default
*/
static void
-sp_style_merge_ifilter(SPIFilter *child, SPIFilter const *parent)
+sp_style_merge_ifilter(SPStyle *style, SPIFilter *child, SPIFilter const *parent)
{
+ sp_style_filter_clear(style, child);
child->set = parent->set;
child->inherit = parent->inherit;
child->filter = parent->filter;
child->uri = parent->uri;
+ sp_object_href(SP_OBJECT(child), style);
+ style->filter_hreffed = true;
}
/**
@@ -2397,6 +2403,7 @@ sp_style_clear(SPStyle *style)
sp_style_paint_clear(style, &style->fill);
sp_style_paint_clear(style, &style->stroke);
+ sp_style_filter_clear(style, &style->filter);
if (style->stroke_dash.dash) {
g_free(style->stroke_dash.dash);
}
@@ -3100,7 +3107,7 @@ sp_style_read_ifontsize(SPIFontSize *val, gchar const *str)
* Set SPIFilter object from string.
*/
static void
-sp_style_read_ifilter(SPIFilter *f, gchar const *str, SPDocument *document)
+sp_style_read_ifilter( SPIFilter *f, gchar const *str, SPStyle * style, SPDocument *document)
{
/* Try all possible values: inherit, none, uri */
if (streq(str, "inherit")) {
@@ -3128,10 +3135,12 @@ sp_style_read_ifilter(SPIFilter *f, gchar const *str, SPDocument *document)
obj = sp_uri_reference_resolve(document, str);
if (SP_IS_FILTER(obj)) {
f->filter = SP_FILTER(obj);
+ sp_object_href(SP_OBJECT(f->filter), style);
+ style->filter_hreffed = true;
//g_signal_connect(G_OBJECT(f->filter), "release",
- // G_CALLBACK(sp_style_filter_release), style);
+ // G_CALLBACK(sp_style_filter_release), style);
//g_signal_connect(G_OBJECT(f->filter), "modified",
- // G_CALLBACK(sp_style_filter_modified), style);
+ // G_CALLBACK(sp_style_filter_modified), style);
} else {
g_warning("Element '%s' not found or is not a filter", f->uri);
}
@@ -3664,6 +3673,26 @@ sp_style_paint_clear(SPStyle *style, SPIPaint *paint)
paint->iccColor = NULL;
}
+
+/**
+ * Clear filter object, and disconnect style from paintserver (if present).
+ */
+static void
+sp_style_filter_clear(SPStyle *style, SPIFilter *f)
+{
+
+ if (style->filter_hreffed) {
+ sp_object_hunref(SP_OBJECT(f->filter), style);
+ style->filter_hreffed = false;
+ }
+ //style->fill_release_connection.disconnect();
+ //style->fill_modified_connection.disconnect();
+
+ f->filter = NULL;
+
+}
+
+
/**
* Clear all style property attributes in object.
*/