<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.inkscape.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Flo</id>
	<title>Inkscape Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.inkscape.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Flo"/>
	<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/Special:Contributions/Flo"/>
	<updated>2026-04-04T11:47:26Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=18709</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=18709"/>
		<updated>2008-01-22T21:09:15Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Status of the filter primitives */ added link to feImage report email&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification]. It has been worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and 2007 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
User interface for filter effects was developed in GSoC 2007.&lt;br /&gt;
&lt;br /&gt;
For information about internal workings of filter effects renderer, please see page [[Filter effects internals]].&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Filter Effect support in trunk ==&lt;br /&gt;
=== Status of the filter primitives===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Partially Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Partial implementation'''&lt;br /&gt;
TODO:&lt;br /&gt;
*edgeMode behaviour&lt;br /&gt;
*produce resolution-independent results&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524], [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/24328]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphology]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Partly Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#dddddd;&amp;quot;| '''Needs some analysis'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== general bugs ===&lt;br /&gt;
UI&lt;br /&gt;
* Connecting a Filter with itself, connect it to one of the reserved keywords.[https://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1762574&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
&lt;br /&gt;
Renderer&lt;br /&gt;
* StrokePaint and FillPaint input images are not supported. [https://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1762588&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
&lt;br /&gt;
* Result from filter is not cut to the shape of filter effects area. Note that filter effects area can be a rotated rectangle or parallelogram when viewed in display coordinates.&lt;br /&gt;
&lt;br /&gt;
* There are many parts in filtering code marked with TODO. Many of these mark unhandled corner cases and places, where the filters generate almost but not quite correct results.&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Mockups of Filter editing and related dialogs ==&lt;br /&gt;
&lt;br /&gt;
Presentation of new Fill and Stroke dialog where user can easily access most frequent actions like changing Blend modes, Blurring and Opacity of an object and select filter for an object or group of objects WITHOUT ability of accessing  editing of the same.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fill_and_stroke.png]]&lt;br /&gt;
&lt;br /&gt;
Changing of effect parameters and building sets of same can be done in specialized editor. Maybe next step in pushing ease of effect use further could be loading of contributed sets of effects and their parameters from file user had made himself or downloaded according to his preference from Effect library hosted somewhere on net (inkscape.org?!).&lt;br /&gt;
&lt;br /&gt;
[[Image:Filter_edit_dialog.png]]&lt;br /&gt;
&lt;br /&gt;
Possible benefits of this approach:&lt;br /&gt;
 &lt;br /&gt;
- '''Speed-ups''' - no need to redraw canvas for every single effect parameter tweaking&lt;br /&gt;
&lt;br /&gt;
- '''Effect library''' - like noted above; SVG effects can be very hard to deal with for a designer/illustrator without technical background. This way developers can make a small set of commonly used effects like '''''drop shadow, outer/inner glow, etc'''''. Learning curve for such (I think targeted) user will be shorter because he/she will eventually catch up with internal way of dealing with effects by doing simple changes on occasion.&lt;br /&gt;
&lt;br /&gt;
Another possible mock-up of the filters dialogue: http://wiki.inkscape.org/wiki/images/INKSCAPE_filters_dialogue.svg&lt;br /&gt;
&lt;br /&gt;
-using extra windows to tweak effect parameters (its good for effects with 1 parameter, but most have at least 2. hmm)&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=16076</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=16076"/>
		<updated>2007-08-16T18:39:10Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Status of the filter primitives */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Filter Effect support in trunk ==&lt;br /&gt;
