// SPDX-License-Identifier: GPL-2.0-or-later #ifndef SEEN_INKSCAPE_EXTENSION_INTERNAL_FILTER_BLURS_H__ #define SEEN_INKSCAPE_EXTENSION_INTERNAL_FILTER_BLURS_H__ /* Change the 'BLURS' above to be your file name */ /* * Copyright (C) 2011 Authors: * Ivan Louette (filters) * Nicolas Dufour (UI) * * Blur filters * Blur * Clean edges * Cross blur * Feather * Out of focus * * Released under GNU GPL v2+, read the file 'COPYING' for more information. */ /* ^^^ Change the copyright to be you and your e-mail address ^^^ */ #include "filter.h" #include "extension/internal/clear-n_.h" #include "extension/system.h" #include "extension/extension.h" namespace Inkscape { namespace Extension { namespace Internal { namespace Filter { /** \brief Custom predefined Blur filter. Simple horizontal and vertical blur Filter's parameters: * Horizontal blur (0.01->100., default 2) -> blur (stdDeviation) * Vertical blur (0.01->100., default 2) -> blur (stdDeviation) * Blur content only (boolean, default false) -> */ class Blur : public Inkscape::Extension::Internal::Filter::Filter { protected: gchar const * get_filter_text (Inkscape::Extension::Extension * ext) override; public: Blur ( ) : Filter() { }; ~Blur ( ) override { if (_filter != nullptr) g_free((void *)_filter); return; } static void init () { // clang-format off Inkscape::Extension::build_from_mem( "\n" "" N_("Blur") "\n" "org.inkscape.effect.filter.Blur\n" "2\n" "2\n" "false\n" "\n" "all\n" "\n" "\n" "\n" "\n" "\n" "" N_("Simple vertical and horizontal blur effect") "\n" "\n" "\n", new Blur()); // clang-format on }; }; gchar const * Blur::get_filter_text (Inkscape::Extension::Extension * ext) { if (_filter != nullptr) g_free((void *)_filter); std::ostringstream bbox; std::ostringstream hblur; std::ostringstream vblur; std::ostringstream content; hblur << ext->get_param_float("hblur"); vblur << ext->get_param_float("vblur"); if (ext->get_param_bool("content")) { bbox << "height=\"1\" width=\"1\" y=\"0\" x=\"0\""; content << "\n" << "\n"; } else { bbox << "" ; content << "" ; } // clang-format off _filter = g_strdup_printf( "\n" "\n" "%s" "\n", bbox.str().c_str(), hblur.str().c_str(), vblur.str().c_str(), content.str().c_str() ); // clang-format on return _filter; }; /* Blur filter */ /** \brief Custom predefined Clean edges filter. Removes or decreases glows and jaggeries around objects edges after applying some filters Filter's parameters: * Strength (0.01->2., default 0.4) -> blur (stdDeviation) */ class CleanEdges : public Inkscape::Extension::Internal::Filter::Filter { protected: gchar const * get_filter_text (Inkscape::Extension::Extension * ext) override; public: CleanEdges ( ) : Filter() { }; ~CleanEdges ( ) override { if (_filter != nullptr) g_free((void *)_filter); return; } static void init () { // clang-format off Inkscape::Extension::build_from_mem( "\n" "" N_("Clean Edges") "\n" "org.inkscape.effect.filter.CleanEdges\n" "0.4\n" "\n" "all\n" "\n" "\n" "\n" "\n" "\n" "" N_("Removes or decreases glows and jaggeries around objects edges after applying some filters") "\n" "\n" "\n", new CleanEdges()); // clang-format on }; }; gchar const * CleanEdges::get_filter_text (Inkscape::Extension::Extension * ext) { if (_filter != nullptr) g_free((void *)_filter); std::ostringstream blur; blur << ext->get_param_float("blur"); // clang-format off _filter = g_strdup_printf( "\n" "\n" "\n" "\n" "\n", blur.str().c_str()); // clang-format on return _filter; }; /* CleanEdges filter */ /** \brief Custom predefined Cross blur filter. Combine vertical and horizontal blur Filter's parameters: * Brightness (0.->10., default 0) -> composite (k3) * Fading (0.->1., default 0) -> composite (k4) * Horizontal blur (0.01->20., default 5) -> blur (stdDeviation) * Vertical blur (0.01->20., default 5) -> blur (stdDeviation) * Blend mode (enum, default Darken) -> blend (mode) */ class CrossBlur : public Inkscape::Extension::Internal::Filter::Filter { protected: gchar const * get_filter_text (Inkscape::Extension::Extension * ext) override; public: CrossBlur ( ) : Filter() { }; ~CrossBlur ( ) override { if (_filter != nullptr) g_free((void *)_filter); return; } static void init () { // clang-format off Inkscape::Extension::build_from_mem( "\n" "" N_("Cross Blur") "\n" "org.inkscape.effect.filter.CrossBlur\n" "0\n" "0\n" "5\n" "5\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "all\n" "\n" "\n" "\n" "\n" "\n" "" N_("Combine vertical and horizontal blur") "\n" "\n" "\n", new CrossBlur()); // clang-format on }; }; gchar const * CrossBlur::get_filter_text (Inkscape::Extension::Extension * ext) { if (_filter != nullptr) g_free((void *)_filter); std::ostringstream bright; std::ostringstream fade; std::ostringstream hblur; std::ostringstream vblur; std::ostringstream blend; bright << ext->get_param_float("bright"); fade << ext->get_param_float("fade"); hblur << ext->get_param_float("hblur"); vblur << ext->get_param_float("vblur"); blend << ext->get_param_optiongroup("blend"); // clang-format off _filter = g_strdup_printf( "\n" "\n" "\n" "\n" "\n" "\n" "\n", bright.str().c_str(), fade.str().c_str(), hblur.str().c_str(), vblur.str().c_str(), blend.str().c_str()); // clang-format on return _filter; }; /* Cross blur filter */ /** \brief Custom predefined Feather filter. Blurred mask on the edge without altering the contents Filter's parameters: * Strength (0.01->100., default 5) -> blur (stdDeviation) */ class Feather : public Inkscape::Extension::Internal::Filter::Filter { protected: gchar const * get_filter_text (Inkscape::Extension::Extension * ext) override; public: Feather ( ) : Filter() { }; ~Feather ( ) override { if (_filter != nullptr) g_free((void *)_filter); return; } static void init () { // clang-format off Inkscape::Extension::build_from_mem( "\n" "" N_("Feather") "\n" "org.inkscape.effect.filter.Feather\n" "5\n" "\n" "all\n" "\n" "\n" "\n" "\n" "\n" "" N_("Blurred mask on the edge without altering the contents") "\n" "\n" "\n", new Feather()); // clang-format on }; }; gchar const * Feather::get_filter_text (Inkscape::Extension::Extension * ext) { if (_filter != nullptr) g_free((void *)_filter); std::ostringstream blur; blur << ext->get_param_float("blur"); // clang-format off _filter = g_strdup_printf( "\n" "\n" "\n" "\n" "\n" "\n", blur.str().c_str()); // clang-format on return _filter; }; /* Feather filter */ /** \brief Custom predefined Out of Focus filter. Blur eroded by white or transparency Filter's parameters: * Horizontal blur (0.01->10., default 3) -> blur (stdDeviation) * Vertical blur (0.01->10., default 3) -> blur (stdDeviation) * Dilatation (n-1th value, 0.->100., default 6) -> colormatrix2 (matrix) * Erosion (nth value, 0.->100., default 2) -> colormatrix2 (matrix) * Opacity (0.->1., default 1.) -> composite1 (k2) * Background color (guint, default -1) -> flood (flood-opacity, flood-color) * Blend type (enum, default normal) -> blend (mode) * Blend to background (boolean, default false) -> blend (false: in2="flood", true: in2="BackgroundImage") */ class ImageBlur : public Inkscape::Extension::Internal::Filter::Filter { protected: gchar const * get_filter_text (Inkscape::Extension::Extension * ext) override; public: ImageBlur ( ) : Filter() { }; ~ImageBlur ( ) override { if (_filter != nullptr) g_free((void *)_filter); return; } static void init () { // clang-format off Inkscape::Extension::build_from_mem( "\n" "" N_("Out of Focus") "\n" "org.inkscape.effect.filter.ImageBlur\n" "\n" "\n" "3\n" "3\n" "6\n" "2\n" "1\n" "\n" "\n" "-1\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "false\n" "\n" "\n" "\n" "all\n" "\n" "\n" "\n" "\n" "\n" "" N_("Blur eroded by white or transparency") "\n" "\n" "\n", new ImageBlur()); // clang-format on }; }; gchar const * ImageBlur::get_filter_text (Inkscape::Extension::Extension * ext) { if (_filter != nullptr) g_free((void *)_filter); std::ostringstream hblur; std::ostringstream vblur; std::ostringstream dilat; std::ostringstream erosion; std::ostringstream opacity; std::ostringstream r; std::ostringstream g; std::ostringstream b; std::ostringstream a; std::ostringstream blend; std::ostringstream background; hblur << ext->get_param_float("hblur"); vblur << ext->get_param_float("vblur"); dilat << ext->get_param_float("dilat"); erosion << -ext->get_param_float("erosion"); opacity << ext->get_param_float("opacity"); guint32 color = ext->get_param_color("color"); r << ((color >> 24) & 0xff); g << ((color >> 16) & 0xff); b << ((color >> 8) & 0xff); a << (color & 0xff) / 255.0F; blend << ext->get_param_optiongroup("blend"); if (ext->get_param_bool("background")) { background << "BackgroundImage" ; } else { background << "flood" ; } // clang-format off _filter = g_strdup_printf( "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n", a.str().c_str(), r.str().c_str(), g.str().c_str(), b.str().c_str(), hblur.str().c_str(), vblur.str().c_str(), dilat.str().c_str(), erosion.str().c_str(), background.str().c_str(), blend.str().c_str(), opacity.str().c_str()); // clang-format on return _filter; }; /* Out of Focus filter */ }; /* namespace Filter */ }; /* namespace Internal */ }; /* namespace Extension */ }; /* namespace Inkscape */ /* Change the 'BLURS' below to be your file name */ #endif /* SEEN_INKSCAPE_EXTENSION_INTERNAL_FILTER_BLURS_H__ */