Code

Filters. Custom predefined filters update and new ABC filters.
[inkscape.git] / src / extension / internal / filter / abc.h
1 #ifndef __INKSCAPE_EXTENSION_INTERNAL_FILTER_ABC_H__
2 #define __INKSCAPE_EXTENSION_INTERNAL_FILTER_ABC_H__
3 /* Change the 'ABC' above to be your file name */
5 /*
6  * Copyright (C) 2011 Authors:
7  *   Ivan Louette (filters)
8  *   Nicolas Dufour (UI) <nicoduf@yahoo.fr>
9  *
10  * Basic filters
11  *   Blur
12  *   Diffuse light
13  *   Roughen
14  *   Specular light
15  *
16  * Released under GNU GPL, read the file 'COPYING' for more information
17  */
18 /* ^^^ Change the copyright to be you and your e-mail address ^^^ */
20 #include "filter.h"
22 #include "extension/internal/clear-n_.h"
23 #include "extension/system.h"
24 #include "extension/extension.h"
26 namespace Inkscape {
27 namespace Extension {
28 namespace Internal {
29 namespace Filter {
31 /**
32     \brief    Custom predefined Blur filter.
33     
34     Simple horizontal and vertical blur.
36     Filter's parameters:
37     * Horizontal blur (0.01->100., default 2) -> blur (stdDeviation)
38     * Vertical blur (0.01->100., default 2) -> blur (stdDeviation)
39 */
41 class Blur : public Inkscape::Extension::Internal::Filter::Filter {
42 protected:
43         virtual gchar const * get_filter_text (Inkscape::Extension::Extension * ext);
45 public:
46         Blur ( ) : Filter() { };
47         virtual ~Blur ( ) { if (_filter != NULL) g_free((void *)_filter); return; }
49         static void init (void) {
50                 Inkscape::Extension::build_from_mem(
51                         "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
52                                 "<name>" N_("Blur, custom (ABCs)") "</name>\n"
53                                 "<id>org.inkscape.effect.filter.blur</id>\n"
54                 "<param name=\"hblur\" gui-text=\"" N_("Horizontal blur:") "\" type=\"float\" min=\"0.01\" max=\"100\">2</param>\n"
55                 "<param name=\"vblur\" gui-text=\"" N_("Vertical blur:") "\" type=\"float\" min=\"0.01\" max=\"100\">2</param>\n"
56                                 "<effect>\n"
57                                         "<object-type>all</object-type>\n"
58                                         "<effects-menu>\n"
59                                                 "<submenu name=\"" N_("Filters") "\">\n"
60                                                 "<submenu name=\"" N_("Experimental") "\"/>\n"
61                               "</submenu>\n"
62                                         "</effects-menu>\n"
63                                         "<menu-tip>" N_("Simple vertical and horizontal blur effect") "</menu-tip>\n"
64                                 "</effect>\n"
65                         "</inkscape-extension>\n", new Blur());
66         };
68 };
70 gchar const *
71 Blur::get_filter_text (Inkscape::Extension::Extension * ext)
72 {
73         if (_filter != NULL) g_free((void *)_filter);
75     std::ostringstream hblur;
76     std::ostringstream vblur;
78     hblur << ext->get_param_float("hblur");
79     vblur << ext->get_param_float("vblur");
81         _filter = g_strdup_printf(
82                 "<filter xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" color-interpolation-filters=\"sRGB\" inkscape:label=\"Blur, custom\">\n"
83         "<feGaussianBlur stdDeviation=\"%s %s\" result=\"blur\" />\n"
84         "</filter>\n", hblur.str().c_str(), vblur.str().c_str());
86         return _filter;
87 }; /* Blur filter */
89 /**
90     \brief    Custom predefined Diffuse light filter.
91     
92     Basic diffuse bevel to use for building textures
94     Filter's parameters:
95     * Smoothness (0.->10., default 6.) -> blur (stdDeviation)
96     * Elevation (0->360, default 25) -> feDistantLight (elevation)
97     * Azimuth (0->360, default 235) -> feDistantLight (azimuth)
98     * Lightning color (guint, default -1 [white]) -> diffuse (lighting-color)
100     TODO: use the alpha channel to calculate the lightning color
101 */
103 class DiffuseLight : public Inkscape::Extension::Internal::Filter::Filter {
104 protected:
105         virtual gchar const * get_filter_text (Inkscape::Extension::Extension * ext);
107 public:
108         DiffuseLight ( ) : Filter() { };
109         virtual ~DiffuseLight ( ) { if (_filter != NULL) g_free((void *)_filter); return; }
111         static void init (void) {
112                 Inkscape::Extension::build_from_mem(
113                         "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
114                                 "<name>" N_("Diffuse light, custom (ABCs)") "</name>\n"
115                                 "<id>org.inkscape.effect.filter.diffuselight</id>\n"
116                 "<param name=\"smooth\" gui-text=\"" N_("Smoothness:") "\" type=\"float\" min=\"0.0\" max=\"10\">6</param>\n"
117                 "<param name=\"elevation\" gui-text=\"" N_("Elevation:") "\" type=\"int\" min=\"0\" max=\"360\">25</param>\n"
118                 "<param name=\"azimuth\" gui-text=\"" N_("Azimuth:") "\" type=\"int\" min=\"0\" max=\"360\">235</param>\n"
119                 "<param name=\"color\" gui-text=\"" N_("Lightning color") "\" type=\"color\">-1</param>\n"
120                                 "<effect>\n"
121                                         "<object-type>all</object-type>\n"
122                                         "<effects-menu>\n"
123                                                 "<submenu name=\"" N_("Filters") "\">\n"
124                                                 "<submenu name=\"" N_("Experimental") "\"/>\n"
125                               "</submenu>\n"
126                                         "</effects-menu>\n"
127                                         "<menu-tip>" N_("Basic diffuse bevel to use for building textures") "</menu-tip>\n"
128                                 "</effect>\n"
129                         "</inkscape-extension>\n", new DiffuseLight());
130         };
132 };
134 gchar const *
135 DiffuseLight::get_filter_text (Inkscape::Extension::Extension * ext)
137         if (_filter != NULL) g_free((void *)_filter);
139     std::ostringstream smooth;
140     std::ostringstream elevation;
141     std::ostringstream azimuth;
142     std::ostringstream r;
143     std::ostringstream g;
144     std::ostringstream b;
145     std::ostringstream a;
147     smooth << ext->get_param_float("smooth");
148     elevation << ext->get_param_int("elevation");
149     azimuth << ext->get_param_int("azimuth");
150     guint32 color = ext->get_param_color("color");
152     r << ((color >> 24) & 0xff);
153     g << ((color >> 16) & 0xff);
154     b << ((color >>  8) & 0xff);
155     a << (color & 0xff) / 255.0F;
156     
157         _filter = g_strdup_printf(
158                 "<filter xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" color-interpolation-filters=\"sRGB\" inkscape:label=\"Diffuse light, custom\">\n"
159         "<feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"%s\" result=\"blur\" />\n"
160         "<feDiffuseLighting diffuseConstant=\"1\" surfaceScale=\"10\" lighting-color=\"rgb(%s,%s,%s)\" result=\"diffuse\">\n"
161             "<feDistantLight elevation=\"%s\" azimuth=\"%s\" />\n"
162         "</feDiffuseLighting>\n"
163         "<feComposite in=\"diffuse\" in2=\"diffuse\" operator=\"arithmetic\" k1=\"1\" result=\"composite1\" />\n"
164         "<feComposite in=\"composite1\" in2=\"SourceGraphic\" k1=\"%s\" operator=\"arithmetic\" k3=\"1\" result=\"composite2\" />\n"
165         "</filter>\n", smooth.str().c_str(), r.str().c_str(), g.str().c_str(), b.str().c_str(), elevation.str().c_str(), azimuth.str().c_str(), a.str().c_str());
167         return _filter;
168 }; /* DiffuseLight filter */
170 /**
171     \brief    Custom predefined Roughen filter.
172     
173     Small-scale roughening to edges and content
175     Filter's parameters:
176     * Frequency (*100) (0.0->40., default 1.3) -> turbulence (baseFrequency)
177     * Intensity (0.0->50., default 6.6) -> displacement (scale)
178 */
180 class Roughen : public Inkscape::Extension::Internal::Filter::Filter {
181 protected:
182         virtual gchar const * get_filter_text (Inkscape::Extension::Extension * ext);
184 public:
185         Roughen ( ) : Filter() { };
186         virtual ~Roughen ( ) { if (_filter != NULL) g_free((void *)_filter); return; }
188         static void init (void) {
189                 Inkscape::Extension::build_from_mem(
190                         "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
191                                 "<name>" N_("Roughen, custom (ABCs)") "</name>\n"
192                                 "<id>org.inkscape.effect.filter.roughen</id>\n"
193                 "<param name=\"hfreq\" gui-text=\"" N_("Horizontal frequency (x100):") "\" type=\"float\" min=\"0.0\" max=\"40\">1.3</param>\n"
194                 "<param name=\"vfreq\" gui-text=\"" N_("Vertical frequency (x100):") "\" type=\"float\" min=\"0.0\" max=\"40\">1.3</param>\n"
195                 "<param name=\"intensity\" gui-text=\"" N_("Intensity:") "\" type=\"float\" min=\"0.0\" max=\"50\">6.6</param>\n"
196                                 "<effect>\n"
197                                         "<object-type>all</object-type>\n"
198                                         "<effects-menu>\n"
199                                                 "<submenu name=\"" N_("Filters") "\">\n"
200                                                 "<submenu name=\"" N_("Experimental") "\"/>\n"
201                               "</submenu>\n"
202                                         "</effects-menu>\n"
203                                         "<menu-tip>" N_("Small-scale roughening to edges and content") "</menu-tip>\n"
204                                 "</effect>\n"
205                         "</inkscape-extension>\n", new Roughen());
206         };
208 };
210 gchar const *
211 Roughen::get_filter_text (Inkscape::Extension::Extension * ext)
213         if (_filter != NULL) g_free((void *)_filter);
215     std::ostringstream hfreq;
216     std::ostringstream vfreq;
217     std::ostringstream intensity;
219     hfreq << (ext->get_param_float("hfreq") / 100);
220     vfreq << (ext->get_param_float("vfreq") / 100);
221     intensity << ext->get_param_float("intensity");
223         _filter = g_strdup_printf(
224                 "<filter xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" color-interpolation-filters=\"sRGB\" inkscape:label=\"Roughen, custom\">\n"
225         "<feTurbulence numOctaves=\"3\" seed=\"0\" type=\"turbulence\" baseFrequency=\"%s %s\" result=\"turbulence\" />\n"
226         "<feDisplacementMap in=\"SourceGraphic\" in2=\"turbulence\" scale=\"%s\" yChannelSelector=\"G\" xChannelSelector=\"R\" />\n"
227         "</filter>\n", hfreq.str().c_str(), vfreq.str().c_str(), intensity.str().c_str());
229         return _filter;
230 }; /* Roughen filter */
232 /**
233     \brief    Custom predefined Specular light filter.
234     
235     Basic specular bevel to use for building textures
237     Filter's parameters:
238     * Smoothness (0.0->10., default 6.) -> blur (stdDeviation)
239     * Brightness (0.0->5., default 1.) -> specular (specularConstant)
240     * Elevation (0->360, default 25) -> feDistantLight (elevation)
241     * Azimuth (0->360, default 235) -> feDistantLight (azimuth)
242     * Lightning color (guint, default -1 [white]) -> specular (lighting-color)
244     TODO: use the alpha channel to calculate the lightning color (but do we really need a lightning color here?)
245 */
247 class SpecularLight : public Inkscape::Extension::Internal::Filter::Filter {
248 protected:
249         virtual gchar const * get_filter_text (Inkscape::Extension::Extension * ext);
251 public:
252         SpecularLight ( ) : Filter() { };
253         virtual ~SpecularLight ( ) { if (_filter != NULL) g_free((void *)_filter); return; }
255         static void init (void) {
256                 Inkscape::Extension::build_from_mem(
257                         "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
258                                 "<name>" N_("Specular light, custom (ABCs)") "</name>\n"
259                                 "<id>org.inkscape.effect.filter.specularlight</id>\n"
260                 "<param name=\"smooth\" gui-text=\"" N_("Smoothness:") "\" type=\"float\" min=\"0.0\" max=\"10\">6</param>\n"
261                 "<param name=\"bright\" gui-text=\"" N_("Brightness:") "\" type=\"float\" min=\"0.0\" max=\"5\">1</param>\n"
262                 "<param name=\"elevation\" gui-text=\"" N_("Elevation:") "\" type=\"int\" min=\"0\" max=\"360\">45</param>\n"
263                 "<param name=\"azimuth\" gui-text=\"" N_("Azimuth:") "\" type=\"int\" min=\"0\" max=\"360\">235</param>\n"
264                 "<param name=\"color\" gui-text=\"" N_("Lightning color") "\" type=\"color\">-1</param>\n"
265                                 "<effect>\n"
266                                         "<object-type>all</object-type>\n"
267                                         "<effects-menu>\n"
268                                                 "<submenu name=\"" N_("Filters") "\">\n"
269                                                 "<submenu name=\"" N_("Experimental") "\"/>\n"
270                               "</submenu>\n"
271                                         "</effects-menu>\n"
272                                         "<menu-tip>" N_("Basic specular bevel to use for building textures") "</menu-tip>\n"
273                                 "</effect>\n"
274                         "</inkscape-extension>\n", new SpecularLight());
275         };
277 };
279 gchar const *
280 SpecularLight::get_filter_text (Inkscape::Extension::Extension * ext)
282         if (_filter != NULL) g_free((void *)_filter);
284     std::ostringstream smooth;
285     std::ostringstream bright;
286     std::ostringstream elevation;
287     std::ostringstream azimuth;
288     std::ostringstream r;
289     std::ostringstream g;
290     std::ostringstream b;
291     std::ostringstream a;
293     smooth << ext->get_param_float("smooth");
294     bright << ext->get_param_float("bright");
295     elevation << ext->get_param_int("elevation");
296     azimuth << ext->get_param_int("azimuth");
297     guint32 color = ext->get_param_color("color");
299     r << ((color >> 24) & 0xff);
300     g << ((color >> 16) & 0xff);
301     b << ((color >>  8) & 0xff);
302     a << (color & 0xff) / 255.0F;
303     
304         _filter = g_strdup_printf(
305                 "<filter xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" color-interpolation-filters=\"sRGB\" inkscape:label=\"Specular light, custom\">\n"
306         "<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"%s\" result=\"blur\" />\n"
307         "<feSpecularLighting in=\"blur\" specularExponent=\"25\" specularConstant=\"%s\" surfaceScale=\"10\" lighting-color=\"rgb(%s,%s,%s)\" result=\"specular\">\n"
308            "<feDistantLight elevation=\"%s\" azimuth=\"%s\" />\n"
309         "</feSpecularLighting>\n"
310         "<feComposite in=\"specular\" in2=\"SourceGraphic\" k3=\"1\" k2=\"%s\" operator=\"arithmetic\" result=\"composite1\" />\n"
311         "<feComposite in=\"composite1\" in2=\"SourceAlpha\" operator=\"in\" result=\"composite2\" />\n"
312         "</filter>\n", smooth.str().c_str(), bright.str().c_str(), r.str().c_str(), g.str().c_str(), b.str().c_str(), elevation.str().c_str(), azimuth.str().c_str(), a.str().c_str());
314         return _filter;
315 }; /* SpecularLight filter */
318 }; /* namespace Filter */
319 }; /* namespace Internal */
320 }; /* namespace Extension */
321 }; /* namespace Inkscape */
323 /* Change the 'COLOR' below to be your file name */
324 #endif /* __INKSCAPE_EXTENSION_INTERNAL_FILTER_ABC_H__ */