=== Status of the filter primitives===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Partial implementation'''&lt;br /&gt;
TODO:&lt;br /&gt;
*edgeMode &amp;amp; preserveAlpha behaviours&lt;br /&gt;
*produce resolution-independent results&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphology]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://fedev.blogspot.com/2007/07/i-can-has-turbulence.html],[http://fedev.blogspot.com/2007/07/introducing-fecomposite.html],[http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21525]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== general bugs ===&lt;br /&gt;
UI&lt;br /&gt;
* Connecting a Filter with itself, connect it to one of the reserved keywords.[https://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1762574&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
== Mockups of Filter editing and related dialogs ==&lt;br /&gt;
&lt;br /&gt;
Presentation of new Fill and Stroke dialog where user can easily access most frequent actions like changing Blend modes, Blurring and Opacity of an object and select filter for an object or group of objects WITHOUT ability of accessing  editing of the same.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fill_and_stroke.png]]&lt;br /&gt;
&lt;br /&gt;
Changing of effect parameters and building sets of same can be done in specialized editor. Maybe next step in pushing ease of effect use further could be loading of contributed sets of effects and their parameters from file user had made himself or downloaded according to his preference from Effect library hosted somewhere on net (inkscape.org?!).&lt;br /&gt;
&lt;br /&gt;
[[Image:Filter_edit_dialog.png]]&lt;br /&gt;
&lt;br /&gt;
Possible benefits of this approach:&lt;br /&gt;
 &lt;br /&gt;
- '''Speed-ups''' - no need to redraw canvas for every single effect parameter tweaking&lt;br /&gt;
&lt;br /&gt;
- '''Effect library''' - like noted above; SVG effects can be very hard to deal with for a designer/illustrator without technical background. This way developers can make a small set of commonly used effects like '''''drop shadow, outer/inner glow, etc'''''. Learning curve for such (I think targeted) user will be shorter because he/she will eventually catch up with internal way of dealing with effects by doing simple changes on occasion.&lt;br /&gt;
&lt;br /&gt;
Another possible mock-up of the filters dialogue: http://wiki.inkscape.org/wiki/images/INKSCAPE_filters_dialogue.svg&lt;br /&gt;
&lt;br /&gt;
-using extra windows to tweak effect parameters (its good for effects with 1 parameter, but most have at least 2. hmm)&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15913</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15913"/>
		<updated>2007-07-28T10:22:16Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Status of the filter primitives */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Filter Effect support in trunk ==&lt;br /&gt;
=== Status of the filter primitives===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Partial implementation'''&lt;br /&gt;
TODO:&lt;br /&gt;
*edgeMode &amp;amp; preserveAlpha behaviours&lt;br /&gt;
*produce resolution-independent results&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1762289&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphology]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [https://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1762588&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://fedev.blogspot.com/2007/07/i-can-has-turbulence.html],[http://fedev.blogspot.com/2007/07/introducing-fecomposite.html],[http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21525]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== general bugs ===&lt;br /&gt;
UI&lt;br /&gt;
* Connecting a Filter with itself, connect it to one of the reserved keywords.[https://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1762574&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
== Mockups of Filter editing and related dialogs ==&lt;br /&gt;
&lt;br /&gt;
Presentation of new Fill and Stroke dialog where user can easily access most frequent actions like changing Blend modes, Blurring and Opacity of an object and select filter for an object or group of objects WITHOUT ability of accessing  editing of the same.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fill_and_stroke.png]]&lt;br /&gt;
&lt;br /&gt;
Changing of effect parameters and building sets of same can be done in specialized editor. Maybe next step in pushing ease of effect use further could be loading of contributed sets of effects and their parameters from file user had made himself or downloaded according to his preference from Effect library hosted somewhere on net (inkscape.org?!).&lt;br /&gt;
&lt;br /&gt;
[[Image:Filter_edit_dialog.png]]&lt;br /&gt;
&lt;br /&gt;
Possible benefits of this approach:&lt;br /&gt;
 &lt;br /&gt;
- '''Speed-ups''' - no need to redraw canvas for every single effect parameter tweaking&lt;br /&gt;
&lt;br /&gt;
- '''Effect library''' - like noted above; SVG effects can be very hard to deal with for a designer/illustrator without technical background. This way developers can make a small set of commonly used effects like '''''drop shadow, outer/inner glow, etc'''''. Learning curve for such (I think targeted) user will be shorter because he/she will eventually catch up with internal way of dealing with effects by doing simple changes on occasion.&lt;br /&gt;
&lt;br /&gt;
Another possible mock-up of the filters dialogue: http://wiki.inkscape.org/wiki/images/INKSCAPE_filters_dialogue.svg&lt;br /&gt;
&lt;br /&gt;
-using extra windows to tweak effect parameters (its good for effects with 1 parameter, but most have at least 2. hmm)&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15912</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15912"/>
		<updated>2007-07-28T10:11:32Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* general bugs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Filter Effect support in trunk ==&lt;br /&gt;
