// SPDX-License-Identifier: GPL-2.0-or-later #ifndef SEEN_INKSCAPE_EXTENSION_INTERNAL_FILTER_MORPHOLOGY_H__ #define SEEN_INKSCAPE_EXTENSION_INTERNAL_FILTER_MORPHOLOGY_H__ /* Change the 'MORPHOLOGY' above to be your file name */ /* * Copyright (C) 2011 Authors: * Ivan Louette (filters) * Nicolas Dufour (UI) * * Morphology filters * Cross-smooth * Outline * * 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 Cross-smooth filter. Smooth the outside of shapes and pictures. Filter's parameters: * Type (enum, default "Smooth edges") -> Inner = composite1 (operator="in") Outer = composite1 (operator="over") Open = composite1 (operator="XOR") * Width (0.01->30., default 10.) -> blur (stdDeviation) * Level (0.2->2., default 1.) -> composite2 (k2) * Dilatation (1.->100., default 10.) -> colormatrix1 (last-1 value) * Erosion (1.->100., default 1.) -> colormatrix1 (last value) * Antialiasing (0.01->1., default 1) -> blur2 (stdDeviation) * Blur content (boolean, default false) -> blend (true: in="colormatrix2", false: in="SourceGraphic") */ class Crosssmooth : public Inkscape::Extension::Internal::Filter::Filter { protected: gchar const * get_filter_text (Inkscape::Extension::Extension * ext) override; public: Crosssmooth ( ) : Filter() { }; ~Crosssmooth ( ) override { if (_filter != nullptr) g_free((void *)_filter); return; } static void init () { // clang-format off Inkscape::Extension::build_from_mem( "\n" "" N_("Cross-smooth") "\n" "org.inkscape.effect.filter.crosssmooth\n" "\n" "\n" "\n" "\n" "\n" "10\n" "1\n" "10\n" "1\n" "1\n" "false\n" "\n" "all\n" "\n" "\n" "\n" "\n" "\n" "" N_("Smooth edges and angles of shapes") "\n" "\n" "\n", new Crosssmooth()); // clang-format on }; }; gchar const * Crosssmooth::get_filter_text (Inkscape::Extension::Extension * ext) { if (_filter != nullptr) g_free((void *)_filter); std::ostringstream type; std::ostringstream width; std::ostringstream level; std::ostringstream dilat; std::ostringstream erosion; std::ostringstream antialias; std::ostringstream content; type << ext->get_param_optiongroup("type"); width << ext->get_param_float("width"); level << ext->get_param_float("level"); dilat << ext->get_param_float("dilat"); erosion << (1 - ext->get_param_float("erosion")); antialias << ext->get_param_float("antialias"); if (ext->get_param_bool("content")) { content << "colormatrix2"; } else { content << "SourceGraphic"; } // clang-format off _filter = g_strdup_printf( "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n", width.str().c_str(), type.str().c_str(), level.str().c_str(), dilat.str().c_str(), erosion.str().c_str(), antialias.str().c_str(), content.str().c_str()); // clang-format on return _filter; }; /* Cross-smooth filter */ /** \brief Custom predefined Outline filter. Adds a colorizable outline Filter's parameters: * Fill image (boolean, default false) -> true: composite2 (in="SourceGraphic"), false: composite2 (in="blur2") * Hide image (boolean, default false) -> true: composite4 (in="composite3"), false: composite4 (in="SourceGraphic") * Stroke type (enum, default over) -> composite2 (operator) * Stroke position (enum, default inside) * inside -> composite1 (operator="out", in="SourceGraphic", in2="blur1") * outside -> composite1 (operator="out", in="blur1", in2="SourceGraphic") * overlayed -> composite1 (operator="xor", in="blur1", in2="SourceGraphic") * Width 1 (0.01->20., default 4) -> blur1 (stdDeviation) * Dilatation 1 (1.->100., default 100) -> colormatrix1 (n-1th value) * Erosion 1 (0.->100., default 1) -> colormatrix1 (nth value 0->-100) * Width 2 (0.01->20., default 0.5) -> blur2 (stdDeviation) * Dilatation 2 (1.->100., default 50) -> colormatrix2 (n-1th value) * Erosion 2 (0.->100., default 5) -> colormatrix2 (nth value 0->-100) * Antialiasing (0.01->1., default 1) -> blur3 (stdDeviation) * Color (guint, default 0,0,0,255) -> flood (flood-color, flood-opacity) * Fill opacity (0.->1., default 1) -> composite5 (k2) * Stroke opacity (0.->1., default 1) -> composite5 (k3) */ class Outline : public Inkscape::Extension::Internal::Filter::Filter { protected: gchar const * get_filter_text (Inkscape::Extension::Extension * ext) override; public: Outline ( ) : Filter() { }; ~Outline ( ) override { if (_filter != nullptr) g_free((void *)_filter); return; } static void init () { // clang-format off Inkscape::Extension::build_from_mem( "\n" "" N_("Outline") "\n" "org.inkscape.effect.filter.Outline\n" "\n" "\n" "false\n" "false\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "4\n" "100\n" "1\n" "0.5\n" "50\n" "5\n" "1\n" "false\n" "\n" "\n" "255\n" "1\n" "1\n" "\n" "\n" "\n" "all\n" "\n" "\n" "\n" "\n" "\n" "" N_("Adds a colorizable outline") "\n" "\n" "\n", new Outline()); // clang-format on }; }; gchar const * Outline::get_filter_text (Inkscape::Extension::Extension * ext) { if (_filter != nullptr) g_free((void *)_filter); std::ostringstream width1; std::ostringstream dilat1; std::ostringstream erosion1; std::ostringstream width2; std::ostringstream dilat2; std::ostringstream erosion2; std::ostringstream antialias; std::ostringstream r; std::ostringstream g; std::ostringstream b; std::ostringstream a; std::ostringstream fopacity; std::ostringstream sopacity; std::ostringstream smooth; std::ostringstream c1in; std::ostringstream c1in2; std::ostringstream c1op; std::ostringstream c2in; std::ostringstream c2op; std::ostringstream c4in; width1 << ext->get_param_float("width1"); dilat1 << ext->get_param_float("dilat1"); erosion1 << (- ext->get_param_float("erosion1")); width2 << ext->get_param_float("width2"); dilat2 << ext->get_param_float("dilat2"); erosion2 << (- ext->get_param_float("erosion2")); antialias << ext->get_param_float("antialias"); guint32 color = ext->get_param_color("color"); r << ((color >> 24) & 0xff); g << ((color >> 16) & 0xff); b << ((color >> 8) & 0xff); a << (color & 0xff) / 255.0F; fopacity << ext->get_param_float("fopacity"); sopacity << ext->get_param_float("sopacity"); const gchar *position = ext->get_param_optiongroup("position"); if((g_ascii_strcasecmp("inside", position) == 0)) { // Inside c1in << "SourceGraphic"; c1in2 << "blur1"; c1op << "out"; } else if((g_ascii_strcasecmp("outside", position) == 0)) { // Outside c1in << "blur1"; c1in2 << "SourceGraphic"; c1op << "out"; } else { // Overlayed c1in << "blur1"; c1in2 << "SourceGraphic"; c1op << "xor"; } if (ext->get_param_bool("fill")) { c2in << "SourceGraphic"; } else { c2in << "blur2"; } c2op << ext->get_param_optiongroup("type"); if (ext->get_param_bool("outline")) { c4in << "composite3"; } else { c4in << "SourceGraphic"; } if (ext->get_param_bool("smooth")) { smooth << "1 0"; } else { smooth << "5 -1"; } // clang-format off _filter = g_strdup_printf( "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n", width1.str().c_str(), c1in.str().c_str(), c1in2.str().c_str(), c1op.str().c_str(), dilat1.str().c_str(), erosion1.str().c_str(), width2.str().c_str(), c2in.str().c_str(), c2op.str().c_str(), dilat2.str().c_str(), erosion2.str().c_str(), antialias.str().c_str(), smooth.str().c_str(), a.str().c_str(), r.str().c_str(), g.str().c_str(), b.str().c_str(), c4in.str().c_str(), fopacity.str().c_str(), sopacity.str().c_str() ); // clang-format on return _filter; }; /* Outline filter */ }; /* namespace Filter */ }; /* namespace Internal */ }; /* namespace Extension */ }; /* namespace Inkscape */ /* Change the 'MORPHOLOGY' below to be your file name */ #endif /* SEEN_INKSCAPE_EXTENSION_INTERNAL_FILTER_MORPHOLOGY_H__ */