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.
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.
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)
136 {
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;
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.
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)
212 {
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.
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)
281 {
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;
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__ */