=== Status of the filter primitives===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Partial implementation'''&lt;br /&gt;
TODO:&lt;br /&gt;
*edgeMode &amp;amp; preserveAlpha behaviours&lt;br /&gt;
*produce resolution-independent results&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1762289&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphology]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://fedev.blogspot.com/2007/07/i-can-has-turbulence.html],[http://fedev.blogspot.com/2007/07/introducing-fecomposite.html],[http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21525]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== general bugs ===&lt;br /&gt;
UI&lt;br /&gt;
* Connecting a Filter with itself, connect it to one of the reserved keywords.[https://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1762574&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
== Mockups of Filter editing and related dialogs ==&lt;br /&gt;
&lt;br /&gt;
Presentation of new Fill and Stroke dialog where user can easily access most frequent actions like changing Blend modes, Blurring and Opacity of an object and select filter for an object or group of objects WITHOUT ability of accessing  editing of the same.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fill_and_stroke.png]]&lt;br /&gt;
&lt;br /&gt;
Changing of effect parameters and building sets of same can be done in specialized editor. Maybe next step in pushing ease of effect use further could be loading of contributed sets of effects and their parameters from file user had made himself or downloaded according to his preference from Effect library hosted somewhere on net (inkscape.org?!).&lt;br /&gt;
&lt;br /&gt;
[[Image:Filter_edit_dialog.png]]&lt;br /&gt;
&lt;br /&gt;
Possible benefits of this approach:&lt;br /&gt;
 &lt;br /&gt;
- '''Speed-ups''' - no need to redraw canvas for every single effect parameter tweaking&lt;br /&gt;
&lt;br /&gt;
- '''Effect library''' - like noted above; SVG effects can be very hard to deal with for a designer/illustrator without technical background. This way developers can make a small set of commonly used effects like '''''drop shadow, outer/inner glow, etc'''''. Learning curve for such (I think targeted) user will be shorter because he/she will eventually catch up with internal way of dealing with effects by doing simple changes on occasion.&lt;br /&gt;
&lt;br /&gt;
Another possible mock-up of the filters dialogue: http://wiki.inkscape.org/wiki/images/INKSCAPE_filters_dialogue.svg&lt;br /&gt;
&lt;br /&gt;
-using extra windows to tweak effect parameters (its good for effects with 1 parameter, but most have at least 2. hmm)&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15909</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15909"/>
		<updated>2007-07-27T19:30:28Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Filter Effect support in trunk */ added bug to blur filter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Filter Effect support in trunk ==&lt;br /&gt;
=== Status of the filter primitives===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Parcial implementation'''&lt;br /&gt;
TODO:&lt;br /&gt;
*edgeMode &amp;amp; preserveAlpha behaviours&lt;br /&gt;
*produce resolution-independent results&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1762289&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphology]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://fedev.blogspot.com/2007/07/i-can-has-turbulence.html],[http://fedev.blogspot.com/2007/07/introducing-fecomposite.html],[http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21525]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== general bugs ===&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
== Mockups of Filter editing and related dialogs ==&lt;br /&gt;
&lt;br /&gt;
Presentation of new Fill and Stroke dialog where user can easily access most frequent actions like changing Blend modes, Blurring and Opacity of an object and select filter for an object or group of objects WITHOUT ability of accessing  editing of the same.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fill_and_stroke.png]]&lt;br /&gt;
&lt;br /&gt;
Changing of effect parameters and building sets of same can be done in specialized editor. Maybe next step in pushing ease of effect use further could be loading of contributed sets of effects and their parameters from file user had made himself or downloaded according to his preference from Effect library hosted somewhere on net (inkscape.org?!).&lt;br /&gt;
&lt;br /&gt;
[[Image:Filter_edit_dialog.png]]&lt;br /&gt;
&lt;br /&gt;
Possible benefits of this approach:&lt;br /&gt;
 &lt;br /&gt;
- '''Speed-ups''' - no need to redraw canvas for every single effect parameter tweaking&lt;br /&gt;
&lt;br /&gt;
- '''Effect library''' - like noted above; SVG effects can be very hard to deal with for a designer/illustrator without technical background. This way developers can make a small set of commonly used effects like '''''drop shadow, outer/inner glow, etc'''''. Learning curve for such (I think targeted) user will be shorter because he/she will eventually catch up with internal way of dealing with effects by doing simple changes on occasion.&lt;br /&gt;
&lt;br /&gt;
Another possible mock-up of the filters dialogue: http://wiki.inkscape.org/wiki/images/INKSCAPE_filters_dialogue.svg&lt;br /&gt;
&lt;br /&gt;
-using extra windows to tweak effect parameters (its good for effects with 1 parameter, but most have at least 2. hmm)&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15908</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15908"/>
		<updated>2007-07-27T18:59:41Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Status of the filter primitives */ UI support now two values in stdDeviation of blur&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Filter Effect support in trunk ==&lt;br /&gt;
