Code

Filters. New custom predefined filters (all ABCs, Neon draw, Color shilf, Silhouette...
[inkscape.git] / src / extension / internal / filter / drop-shadow.h
index b19adffa23ae87e21d910ec570217968abef0498..12f0c60559a4b5e57f9a726d32226521bb2faa4c 100644 (file)
@@ -22,28 +22,30 @@ namespace Internal {
 namespace Filter {
 
 class DropShadow : public Inkscape::Extension::Internal::Filter::Filter {
-       int myvar;
 protected:
        virtual gchar const * get_filter_text (Inkscape::Extension::Extension * ext);
 
 public:
        DropShadow ( ) : Filter() { };
-       //virtual ~DropShadow ( ) { if (_filter != NULL) g_free(_filter); return; }
+       virtual ~DropShadow ( ) { if (_filter != NULL) g_free((void *)_filter); return; }
 
        static void init (void) {
                Inkscape::Extension::build_from_mem(
                        "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
                                "<name>" N_("Drop Shadow") "</name>\n"
                                "<id>org.inkscape.effect.filter.drop-shadow</id>\n"
-                               "<param name=\"blur\" gui-text=\"" N_("Amount of Blur") "\" type=\"float\" min=\"0.0\" max=\"50.0\">2.0</param>\n"
-                               "<param name=\"xoffset\" gui-text=\"" N_("Horizontal Offset") "\" type=\"float\" min=\"-50.0\" max=\"50.0\">4.0</param>\n"
-                               "<param name=\"yoffset\" gui-text=\"" N_("Vertical Offset") "\" type=\"float\" min=\"-50.0\" max=\"50.0\">4.0</param>\n"
+                               "<param name=\"blur\" gui-text=\"" N_("Blur radius (px):") "\" type=\"float\" min=\"0.0\" max=\"200.0\">2.0</param>\n"
+                               "<param name=\"opacity\" gui-text=\"" N_("Opacity (%):") "\" type=\"float\" min=\"0.0\" max=\"100.0\">50</param>\n"                             
+                               "<param name=\"xoffset\" gui-text=\"" N_("Horizontal offset (px):") "\" type=\"float\" min=\"-50.0\" max=\"50.0\">4.0</param>\n"
+                               "<param name=\"yoffset\" gui-text=\"" N_("Vertical offset (px):") "\" type=\"float\" min=\"-50.0\" max=\"50.0\">4.0</param>\n"
                                "<effect>\n"
                                        "<object-type>all</object-type>\n"
                                        "<effects-menu>\n"
-                                               "<submenu name=\"" N_("Filter") "\" />\n"
+                                               "<submenu name=\"" N_("Filters") "\" >\n"
+                                               "<submenu name=\"" N_("Shadows and Glows") "\"/>\n"
+                             "</submenu>\n"
                                        "</effects-menu>\n"
-                                       "<menu-tip>" N_("I hate text") "</menu-tip>\n"
+                                       "<menu-tip>" N_("Black, blurred drop shadow") "</menu-tip>\n"
                                "</effect>\n"
                        "</inkscape-extension>\n", new DropShadow());
        };
@@ -55,19 +57,86 @@ DropShadow::get_filter_text (Inkscape::Extension::Extension * ext)
 {
        if (_filter != NULL) g_free((void *)_filter);
 
-       float blur = ext->get_param_float("blur");
-       float x = ext->get_param_float("xoffset");
-       float y = ext->get_param_float("yoffset");
+        std::ostringstream blur;
+        std::ostringstream opacity;
+        std::ostringstream x;
+        std::ostringstream y;
+
+        blur << ext->get_param_float("blur");
+        opacity << ext->get_param_float("opacity") / 100;
+        x << ext->get_param_float("xoffset");
+        y << ext->get_param_float("yoffset");
+
+       _filter = g_strdup_printf(
+               "<filter xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" inkscape:label=\"Drop shadow\" width=\"1.5\" height=\"1.5\" x=\"-.25\" y=\"-.25\">\n"
+                       "<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"%s\" result=\"blur\"/>\n"
+                        "<feColorMatrix result=\"bluralpha\" type=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 %s 0 \" />\n"
+                       "<feOffset in=\"bluralpha\" dx=\"%s\" dy=\"%s\" result=\"offsetBlur\"/>\n"
+                       "<feMerge>\n"
+                               "<feMergeNode in=\"offsetBlur\"/>\n"
+                               "<feMergeNode in=\"SourceGraphic\"/>\n"
+                       "</feMerge>\n"
+               "</filter>\n", blur.str().c_str(), opacity.str().c_str(), x.str().c_str(), y.str().c_str());
+
+       return _filter;
+};
+
+class DropGlow : public Inkscape::Extension::Internal::Filter::Filter {
+protected:
+       virtual gchar const * get_filter_text (Inkscape::Extension::Extension * ext);
+
+public:
+       DropGlow ( ) : Filter() { };
+       virtual ~DropGlow ( ) { if (_filter != NULL) g_free((void *)_filter); return; }
+
+       static void init (void) {
+               Inkscape::Extension::build_from_mem(
+                       "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+                               "<name>" N_("Drop Glow") "</name>\n"
+                               "<id>org.inkscape.effect.filter.drop-glow</id>\n"
+                               "<param name=\"blur\" gui-text=\"" N_("Blur radius (px):") "\" type=\"float\" min=\"0.0\" max=\"200.0\">2.0</param>\n"
+                               "<param name=\"opacity\" gui-text=\"" N_("Opacity (%):") "\" type=\"float\" min=\"0.0\" max=\"100.0\">50</param>\n"                             
+                               "<param name=\"xoffset\" gui-text=\"" N_("Horizontal offset (px):") "\" type=\"float\" min=\"-50.0\" max=\"50.0\">4.0</param>\n"
+                               "<param name=\"yoffset\" gui-text=\"" N_("Vertical offset (px):") "\" type=\"float\" min=\"-50.0\" max=\"50.0\">4.0</param>\n"
+                               "<effect>\n"
+                                       "<object-type>all</object-type>\n"
+                                       "<effects-menu>\n"
+                                               "<submenu name=\"" N_("Filters") "\">\n"
+                                               "<submenu name=\"" N_("Shadows and Glows") "\"/>\n"
+                             "</submenu>\n"
+                                       "</effects-menu>\n"
+                                       "<menu-tip>" N_("White, blurred drop glow") "</menu-tip>\n"
+                               "</effect>\n"
+                       "</inkscape-extension>\n", new DropGlow());
+       };
+
+};
+
+gchar const *
+DropGlow::get_filter_text (Inkscape::Extension::Extension * ext)
+{
+       if (_filter != NULL) g_free((void *)_filter);
+
+        std::ostringstream blur;
+        std::ostringstream opacity;
+        std::ostringstream x;
+        std::ostringstream y;
+
+        blur << ext->get_param_float("blur");
+        opacity << ext->get_param_float("opacity") / 100;
+        x << ext->get_param_float("xoffset");
+        y << ext->get_param_float("yoffset");
 
        _filter = g_strdup_printf(
-               "<filter>\n"
-                       "<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"%f\" result=\"blur\"/>\n"
-                       "<feOffset in=\"blur\" dx=\"%f\" dy=\"%f\" result=\"offsetBlur\"/>\n"
+               "<filter xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" inkscape:label=\"Drop shadow\" width=\"1.5\" height=\"1.5\" x=\"-.25\" y=\"-.25\">\n"
+                       "<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"%s\" result=\"blur\"/>\n"
+                        "<feColorMatrix result=\"bluralpha\" type=\"matrix\" values=\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 %s 0 \" />\n"
+                       "<feOffset in=\"bluralpha\" dx=\"%s\" dy=\"%s\" result=\"offsetBlur\"/>\n"
                        "<feMerge>\n"
                                "<feMergeNode in=\"offsetBlur\"/>\n"
                                "<feMergeNode in=\"SourceGraphic\"/>\n"
                        "</feMerge>\n"
-               "</filter>\n", blur, x, y);
+               "</filter>\n", blur.str().c_str(), opacity.str().c_str(), x.str().c_str(), y.str().c_str());
 
        return _filter;
 };