=== Status of the filter primitives===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Parcial implementation'''&lt;br /&gt;
TODO:&lt;br /&gt;
*edgeMode &amp;amp; preserveAlpha behaviours&lt;br /&gt;
*produce resolution-independent results&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphology]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://fedev.blogspot.com/2007/07/i-can-has-turbulence.html],[http://fedev.blogspot.com/2007/07/introducing-fecomposite.html],[http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21525]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== general bugs ===&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
== Mockups of Filter editing and related dialogs ==&lt;br /&gt;
&lt;br /&gt;
Presentation of new Fill and Stroke dialog where user can easily access most frequent actions like changing Blend modes, Blurring and Opacity of an object and select filter for an object or group of objects WITHOUT ability of accessing  editing of the same.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fill_and_stroke.png]]&lt;br /&gt;
&lt;br /&gt;
Changing of effect parameters and building sets of same can be done in specialized editor. Maybe next step in pushing ease of effect use further could be loading of contributed sets of effects and their parameters from file user had made himself or downloaded according to his preference from Effect library hosted somewhere on net (inkscape.org?!).&lt;br /&gt;
&lt;br /&gt;
[[Image:Filter_edit_dialog.png]]&lt;br /&gt;
&lt;br /&gt;
Possible benefits of this approach:&lt;br /&gt;
 &lt;br /&gt;
- '''Speed-ups''' - no need to redraw canvas for every single effect parameter tweaking&lt;br /&gt;
&lt;br /&gt;
- '''Effect library''' - like noted above; SVG effects can be very hard to deal with for a designer/illustrator without technical background. This way developers can make a small set of commonly used effects like '''''drop shadow, outer/inner glow, etc'''''. Learning curve for such (I think targeted) user will be shorter because he/she will eventually catch up with internal way of dealing with effects by doing simple changes on occasion.&lt;br /&gt;
&lt;br /&gt;
Another possible mock-up of the filters dialogue: http://wiki.inkscape.org/wiki/images/INKSCAPE_filters_dialogue.svg&lt;br /&gt;
&lt;br /&gt;
-using extra windows to tweak effect parameters (its good for effects with 1 parameter, but most have at least 2. hmm)&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15875</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15875"/>
		<updated>2007-07-25T10:38:05Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Status of filter primitives in trunk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Filter Effect support in trunk ==&lt;br /&gt;
=== Status of the filter primitives===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760156&amp;amp;group_id=93438&amp;amp;atid=604306 ]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760161&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphology]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://fedev.blogspot.com/2007/07/i-can-has-turbulence.html],[http://fedev.blogspot.com/2007/07/introducing-fecomposite.html]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
=== general bugs ===&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15874</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15874"/>
		<updated>2007-07-25T10:20:11Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Status of filter primitives in trunk */ Not Implemented -&amp;gt; Not implemented&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Status of filter primitives in trunk ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760156&amp;amp;group_id=93438&amp;amp;atid=604306 ]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760161&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphology]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://fedev.blogspot.com/2007/07/i-can-has-turbulence.html],[http://fedev.blogspot.com/2007/07/introducing-fecomposite.html]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15873</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15873"/>
		<updated>2007-07-25T10:18:14Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Status of filter primitives in trunk */ added a note that Niko Kiirala has worked on feTurbulence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Status of filter primitives in trunk ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760156&amp;amp;group_id=93438&amp;amp;atid=604306 ]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760161&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphology]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://fedev.blogspot.com/2007/07/i-can-has-turbulence.html],[http://fedev.blogspot.com/2007/07/introducing-fecomposite.html]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15872</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15872"/>
		<updated>2007-07-25T10:07:09Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Status of filter primitives in trunk */ added that Felipe Sanches works on feImage and feDisplacementMap&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Status of filter primitives in trunk ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760156&amp;amp;group_id=93438&amp;amp;atid=604306 ]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760161&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffffbb;&amp;quot;| '''Work in progress''' - see [http://article.gmane.org/gmane.comp.graphics.inkscape.devel/21524]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphology]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15871</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15871"/>
		<updated>2007-07-25T09:34:23Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Status of filter primitives in trunk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Status of filter primitives in trunk ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760156&amp;amp;group_id=93438&amp;amp;atid=604306 ]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760161&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphology]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15870</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15870"/>
		<updated>2007-07-25T09:33:56Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Status of filter primitives in trunk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Status of filter primitives in trunk ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760156&amp;amp;group_id=93438&amp;amp;atid=604306 ]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760161&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphologyElement]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15869</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15869"/>
		<updated>2007-07-25T09:31:15Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Status of filter primitives in trunk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Status of filter primitives in trunk ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrixElement]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760156&amp;amp;group_id=93438&amp;amp;atid=604306 ]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760161&amp;amp;group_id=93438&amp;amp;atid=604306]&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphologyElement]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15868</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15868"/>
		<updated>2007-07-25T09:27:46Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Status of filter primitives in trunk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Status of filter primitives in trunk ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrixElement]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#ddffbb;&amp;quot;| '''Implemented''' - bugs: [http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1760156&amp;amp;group_id=93438&amp;amp;atid=604306 ]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphologyElement]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15867</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15867"/>
		<updated>2007-07-25T09:03:42Z</updated>

		<summary type="html">&lt;p&gt;Flo: /* Status of filter primitives */ -&amp;gt; replaced it with a table&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Status of filter primitives in trunk ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! primitive&lt;br /&gt;
! renderer&lt;br /&gt;
! user interface&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feBlendElement feBlend]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement feColorMatrixElement]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement feComponentTransfer]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feCompositeElement feComposite]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement feConvolveMatrix]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement feDiffuseLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement feDisplacementMap]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feFloodElement feFlood]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement feGaussianBlur]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feImageElement feImage]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMergeElement feMerge]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement feMorphologyElement]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feOffsetElement feOffset]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement feSpecularLighting]&lt;br /&gt;
|style=&amp;quot;background-color:#aaffbb;&amp;quot;| '''Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTileElement feTile]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement feTurbulence]&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|style=&amp;quot;background-color:#ffbbbb;&amp;quot;| '''Not Implemented'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15866</id>
		<title>Filter Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Filter_Effects&amp;diff=15866"/>
		<updated>2007-07-25T08:28:21Z</updated>

		<summary type="html">&lt;p&gt;Flo: What works? -&amp;gt; What works in Inkscape 0.45&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filter effects is a part of [http://www.w3.org/TR/SVG11/filters.html SVG specification] and worked on in Inkscape as part of [[Googles_Summer_Of_Code]] 2006 and [http://www.coss.fi/web/coss/developers/summercode COSS's Kesäkoodi] 2007&lt;br /&gt;
&lt;br /&gt;
For more info on this Kesäkoodi project, see [http://fedev.blogspot.com/ the project blog] or [http://cs.helsinki.fi/u/kiirala/kesakoodi/application.html the project plan].&lt;br /&gt;
&lt;br /&gt;
Also, there is an accepted proposal in GSoC 2007 for implementing the user interface for filter effects.&lt;br /&gt;
&lt;br /&gt;
== What works in Inkscape 0.45 ==&lt;br /&gt;
&lt;br /&gt;
Basic support for filter effects is included in 0.45 release. At the moment only gaussian blur is implemented, so while specifications define a bunch of other effects and some other programs can handle them, Inkscape cannot render them yet. Also, tools for editing other types of filters do not exist yet.&lt;br /&gt;
&lt;br /&gt;
Gaussian blur can be applied to an object by using Blur slider in Fill and stroke dialog.&lt;br /&gt;
&lt;br /&gt;
In Inkscape preferences dialog there is a setting controlling the filter rendering quality. Even low quality often produces good enough rendering quality, but it takes a lot less time to render. When exporting an image from Inkscape, the best quality is always used, regardless of this setting.&lt;br /&gt;
&lt;br /&gt;
== Status of filter primitives ==&lt;br /&gt;
&lt;br /&gt;
=== feBlend ===&lt;br /&gt;
Implemented&lt;br /&gt;
&lt;br /&gt;
=== feColorMatrix ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== feComponentTransfer ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== feComposite ===&lt;br /&gt;
Implemented&lt;br /&gt;
&lt;br /&gt;
=== feConvolveMatrix ===&lt;br /&gt;
Implemented&lt;br /&gt;
&lt;br /&gt;
=== feDiffuseLighting ===&lt;br /&gt;
Implemented&lt;br /&gt;
&lt;br /&gt;
=== feDisplacementMap ===&lt;br /&gt;
&lt;br /&gt;
=== feFlood ===&lt;br /&gt;
&lt;br /&gt;
=== feGaussianBlur ===&lt;br /&gt;
Implemented&lt;br /&gt;
&lt;br /&gt;
=== feImage ===&lt;br /&gt;
&lt;br /&gt;
=== feMerge ===&lt;br /&gt;
&lt;br /&gt;
=== feMorphology ===&lt;br /&gt;
&lt;br /&gt;
=== feOffset ===&lt;br /&gt;
Implemented&lt;br /&gt;
&lt;br /&gt;
=== feSpecularLighting ===&lt;br /&gt;
Implemented&lt;br /&gt;
&lt;br /&gt;
=== feTile ===&lt;br /&gt;
&lt;br /&gt;
=== feTurbulence ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What next? ==&lt;br /&gt;
&lt;br /&gt;
Now that this one filter works, most of the basic framework needed for filtering exists.&lt;br /&gt;
&lt;br /&gt;
These are the basic steps to create a new filter primitive:&lt;br /&gt;
* Write a new document model level class for this filter primitive (see src/sp-gaussian-blur.cpp) - note that while there are basic implementations for  many filter primitives, they do need plenty of changes.&lt;br /&gt;
* Write a renderer for this filter primitive (see src/display/nr-filter-gaussian.cpp)&lt;br /&gt;
* Add a pointer to a function returning an instance of the renderer class to function Filter::_create_constructor_table in file src/display/nr-filter.cpp &lt;br /&gt;
(this is likely not an exhaustive list)&lt;br /&gt;
&lt;br /&gt;
Before new filter primitives can be useful, there has to be an user interface for applying them to shapes. A really good thing would also be an UI for creating filters out of filter primitives.&lt;br /&gt;
&lt;br /&gt;
: See [[http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1628343&amp;amp;group_id=93438&amp;amp;atid=604309 1628343]] for my filter UI suggestion - [[User:Mauve|Mauve]] 01:44, 7 February 2007 (UTC)&lt;br /&gt;
&lt;br /&gt;
== NR::Filter initialization ==&lt;br /&gt;
&lt;br /&gt;
This is a brief explanation on how NR::Filter (filter effects renderer) objects are constructed.&lt;br /&gt;
&lt;br /&gt;
SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state. This method takes in the NR::Filter object instead of returning one, because this way that object can be reserved and freed on the same level in code. Also, this makes it easier to re-use the object instead of allocating new objects.&lt;br /&gt;
&lt;br /&gt;
The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. Before doing any filter specific initialization, this function should call sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;
&lt;br /&gt;
== Modification signals for filters ==&lt;br /&gt;
&lt;br /&gt;
This is explanation on how different parts of document tree are notified of changes to filter primitives. This is done so that the display can be updated as the filters are modified.&lt;br /&gt;
&lt;br /&gt;
As the underlying XML representation of the drawing is modified, the corresponding document level objects are notified of the change. Let's suppose, that the changed value was stdDeviation in feGaussianBlur. For the SPGaussianBlur object, this will show as call to sp_gaussianBlur_set method, with key=SP_ATTR_STDDEVIATION and 'value' containing the new value.&lt;br /&gt;
&lt;br /&gt;
After modifying its internal state according to new values, the _set method should pass the update notification onwards - this will allow objects using this filter to update their own state. As for now, this happens by calling ::requestModified(SP_OBJECT_MODIFIED_FLAG) on the filter primitive's parent (which should be SPFilter). This may not be the best way to do this, though.&lt;br /&gt;
&lt;br /&gt;
Filters are referenced from object style. When SPStyle object is built, it subscribes for update notifications from SPFilter it references (if any). Now when ::requestModified is called on SPFilter, these update notifications are also called (eventually, as requestModified only schedules modification event, instead of executing the event immediately).&lt;br /&gt;
&lt;br /&gt;
The SPStyle object in turn knows, which object it's part of - these objects are the actual drawable objects, to which the filters are applied to. SPStyle propagates the modification event to that object, which in turn applies the modifications to its internal state and schedules redraw for itself.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Flo</name></author>
	</entry>
</feed>