summaryrefslogtreecommitdiffstats
path: root/src/extension/internal/bitmap
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:24:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:24:48 +0000
commitcca66b9ec4e494c1d919bff0f71a820d8afab1fa (patch)
tree146f39ded1c938019e1ed42d30923c2ac9e86789 /src/extension/internal/bitmap
parentInitial commit. (diff)
downloadinkscape-cca66b9ec4e494c1d919bff0f71a820d8afab1fa.tar.xz
inkscape-cca66b9ec4e494c1d919bff0f71a820d8afab1fa.zip
Adding upstream version 1.2.2.upstream/1.2.2upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--src/extension/internal/bitmap/adaptiveThreshold.cpp60
-rw-r--r--src/extension/internal/bitmap/adaptiveThreshold.h32
-rw-r--r--src/extension/internal/bitmap/addNoise.cpp71
-rw-r--r--src/extension/internal/bitmap/addNoise.h30
-rw-r--r--src/extension/internal/bitmap/blur.cpp58
-rw-r--r--src/extension/internal/bitmap/blur.h31
-rw-r--r--src/extension/internal/bitmap/channel.cpp77
-rw-r--r--src/extension/internal/bitmap/channel.h32
-rw-r--r--src/extension/internal/bitmap/charcoal.cpp58
-rw-r--r--src/extension/internal/bitmap/charcoal.h31
-rw-r--r--src/extension/internal/bitmap/colorize.cpp69
-rw-r--r--src/extension/internal/bitmap/colorize.h34
-rw-r--r--src/extension/internal/bitmap/contrast.cpp59
-rw-r--r--src/extension/internal/bitmap/contrast.h30
-rw-r--r--src/extension/internal/bitmap/crop.cpp89
-rw-r--r--src/extension/internal/bitmap/crop.h35
-rw-r--r--src/extension/internal/bitmap/cycleColormap.cpp56
-rw-r--r--src/extension/internal/bitmap/cycleColormap.h29
-rw-r--r--src/extension/internal/bitmap/despeckle.cpp54
-rw-r--r--src/extension/internal/bitmap/despeckle.h27
-rw-r--r--src/extension/internal/bitmap/edge.cpp56
-rw-r--r--src/extension/internal/bitmap/edge.h29
-rw-r--r--src/extension/internal/bitmap/emboss.cpp58
-rw-r--r--src/extension/internal/bitmap/emboss.h31
-rw-r--r--src/extension/internal/bitmap/enhance.cpp53
-rw-r--r--src/extension/internal/bitmap/enhance.h28
-rw-r--r--src/extension/internal/bitmap/equalize.cpp53
-rw-r--r--src/extension/internal/bitmap/equalize.h28
-rw-r--r--src/extension/internal/bitmap/gaussianBlur.cpp58
-rw-r--r--src/extension/internal/bitmap/gaussianBlur.h31
-rw-r--r--src/extension/internal/bitmap/imagemagick.cpp255
-rw-r--r--src/extension/internal/bitmap/imagemagick.h49
-rw-r--r--src/extension/internal/bitmap/implode.cpp56
-rw-r--r--src/extension/internal/bitmap/implode.h30
-rw-r--r--src/extension/internal/bitmap/level.cpp62
-rw-r--r--src/extension/internal/bitmap/level.h32
-rw-r--r--src/extension/internal/bitmap/levelChannel.cpp84
-rw-r--r--src/extension/internal/bitmap/levelChannel.h33
-rw-r--r--src/extension/internal/bitmap/medianFilter.cpp56
-rw-r--r--src/extension/internal/bitmap/medianFilter.h30
-rw-r--r--src/extension/internal/bitmap/modulate.cpp61
-rw-r--r--src/extension/internal/bitmap/modulate.h32
-rw-r--r--src/extension/internal/bitmap/negate.cpp54
-rw-r--r--src/extension/internal/bitmap/negate.h28
-rw-r--r--src/extension/internal/bitmap/normalize.cpp54
-rw-r--r--src/extension/internal/bitmap/normalize.h28
-rw-r--r--src/extension/internal/bitmap/oilPaint.cpp56
-rw-r--r--src/extension/internal/bitmap/oilPaint.h30
-rw-r--r--src/extension/internal/bitmap/opacity.cpp57
-rw-r--r--src/extension/internal/bitmap/opacity.h30
-rw-r--r--src/extension/internal/bitmap/raise.cpp61
-rw-r--r--src/extension/internal/bitmap/raise.h32
-rw-r--r--src/extension/internal/bitmap/reduceNoise.cpp59
-rw-r--r--src/extension/internal/bitmap/reduceNoise.h30
-rw-r--r--src/extension/internal/bitmap/sample.cpp59
-rw-r--r--src/extension/internal/bitmap/sample.h31
-rw-r--r--src/extension/internal/bitmap/shade.cpp61
-rw-r--r--src/extension/internal/bitmap/shade.h32
-rw-r--r--src/extension/internal/bitmap/sharpen.cpp58
-rw-r--r--src/extension/internal/bitmap/sharpen.h31
-rw-r--r--src/extension/internal/bitmap/solarize.cpp58
-rw-r--r--src/extension/internal/bitmap/solarize.h30
-rw-r--r--src/extension/internal/bitmap/spread.cpp56
-rw-r--r--src/extension/internal/bitmap/spread.h30
-rw-r--r--src/extension/internal/bitmap/swirl.cpp56
-rw-r--r--src/extension/internal/bitmap/swirl.h30
-rw-r--r--src/extension/internal/bitmap/threshold.cpp57
-rw-r--r--src/extension/internal/bitmap/threshold.h30
-rw-r--r--src/extension/internal/bitmap/unsharpmask.cpp63
-rw-r--r--src/extension/internal/bitmap/unsharpmask.h33
-rw-r--r--src/extension/internal/bitmap/wave.cpp58
-rw-r--r--src/extension/internal/bitmap/wave.h31
72 files changed, 3490 insertions, 0 deletions
diff --git a/src/extension/internal/bitmap/adaptiveThreshold.cpp b/src/extension/internal/bitmap/adaptiveThreshold.cpp
new file mode 100644
index 0000000..7c85d84
--- /dev/null
+++ b/src/extension/internal/bitmap/adaptiveThreshold.cpp
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "adaptiveThreshold.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+AdaptiveThreshold::applyEffect(Magick::Image *image) {
+ image->adaptiveThreshold(_width, _height);
+}
+
+void
+AdaptiveThreshold::refreshParameters(Inkscape::Extension::Effect *module) {
+ _width = module->get_param_int("width");
+ _height = module->get_param_int("height");
+ _offset = module->get_param_int("offset");
+}
+
+#include "../clear-n_.h"
+
+void
+AdaptiveThreshold::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Adaptive Threshold") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.adaptiveThreshold</id>\n"
+ "<param name=\"width\" gui-text=\"" N_("Width:") "\" type=\"int\" min=\"-100\" max=\"100\">5</param>\n"
+ "<param name=\"height\" gui-text=\"" N_("Height:") "\" type=\"int\" min=\"-100\" max=\"100\">5</param>\n"
+ "<param name=\"offset\" gui-text=\"" N_("Offset:") "\" type=\"int\" min=\"0\" max=\"100\">0</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Apply adaptive thresholding to selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new AdaptiveThreshold());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/adaptiveThreshold.h b/src/extension/internal/bitmap/adaptiveThreshold.h
new file mode 100644
index 0000000..066f13b
--- /dev/null
+++ b/src/extension/internal/bitmap/adaptiveThreshold.h
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class AdaptiveThreshold : public ImageMagick
+{
+private:
+ unsigned int _width;
+ unsigned int _height;
+ unsigned _offset;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init ();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/addNoise.cpp b/src/extension/internal/bitmap/addNoise.cpp
new file mode 100644
index 0000000..0bedb3c
--- /dev/null
+++ b/src/extension/internal/bitmap/addNoise.cpp
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "addNoise.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+AddNoise::applyEffect(Magick::Image *image) {
+ Magick::NoiseType noiseType = Magick::UniformNoise;
+ if (!strcmp(_noiseTypeName, "Uniform Noise")) noiseType = Magick::UniformNoise;
+ else if (!strcmp(_noiseTypeName, "Gaussian Noise")) noiseType = Magick::GaussianNoise;
+ else if (!strcmp(_noiseTypeName, "Multiplicative Gaussian Noise")) noiseType = Magick::MultiplicativeGaussianNoise;
+ else if (!strcmp(_noiseTypeName, "Impulse Noise")) noiseType = Magick::ImpulseNoise;
+ else if (!strcmp(_noiseTypeName, "Laplacian Noise")) noiseType = Magick::LaplacianNoise;
+ else if (!strcmp(_noiseTypeName, "Poisson Noise")) noiseType = Magick::PoissonNoise;
+
+ image->addNoise(noiseType);
+}
+
+void
+AddNoise::refreshParameters(Inkscape::Extension::Effect *module) {
+ _noiseTypeName = module->get_param_optiongroup("noiseType");
+}
+
+#include "../clear-n_.h"
+
+void
+AddNoise::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Add Noise") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.addNoise</id>\n"
+ "<param name=\"noiseType\" gui-text=\"" N_("Type:") "\" type=\"optiongroup\" appearance=\"combo\" >\n"
+ "<option value='Uniform Noise'>" N_("Uniform Noise") "</option>\n"
+ "<option value='Gaussian Noise'>" N_("Gaussian Noise") "</option>\n"
+ "<option value='Multiplicative Gaussian Noise'>" N_("Multiplicative Gaussian Noise") "</option>\n"
+ "<option value='Impulse Noise'>" N_("Impulse Noise") "</option>\n"
+ "<option value='Laplacian Noise'>" N_("Laplacian Noise") "</option>\n"
+ "<option value='Poisson Noise'>" N_("Poisson Noise") "</option>\n"
+ "</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Add random noise to selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new AddNoise());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/addNoise.h b/src/extension/internal/bitmap/addNoise.h
new file mode 100644
index 0000000..06ce8c3
--- /dev/null
+++ b/src/extension/internal/bitmap/addNoise.h
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class AddNoise : public ImageMagick
+{
+private:
+ const gchar* _noiseTypeName;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init ();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/blur.cpp b/src/extension/internal/bitmap/blur.cpp
new file mode 100644
index 0000000..ba9d523
--- /dev/null
+++ b/src/extension/internal/bitmap/blur.cpp
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "blur.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Blur::applyEffect(Magick::Image *image) {
+ image->blur(_radius, _sigma);
+}
+
+void
+Blur::refreshParameters(Inkscape::Extension::Effect *module) {
+ _radius = module->get_param_float("radius");
+ _sigma = module->get_param_float("sigma");
+}
+
+#include "../clear-n_.h"
+
+void
+Blur::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Blur") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.blur</id>\n"
+ "<param name=\"radius\" gui-text=\"" N_("Radius:") "\" type=\"float\" min=\"0\" max=\"100\">1</param>\n"
+ "<param name=\"sigma\" gui-text=\"" N_("Sigma:") "\" type=\"float\" min=\"0\" max=\"100\">0.5</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Blur selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Blur());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/blur.h b/src/extension/internal/bitmap/blur.h
new file mode 100644
index 0000000..0ed158a
--- /dev/null
+++ b/src/extension/internal/bitmap/blur.h
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Blur : public ImageMagick
+{
+private:
+ double _radius;
+ double _sigma;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/channel.cpp b/src/extension/internal/bitmap/channel.cpp
new file mode 100644
index 0000000..38ba8f1
--- /dev/null
+++ b/src/extension/internal/bitmap/channel.cpp
@@ -0,0 +1,77 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "channel.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Channel::applyEffect(Magick::Image *image) {
+ Magick::ChannelType layer = Magick::UndefinedChannel;
+ if (!strcmp(_layerName, "Red Channel")) layer = Magick::RedChannel;
+ else if (!strcmp(_layerName, "Green Channel")) layer = Magick::GreenChannel;
+ else if (!strcmp(_layerName, "Blue Channel")) layer = Magick::BlueChannel;
+ else if (!strcmp(_layerName, "Cyan Channel")) layer = Magick::CyanChannel;
+ else if (!strcmp(_layerName, "Magenta Channel")) layer = Magick::MagentaChannel;
+ else if (!strcmp(_layerName, "Yellow Channel")) layer = Magick::YellowChannel;
+ else if (!strcmp(_layerName, "Black Channel")) layer = Magick::BlackChannel;
+ else if (!strcmp(_layerName, "Opacity Channel")) layer = Magick::OpacityChannel;
+ else if (!strcmp(_layerName, "Matte Channel")) layer = Magick::MatteChannel;
+
+ image->channel(layer);
+}
+
+void
+Channel::refreshParameters(Inkscape::Extension::Effect *module) {
+ _layerName = module->get_param_optiongroup("layer");
+}
+
+#include "../clear-n_.h"
+
+void
+Channel::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Channel") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.channel</id>\n"
+ "<param name=\"layer\" gui-text=\"" N_("Layer:") "\" type=\"optiongroup\" appearance=\"combo\" >\n"
+ "<option value='Red Channel'>" N_("Red Channel") "</option>\n"
+ "<option value='Green Channel'>" N_("Green Channel") "</option>\n"
+ "<option value='Blue Channel'>" N_("Blue Channel") "</option>\n"
+ "<option value='Cyan Channel'>" N_("Cyan Channel") "</option>\n"
+ "<option value='Magenta Channel'>" N_("Magenta Channel") "</option>\n"
+ "<option value='Yellow Channel'>" N_("Yellow Channel") "</option>\n"
+ "<option value='Black Channel'>" N_("Black Channel") "</option>\n"
+ "<option value='Opacity Channel'>" N_("Opacity Channel") "</option>\n"
+ "<option value='Matte Channel'>" N_("Matte Channel") "</option>\n"
+ "</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Extract specific channel from image") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Channel());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/channel.h b/src/extension/internal/bitmap/channel.h
new file mode 100644
index 0000000..e215344
--- /dev/null
+++ b/src/extension/internal/bitmap/channel.h
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Channel : public ImageMagick {
+
+private:
+ const gchar * _layerName;
+
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+
+ static void init ();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/charcoal.cpp b/src/extension/internal/bitmap/charcoal.cpp
new file mode 100644
index 0000000..6343399
--- /dev/null
+++ b/src/extension/internal/bitmap/charcoal.cpp
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "charcoal.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Charcoal::applyEffect(Magick::Image* image) {
+ image->charcoal(_radius, _sigma);
+}
+
+void
+Charcoal::refreshParameters(Inkscape::Extension::Effect* module) {
+ _radius = module->get_param_float("radius");
+ _sigma = module->get_param_float("sigma");
+}
+
+#include "../clear-n_.h"
+
+void
+Charcoal::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Charcoal") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.charcoal</id>\n"
+ "<param name=\"radius\" gui-text=\"" N_("Radius:") "\" type=\"float\" min=\"0\" max=\"100\">1</param>\n"
+ "<param name=\"sigma\" gui-text=\"" N_("Sigma:") "\" type=\"float\" min=\"0\" max=\"100\">0.5</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Apply charcoal stylization to selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Charcoal());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/charcoal.h b/src/extension/internal/bitmap/charcoal.h
new file mode 100644
index 0000000..da381d9
--- /dev/null
+++ b/src/extension/internal/bitmap/charcoal.h
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Charcoal : public ImageMagick
+{
+private:
+ double _radius;
+ double _sigma;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/colorize.cpp b/src/extension/internal/bitmap/colorize.cpp
new file mode 100644
index 0000000..ea9d748
--- /dev/null
+++ b/src/extension/internal/bitmap/colorize.cpp
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Copyright (C) 2007 Authors
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "colorize.h"
+
+#include "color.h"
+
+#include <iostream>
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Colorize::applyEffect(Magick::Image *image) {
+ float r = ((_color >> 24) & 0xff) / 255.0F;
+ float g = ((_color >> 16) & 0xff) / 255.0F;
+ float b = ((_color >> 8) & 0xff) / 255.0F;
+ float a = ((_color ) & 0xff) / 255.0F;
+
+ Magick::ColorRGB mc(r,g,b);
+
+ image->colorize(a * 100, mc);
+}
+
+void
+Colorize::refreshParameters(Inkscape::Extension::Effect *module) {
+ _color = module->get_param_color("color");
+}
+
+#include "../clear-n_.h"
+
+void
+Colorize::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Colorize") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.colorize</id>\n"
+ "<param name=\"color\" gui-text=\"" N_("Color") "\" type=\"color\">0</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Colorize selected bitmap(s) with specified color, using given opacity") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Colorize());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/colorize.h b/src/extension/internal/bitmap/colorize.h
new file mode 100644
index 0000000..7c16ef5
--- /dev/null
+++ b/src/extension/internal/bitmap/colorize.h
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Copyright (C) 2007 Authors
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Colorize : public ImageMagick {
+private:
+ unsigned int _opacity;
+ guint32 _color;
+
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+
+ static void init ();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/contrast.cpp b/src/extension/internal/bitmap/contrast.cpp
new file mode 100644
index 0000000..2f43923
--- /dev/null
+++ b/src/extension/internal/bitmap/contrast.cpp
@@ -0,0 +1,59 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "contrast.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Contrast::applyEffect(Magick::Image *image) {
+ // the contrast method's argument seems to be binary, so we perform it multiple times
+ // to get the desired level of effect
+ for (unsigned int i = 0; i < _sharpen; i ++)
+ image->contrast(1);
+}
+
+void
+Contrast::refreshParameters(Inkscape::Extension::Effect *module) {
+ _sharpen = module->get_param_int("sharpen");
+}
+
+#include "../clear-n_.h"
+
+void
+Contrast::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Contrast") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.contrast</id>\n"
+ "<param name=\"sharpen\" gui-text=\"" N_("Adjust:") "\" type=\"int\" min=\"0\" max=\"10\">0</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Increase or decrease contrast in bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Contrast());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/contrast.h b/src/extension/internal/bitmap/contrast.h
new file mode 100644
index 0000000..c0e95e4
--- /dev/null
+++ b/src/extension/internal/bitmap/contrast.h
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Contrast : public ImageMagick
+{
+private:
+ unsigned int _sharpen;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/crop.cpp b/src/extension/internal/bitmap/crop.cpp
new file mode 100644
index 0000000..785c32a
--- /dev/null
+++ b/src/extension/internal/bitmap/crop.cpp
@@ -0,0 +1,89 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2011 Authors:
+ * Nicolas Dufour <nicoduf@yahoo.fr>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "2geom/transforms.h"
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "crop.h"
+#include "selection-chemistry.h"
+#include "object/sp-item.h"
+#include "object/sp-item-transform.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Crop::applyEffect(Magick::Image *image) {
+ int width = image->baseColumns() - (_left + _right);
+ int height = image->baseRows() - (_top + _bottom);
+ if (width > 0 and height > 0) {
+ image->crop(Magick::Geometry(width, height, _left, _top, false, false));
+ image->page("+0+0");
+ }
+}
+
+void
+Crop::postEffect(Magick::Image *image, SPItem *item) {
+
+ // Scale bbox
+ Geom::Scale scale (0,0);
+ scale = Geom::Scale(image->columns() / (double) image->baseColumns(),
+ image->rows() / (double) image->baseRows());
+ item->scale_rel(scale);
+
+ // Translate proportionaly to the image/bbox ratio
+ Geom::OptRect bbox(item->desktopGeometricBounds());
+ //g_warning("bbox. W:%f, H:%f, X:%f, Y:%f", bbox->dimensions()[Geom::X], bbox->dimensions()[Geom::Y], bbox->min()[Geom::X], bbox->min()[Geom::Y]);
+
+ Geom::Translate translate (0,0);
+ translate = Geom::Translate(((_left - _right) / 2.0) * (bbox->dimensions()[Geom::X] / (double) image->columns()),
+ ((_bottom - _top) / 2.0) * (bbox->dimensions()[Geom::Y] / (double) image->rows()));
+ item->move_rel(translate);
+}
+
+void
+Crop::refreshParameters(Inkscape::Extension::Effect *module) {
+ _top = module->get_param_int("top");
+ _bottom = module->get_param_int("bottom");
+ _left = module->get_param_int("left");
+ _right = module->get_param_int("right");
+}
+
+#include "../clear-n_.h"
+
+void
+Crop::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Crop") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.crop</id>\n"
+ "<param name=\"top\" gui-text=\"" N_("Top (px):") "\" type=\"int\" min=\"0\" max=\"100000\">0</param>\n"
+ "<param name=\"bottom\" gui-text=\"" N_("Bottom (px):") "\" type=\"int\" min=\"0\" max=\"100000\">0</param>\n"
+ "<param name=\"left\" gui-text=\"" N_("Left (px):") "\" type=\"int\" min=\"0\" max=\"100000\">0</param>\n"
+ "<param name=\"right\" gui-text=\"" N_("Right (px):") "\" type=\"int\" min=\"0\" max=\"100000\">0</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Crop selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Crop());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/crop.h b/src/extension/internal/bitmap/crop.h
new file mode 100644
index 0000000..da53878
--- /dev/null
+++ b/src/extension/internal/bitmap/crop.h
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2010 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ * Nicolas Dufour <nicoduf@yahoo.fr>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Crop : public ImageMagick
+{
+private:
+ int _top;
+ int _bottom;
+ int _left;
+ int _right;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void postEffect(Magick::Image *image, SPItem *item) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init ();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/cycleColormap.cpp b/src/extension/internal/bitmap/cycleColormap.cpp
new file mode 100644
index 0000000..c28e5e6
--- /dev/null
+++ b/src/extension/internal/bitmap/cycleColormap.cpp
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "cycleColormap.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+CycleColormap::applyEffect(Magick::Image *image) {
+ image->cycleColormap(_amount);
+}
+
+void
+CycleColormap::refreshParameters(Inkscape::Extension::Effect *module) {
+ _amount = module->get_param_int("amount");
+}
+
+#include "../clear-n_.h"
+
+void
+CycleColormap::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Cycle Colormap") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.cycleColormap</id>\n"
+ "<param name=\"amount\" gui-text=\"" N_("Amount:") "\" type=\"int\" min=\"0\" max=\"360\">180</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Cycle colormap(s) of selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new CycleColormap());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/cycleColormap.h b/src/extension/internal/bitmap/cycleColormap.h
new file mode 100644
index 0000000..0d66b15
--- /dev/null
+++ b/src/extension/internal/bitmap/cycleColormap.h
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class CycleColormap : public ImageMagick {
+private:
+ int _amount;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init ();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/despeckle.cpp b/src/extension/internal/bitmap/despeckle.cpp
new file mode 100644
index 0000000..46a1baf
--- /dev/null
+++ b/src/extension/internal/bitmap/despeckle.cpp
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "despeckle.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Despeckle::applyEffect(Magick::Image *image) {
+ image->despeckle();
+}
+
+void
+Despeckle::refreshParameters(Inkscape::Extension::Effect */*module*/) {
+}
+
+#include "../clear-n_.h"
+
+void
+Despeckle::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Despeckle") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.despeckle</id>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Reduce speckle noise of selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Despeckle());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/despeckle.h b/src/extension/internal/bitmap/despeckle.h
new file mode 100644
index 0000000..0c731ee
--- /dev/null
+++ b/src/extension/internal/bitmap/despeckle.h
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Despeckle : public ImageMagick {
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init ();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/edge.cpp b/src/extension/internal/bitmap/edge.cpp
new file mode 100644
index 0000000..93b7394
--- /dev/null
+++ b/src/extension/internal/bitmap/edge.cpp
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "edge.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Edge::applyEffect(Magick::Image *image) {
+ image->edge(_radius);
+}
+
+void
+Edge::refreshParameters(Inkscape::Extension::Effect *module) {
+ _radius = module->get_param_int("radius");
+}
+
+#include "../clear-n_.h"
+
+void
+Edge::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Edge") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.edge</id>\n"
+ "<param name=\"radius\" gui-text=\"" N_("Radius:") "\" type=\"int\" min=\"0\" max=\"100\">0</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Highlight edges of selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Edge());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/edge.h b/src/extension/internal/bitmap/edge.h
new file mode 100644
index 0000000..2c5fe14
--- /dev/null
+++ b/src/extension/internal/bitmap/edge.h
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Edge : public ImageMagick {
+private:
+ unsigned int _radius;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init ();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/emboss.cpp b/src/extension/internal/bitmap/emboss.cpp
new file mode 100644
index 0000000..86988c9
--- /dev/null
+++ b/src/extension/internal/bitmap/emboss.cpp
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "emboss.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Emboss::applyEffect(Magick::Image *image) {
+ image->emboss(_radius, _sigma);
+}
+
+void
+Emboss::refreshParameters(Inkscape::Extension::Effect *module) {
+ _radius = module->get_param_float("radius");
+ _sigma = module->get_param_float("sigma");
+}
+
+#include "../clear-n_.h"
+
+void
+Emboss::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Emboss") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.emboss</id>\n"
+ "<param name=\"radius\" gui-text=\"" N_("Radius:") "\" type=\"float\" min=\"0\" max=\"100\">1.0</param>\n"
+ "<param name=\"sigma\" gui-text=\"" N_("Sigma:") "\" type=\"float\" min=\"-50\" max=\"50\">0.5</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Emboss selected bitmap(s); highlight edges with 3D effect") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Emboss());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/emboss.h b/src/extension/internal/bitmap/emboss.h
new file mode 100644
index 0000000..51d04d6
--- /dev/null
+++ b/src/extension/internal/bitmap/emboss.h
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Emboss : public ImageMagick
+{
+private:
+ double _radius;
+ double _sigma;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init ();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/enhance.cpp b/src/extension/internal/bitmap/enhance.cpp
new file mode 100644
index 0000000..391d1f1
--- /dev/null
+++ b/src/extension/internal/bitmap/enhance.cpp
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "enhance.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Enhance::applyEffect(Magick::Image *image) {
+ image->enhance();
+}
+
+void
+Enhance::refreshParameters(Inkscape::Extension::Effect */*module*/) { }
+
+#include "../clear-n_.h"
+
+void
+Enhance::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Enhance") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.enhance</id>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Enhance selected bitmap(s); minimize noise") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Enhance());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/enhance.h b/src/extension/internal/bitmap/enhance.h
new file mode 100644
index 0000000..dd3d9ff
--- /dev/null
+++ b/src/extension/internal/bitmap/enhance.h
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Enhance : public ImageMagick
+{
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init ();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/equalize.cpp b/src/extension/internal/bitmap/equalize.cpp
new file mode 100644
index 0000000..df0575e
--- /dev/null
+++ b/src/extension/internal/bitmap/equalize.cpp
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "equalize.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Equalize::applyEffect(Magick::Image *image) {
+ image->equalize();
+}
+
+void
+Equalize::refreshParameters(Inkscape::Extension::Effect */*module*/) { }
+
+#include "../clear-n_.h"
+
+void
+Equalize::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Equalize") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.equalize</id>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Equalize selected bitmap(s); histogram equalization") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Equalize());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/equalize.h b/src/extension/internal/bitmap/equalize.h
new file mode 100644
index 0000000..8259ffb
--- /dev/null
+++ b/src/extension/internal/bitmap/equalize.h
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Equalize : public ImageMagick
+{
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init ();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/gaussianBlur.cpp b/src/extension/internal/bitmap/gaussianBlur.cpp
new file mode 100644
index 0000000..1b8396b
--- /dev/null
+++ b/src/extension/internal/bitmap/gaussianBlur.cpp
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "gaussianBlur.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+GaussianBlur::applyEffect(Magick::Image* image) {
+ image->gaussianBlur(_width, _sigma);
+}
+
+void
+GaussianBlur::refreshParameters(Inkscape::Extension::Effect* module) {
+ _width = module->get_param_float("width");
+ _sigma = module->get_param_float("sigma");
+}
+
+#include "../clear-n_.h"
+
+void
+GaussianBlur::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Gaussian Blur") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.gaussianBlur</id>\n"
+ "<param name=\"width\" gui-text=\"" N_("Factor:") "\" type=\"float\" min=\"0\" max=\"100\">5.0</param>\n"
+ "<param name=\"sigma\" gui-text=\"" N_("Sigma:") "\" type=\"float\" min=\"0\" max=\"100\">5.0</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Gaussian blur selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new GaussianBlur());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/gaussianBlur.h b/src/extension/internal/bitmap/gaussianBlur.h
new file mode 100644
index 0000000..9c9c500
--- /dev/null
+++ b/src/extension/internal/bitmap/gaussianBlur.h
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class GaussianBlur : public ImageMagick
+{
+private:
+ double _width;
+ double _sigma;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/imagemagick.cpp b/src/extension/internal/bitmap/imagemagick.cpp
new file mode 100644
index 0000000..36176bc
--- /dev/null
+++ b/src/extension/internal/bitmap/imagemagick.cpp
@@ -0,0 +1,255 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Copyright (C) 2007 Authors
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include <libintl.h>
+
+#include <gtkmm/box.h>
+#include <gtkmm/adjustment.h>
+#include <gtkmm/spinbutton.h>
+
+#include <glib/gstdio.h>
+
+#include "desktop.h"
+
+#include "selection.h"
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "imagemagick.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class ImageMagickDocCache: public Inkscape::Extension::Implementation::ImplementationDocumentCache {
+ friend class ImageMagick;
+private:
+ void readImage(char const *xlink, char const *id, Magick::Image *image);
+protected:
+ Inkscape::XML::Node** _nodes;
+
+ Magick::Image** _images;
+ int _imageCount;
+ char** _caches;
+ unsigned* _cacheLengths;
+ const char** _originals;
+ SPItem** _imageItems;
+public:
+ ImageMagickDocCache(Inkscape::UI::View::View * view);
+ ~ImageMagickDocCache ( ) override;
+};
+
+ImageMagickDocCache::ImageMagickDocCache(Inkscape::UI::View::View * view) :
+ Inkscape::Extension::Implementation::ImplementationDocumentCache(view),
+ _nodes(NULL),
+ _images(NULL),
+ _imageCount(0),
+ _caches(NULL),
+ _cacheLengths(NULL),
+ _originals(NULL),
+ _imageItems(NULL)
+{
+ SPDesktop *desktop = (SPDesktop*)view;
+ auto selectedItemList = desktop->selection->items();
+ int selectCount = (int) boost::distance(selectedItemList);
+
+ // Init the data-holders
+ _nodes = new Inkscape::XML::Node*[selectCount];
+ _originals = new const char*[selectCount];
+ _caches = new char*[selectCount];
+ _cacheLengths = new unsigned int[selectCount];
+ _images = new Magick::Image*[selectCount];
+ _imageCount = 0;
+ _imageItems = new SPItem*[selectCount];
+
+ // Loop through selected items
+ for (auto i = selectedItemList.begin(); i != selectedItemList.end(); ++i) {
+ SPItem *item = *i;
+ Inkscape::XML::Node *node = reinterpret_cast<Inkscape::XML::Node *>(item->getRepr());
+ if (!strcmp(node->name(), "image") || !strcmp(node->name(), "svg:image"))
+ {
+ _nodes[_imageCount] = node;
+ char const *xlink = node->attribute("xlink:href");
+ char const *id = node->attribute("id");
+ _originals[_imageCount] = xlink;
+ _caches[_imageCount] = (char*)"";
+ _cacheLengths[_imageCount] = 0;
+ _images[_imageCount] = new Magick::Image();
+ readImage(xlink, id, _images[_imageCount]);
+ _imageItems[_imageCount] = item;
+ _imageCount++;
+ }
+ }
+}
+
+ImageMagickDocCache::~ImageMagickDocCache ( ) {
+ if (_nodes)
+ delete _nodes;
+ if (_originals)
+ delete _originals;
+ if (_caches)
+ delete _caches;
+ if (_cacheLengths)
+ delete _cacheLengths;
+ if (_images)
+ delete _images;
+ if (_imageItems)
+ delete _imageItems;
+ return;
+}
+
+void
+ImageMagickDocCache::readImage(const char *xlink, const char *id, Magick::Image *image)
+{
+ // Find if the xlink:href is base64 data, i.e. if the image is embedded
+ gchar *search = g_strndup(xlink, 30);
+ if (strstr(search, "base64") != (char*)NULL) {
+ // 7 = strlen("base64") + strlen(",")
+ const char* pureBase64 = strstr(xlink, "base64") + 7;
+ Magick::Blob blob;
+ blob.base64(pureBase64);
+ try {
+ image->read(blob);
+ } catch (Magick::Exception &error_) {
+ g_warning("ImageMagick could not read '%s'\nDetails: %s", id, error_.what());
+ }
+ } else {
+ gchar *path;
+ if (strncmp (xlink,"file:", 5) == 0) {
+ path = g_filename_from_uri(xlink, NULL, NULL);
+ } else {
+ path = g_strdup(xlink);
+ }
+ try {
+ image->read(path);
+ } catch (Magick::Exception &error_) {
+ g_warning("ImageMagick could not read '%s' from '%s'\nDetails: %s", id, path, error_.what());
+ }
+ g_free(path);
+ }
+ g_free(search);
+}
+
+bool
+ImageMagick::load(Inkscape::Extension::Extension */*module*/)
+{
+ return true;
+}
+
+Inkscape::Extension::Implementation::ImplementationDocumentCache *
+ImageMagick::newDocCache (Inkscape::Extension::Extension * /*ext*/, Inkscape::UI::View::View * view) {
+ return new ImageMagickDocCache(view);
+}
+
+void
+ImageMagick::effect (Inkscape::Extension::Effect *module, Inkscape::UI::View::View *document, Inkscape::Extension::Implementation::ImplementationDocumentCache * docCache)
+{
+ refreshParameters(module);
+
+ if (docCache == NULL) { // should never happen
+ docCache = newDocCache(module, document);
+ }
+ ImageMagickDocCache * dc = dynamic_cast<ImageMagickDocCache *>(docCache);
+ if (dc == NULL) { // should really never happen
+ printf("AHHHHHHHHH!!!!!");
+ exit(1);
+ }
+
+ for (int i = 0; i < dc->_imageCount; i++)
+ {
+ try
+ {
+ Magick::Image effectedImage = *dc->_images[i]; // make a copy
+
+ applyEffect(&effectedImage);
+
+ // postEffect can be used to change things on the item itself
+ // e.g. resize the image element, after the effecti is applied
+ postEffect(&effectedImage, dc->_imageItems[i]);
+
+// dc->_nodes[i]->setAttribute("xlink:href", dc->_caches[i]);
+
+ Magick::Blob *blob = new Magick::Blob();
+ effectedImage.write(blob);
+
+ std::string raw_string = blob->base64();
+ const int raw_len = raw_string.length();
+ const char *raw_i = raw_string.c_str();
+
+ unsigned new_len = (int)(raw_len * (77.0 / 76.0) + 100);
+ if (new_len > dc->_cacheLengths[i]) {
+ dc->_cacheLengths[i] = (int)(new_len * 1.2);
+ dc->_caches[i] = new char[dc->_cacheLengths[i]];
+ }
+ char *formatted_i = dc->_caches[i];
+ const char *src;
+
+ for (src = "data:image/"; *src; )
+ *formatted_i++ = *src++;
+ for (src = effectedImage.magick().c_str(); *src ; )
+ *formatted_i++ = *src++;
+ for (src = ";base64, \n" ; *src; )
+ *formatted_i++ = *src++;
+
+ int col = 0;
+ while (*raw_i) {
+ *formatted_i++ = *raw_i++;
+ if (col++ > 76) {
+ *formatted_i++ = '\n';
+ col = 0;
+ }
+ }
+ if (col) {
+ *formatted_i++ = '\n';
+ }
+ *formatted_i = '\0';
+
+ dc->_nodes[i]->setAttribute("xlink:href", dc->_caches[i]);
+ dc->_nodes[i]->removeAttribute("sodipodi:absref");
+ delete blob;
+ }
+ catch (Magick::Exception &error_) {
+ printf("Caught exception: %s \n", error_.what());
+ }
+
+ //while(Gtk::Main::events_pending()) {
+ // Gtk::Main::iteration();
+ //}
+ }
+}
+
+/** \brief A function to get the preferences for the grid
+ \param module Module which holds the params
+ \param view Unused today - may get style information in the future.
+
+ Uses AutoGUI for creating the GUI.
+*/
+Gtk::Widget *
+ImageMagick::prefs_effect(Inkscape::Extension::Effect *module, Inkscape::UI::View::View * view, sigc::signal<void> * changeSignal, Inkscape::Extension::Implementation::ImplementationDocumentCache * /*docCache*/)
+{
+ SPDocument * current_document = view->doc();
+
+ auto selected = ((SPDesktop *) view)->getSelection()->items();
+ Inkscape::XML::Node * first_select = NULL;
+ if (!selected.empty()) {
+ first_select = (selected.front())->getRepr();
+ }
+
+ return module->autogui(current_document, first_select, changeSignal);
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/imagemagick.h b/src/extension/internal/bitmap/imagemagick.h
new file mode 100644
index 0000000..754e195
--- /dev/null
+++ b/src/extension/internal/bitmap/imagemagick.h
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#ifndef INKSCAPE_EXTENSION_INTERNAL_BITMAP_IMAGEMAGICK_H
+#define INKSCAPE_EXTENSION_INTERNAL_BITMAP_IMAGEMAGICK_H
+
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/implementation/implementation.h"
+
+class SPItem;
+
+namespace Magick {
+class Image;
+}
+
+namespace Inkscape {
+namespace Extension {
+
+class Effect;
+class Extension;
+
+namespace Internal {
+namespace Bitmap {
+
+class ImageMagick : public Inkscape::Extension::Implementation::Implementation {
+public:
+ /* Functions to be implemented by subclasses */
+ virtual void applyEffect(Magick::Image */*image*/) { };
+ virtual void refreshParameters(Inkscape::Extension::Effect */*module*/) { };
+ virtual void postEffect(Magick::Image */*image*/, SPItem */*item*/) { };
+
+ /* Functions implemented from ::Implementation */
+ bool load(Inkscape::Extension::Extension *module) override;
+ Inkscape::Extension::Implementation::ImplementationDocumentCache * newDocCache (Inkscape::Extension::Extension * ext, Inkscape::UI::View::View * doc) override;
+ void effect(Inkscape::Extension::Effect *module, Inkscape::UI::View::View *document, Inkscape::Extension::Implementation::ImplementationDocumentCache * docCache) override;
+ Gtk::Widget* prefs_effect(Inkscape::Extension::Effect *module, Inkscape::UI::View::View * view, sigc::signal<void> * changeSignal, Inkscape::Extension::Implementation::ImplementationDocumentCache * docCache) override;
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
+
+#endif // INKSCAPE_EXTENSION_INTERNAL_BITMAP_IMAGEMAGICK_H
diff --git a/src/extension/internal/bitmap/implode.cpp b/src/extension/internal/bitmap/implode.cpp
new file mode 100644
index 0000000..4395e2a
--- /dev/null
+++ b/src/extension/internal/bitmap/implode.cpp
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "implode.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Implode::applyEffect(Magick::Image* image) {
+ image->implode(_factor);
+}
+
+void
+Implode::refreshParameters(Inkscape::Extension::Effect* module) {
+ _factor = module->get_param_float("factor");
+}
+
+#include "../clear-n_.h"
+
+void
+Implode::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Implode") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.implode</id>\n"
+ "<param name=\"factor\" gui-text=\"" N_("Factor:") "\" type=\"float\" min=\"0\" max=\"100\">10</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Implode selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Implode());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/implode.h b/src/extension/internal/bitmap/implode.h
new file mode 100644
index 0000000..d9c5adb
--- /dev/null
+++ b/src/extension/internal/bitmap/implode.h
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Implode : public ImageMagick
+{
+private:
+ float _factor;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/level.cpp b/src/extension/internal/bitmap/level.cpp
new file mode 100644
index 0000000..cf31744
--- /dev/null
+++ b/src/extension/internal/bitmap/level.cpp
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "level.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Level::applyEffect(Magick::Image* image) {
+ Magick::Quantum black_point = Magick::Color::scaleDoubleToQuantum(_black_point / 100.0);
+ Magick::Quantum white_point = Magick::Color::scaleDoubleToQuantum(_white_point / 100.0);
+ image->level(black_point, white_point, _mid_point);
+}
+
+void
+Level::refreshParameters(Inkscape::Extension::Effect* module) {
+ _black_point = module->get_param_float("blackPoint");
+ _white_point = module->get_param_float("whitePoint");
+ _mid_point = module->get_param_float("midPoint");
+}
+
+#include "../clear-n_.h"
+
+void
+Level::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Level") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.level</id>\n"
+ "<param name=\"blackPoint\" gui-text=\"" N_("Black Point:") "\" type=\"float\" min=\"0\" max=\"100\">0</param>\n"
+ "<param name=\"whitePoint\" gui-text=\"" N_("White Point:") "\" type=\"float\" min=\"0\" max=\"100\">100</param>\n"
+ "<param name=\"midPoint\" gui-text=\"" N_("Gamma Correction:") "\" type=\"float\" min=\"0\" max=\"10\">1</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Level selected bitmap(s) by scaling values falling between the given ranges to the full color range") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Level());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/level.h b/src/extension/internal/bitmap/level.h
new file mode 100644
index 0000000..a09f189
--- /dev/null
+++ b/src/extension/internal/bitmap/level.h
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Level : public ImageMagick
+{
+private:
+ double _black_point;
+ double _white_point;
+ double _mid_point;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/levelChannel.cpp b/src/extension/internal/bitmap/levelChannel.cpp
new file mode 100644
index 0000000..7280fb1
--- /dev/null
+++ b/src/extension/internal/bitmap/levelChannel.cpp
@@ -0,0 +1,84 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "levelChannel.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+LevelChannel::applyEffect(Magick::Image* image) {
+ Magick::ChannelType channel = Magick::UndefinedChannel;
+ if (!strcmp(_channelName, "Red Channel")) channel = Magick::RedChannel;
+ else if (!strcmp(_channelName, "Green Channel")) channel = Magick::GreenChannel;
+ else if (!strcmp(_channelName, "Blue Channel")) channel = Magick::BlueChannel;
+ else if (!strcmp(_channelName, "Cyan Channel")) channel = Magick::CyanChannel;
+ else if (!strcmp(_channelName, "Magenta Channel")) channel = Magick::MagentaChannel;
+ else if (!strcmp(_channelName, "Yellow Channel")) channel = Magick::YellowChannel;
+ else if (!strcmp(_channelName, "Black Channel")) channel = Magick::BlackChannel;
+ else if (!strcmp(_channelName, "Opacity Channel")) channel = Magick::OpacityChannel;
+ else if (!strcmp(_channelName, "Matte Channel")) channel = Magick::MatteChannel;
+ Magick::Quantum black_point = Magick::Color::scaleDoubleToQuantum(_black_point / 100.0);
+ Magick::Quantum white_point = Magick::Color::scaleDoubleToQuantum(_white_point / 100.0);
+ image->levelChannel(channel, black_point, white_point, _mid_point);
+}
+
+void
+LevelChannel::refreshParameters(Inkscape::Extension::Effect* module) {
+ _channelName = module->get_param_optiongroup("channel");
+ _black_point = module->get_param_float("blackPoint");
+ _white_point = module->get_param_float("whitePoint");
+ _mid_point = module->get_param_float("midPoint");
+}
+
+#include "../clear-n_.h"
+
+void
+LevelChannel::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Level (with Channel)") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.levelChannel</id>\n"
+ "<param name=\"channel\" gui-text=\"" N_("Channel:") "\" type=\"optiongroup\" appearance=\"combo\" >\n"
+ "<option value='Red Channel'>" N_("Red Channel") "</option>\n"
+ "<option value='Green Channel'>" N_("Green Channel") "</option>\n"
+ "<option value='Blue Channel'>" N_("Blue Channel") "</option>\n"
+ "<option value='Cyan Channel'>" N_("Cyan Channel") "</option>\n"
+ "<option value='Magenta Channel'>" N_("Magenta Channel") "</option>\n"
+ "<option value='Yellow Channel'>" N_("Yellow Channel") "</option>\n"
+ "<option value='Black Channel'>" N_("Black Channel") "</option>\n"
+ "<option value='Opacity Channel'>" N_("Opacity Channel") "</option>\n"
+ "<option value='Matte Channel'>" N_("Matte Channel") "</option>\n"
+ "</param>\n"
+ "<param name=\"blackPoint\" gui-text=\"" N_("Black Point:") "\" type=\"float\" min=\"0.0\" max=\"100.0\">0.0</param>\n"
+ "<param name=\"whitePoint\" gui-text=\"" N_("White Point:") "\" type=\"float\" min=\"0.0\" max=\"100.0\">100.0</param>\n"
+ "<param name=\"midPoint\" gui-text=\"" N_("Gamma Correction:") "\" type=\"float\" min=\"0.0\" max=\"10.0\">1.0</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Level the specified channel of selected bitmap(s) by scaling values falling between the given ranges to the full color range") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new LevelChannel());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/levelChannel.h b/src/extension/internal/bitmap/levelChannel.h
new file mode 100644
index 0000000..d1cc82a
--- /dev/null
+++ b/src/extension/internal/bitmap/levelChannel.h
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class LevelChannel : public ImageMagick
+{
+private:
+ double _black_point;
+ double _white_point;
+ double _mid_point;
+ const gchar * _channelName;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/medianFilter.cpp b/src/extension/internal/bitmap/medianFilter.cpp
new file mode 100644
index 0000000..80385ac
--- /dev/null
+++ b/src/extension/internal/bitmap/medianFilter.cpp
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "medianFilter.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+MedianFilter::applyEffect(Magick::Image* image) {
+ image->medianFilter(_radius);
+}
+
+void
+MedianFilter::refreshParameters(Inkscape::Extension::Effect* module) {
+ _radius = module->get_param_float("radius");
+}
+
+#include "../clear-n_.h"
+
+void
+MedianFilter::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Median") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.medianFilter</id>\n"
+ "<param name=\"radius\" gui-text=\"" N_("Radius:") "\" type=\"float\" min=\"0\" max=\"100\">0</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Replace each pixel component with the median color in a circular neighborhood") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new MedianFilter());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/medianFilter.h b/src/extension/internal/bitmap/medianFilter.h
new file mode 100644
index 0000000..214ed2b
--- /dev/null
+++ b/src/extension/internal/bitmap/medianFilter.h
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class MedianFilter : public ImageMagick
+{
+private:
+ double _radius;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/modulate.cpp b/src/extension/internal/bitmap/modulate.cpp
new file mode 100644
index 0000000..a570da4
--- /dev/null
+++ b/src/extension/internal/bitmap/modulate.cpp
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "modulate.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Modulate::applyEffect(Magick::Image* image) {
+ double hue = (_hue * 200 / 360.0) + 100;
+ image->modulate(_brightness, _saturation, hue);
+}
+
+void
+Modulate::refreshParameters(Inkscape::Extension::Effect* module) {
+ _brightness = module->get_param_float("brightness");
+ _saturation = module->get_param_float("saturation");
+ _hue = module->get_param_float("hue");
+}
+
+#include "../clear-n_.h"
+
+void
+Modulate::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("HSB Adjust") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.modulate</id>\n"
+ "<param name=\"hue\" gui-text=\"" N_("Hue:") "\" type=\"float\" min=\"-360\" max=\"360\">0</param>\n"
+ "<param name=\"saturation\" gui-text=\"" N_("Saturation:") "\" type=\"float\" min=\"0\" max=\"200\">100</param>\n"
+ "<param name=\"brightness\" gui-text=\"" N_("Brightness:") "\" type=\"float\" min=\"0\" max=\"200\">100</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Adjust the amount of hue, saturation, and brightness in selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Modulate());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/modulate.h b/src/extension/internal/bitmap/modulate.h
new file mode 100644
index 0000000..327d3c4
--- /dev/null
+++ b/src/extension/internal/bitmap/modulate.h
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Modulate : public ImageMagick
+{
+private:
+ double _brightness;
+ double _saturation;
+ double _hue;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/negate.cpp b/src/extension/internal/bitmap/negate.cpp
new file mode 100644
index 0000000..6470556
--- /dev/null
+++ b/src/extension/internal/bitmap/negate.cpp
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "negate.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Negate::applyEffect(Magick::Image* image) {
+ image->negate();
+}
+
+void
+Negate::refreshParameters(Inkscape::Extension::Effect* /*module*/) {
+}
+
+#include "../clear-n_.h"
+
+void
+Negate::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Negate") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.negate</id>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Negate (take inverse) selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Negate());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/negate.h b/src/extension/internal/bitmap/negate.h
new file mode 100644
index 0000000..4cde402
--- /dev/null
+++ b/src/extension/internal/bitmap/negate.h
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Negate : public ImageMagick
+{
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/normalize.cpp b/src/extension/internal/bitmap/normalize.cpp
new file mode 100644
index 0000000..96cfe13
--- /dev/null
+++ b/src/extension/internal/bitmap/normalize.cpp
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "normalize.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Normalize::applyEffect(Magick::Image* image) {
+ image->normalize();
+}
+
+void
+Normalize::refreshParameters(Inkscape::Extension::Effect* /*module*/) {
+}
+
+#include "../clear-n_.h"
+
+void
+Normalize::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Normalize") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.normalize</id>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Normalize selected bitmap(s), expanding color range to the full possible range of color") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Normalize());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/normalize.h b/src/extension/internal/bitmap/normalize.h
new file mode 100644
index 0000000..2d4a9c2
--- /dev/null
+++ b/src/extension/internal/bitmap/normalize.h
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Normalize : public ImageMagick
+{
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/oilPaint.cpp b/src/extension/internal/bitmap/oilPaint.cpp
new file mode 100644
index 0000000..ee17964
--- /dev/null
+++ b/src/extension/internal/bitmap/oilPaint.cpp
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "oilPaint.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+OilPaint::applyEffect(Magick::Image* image) {
+ image->oilPaint(_radius);
+}
+
+void
+OilPaint::refreshParameters(Inkscape::Extension::Effect* module) {
+ _radius = module->get_param_int("radius");
+}
+
+#include "../clear-n_.h"
+
+void
+OilPaint::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Oil Paint") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.oilPaint</id>\n"
+ "<param name=\"radius\" gui-text=\"" N_("Radius:") "\" type=\"int\" min=\"0\" max=\"50\">3</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Stylize selected bitmap(s) so that they appear to be painted with oils") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new OilPaint());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/oilPaint.h b/src/extension/internal/bitmap/oilPaint.h
new file mode 100644
index 0000000..58b94b2
--- /dev/null
+++ b/src/extension/internal/bitmap/oilPaint.h
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class OilPaint : public ImageMagick
+{
+private:
+ int _radius;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/opacity.cpp b/src/extension/internal/bitmap/opacity.cpp
new file mode 100644
index 0000000..024dcb9
--- /dev/null
+++ b/src/extension/internal/bitmap/opacity.cpp
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "opacity.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Opacity::applyEffect(Magick::Image* image) {
+ Magick::Quantum opacity = Magick::Color::scaleDoubleToQuantum((100 - _opacity) / 100.0);
+ image->opacity(opacity);
+}
+
+void
+Opacity::refreshParameters(Inkscape::Extension::Effect* module) {
+ _opacity = module->get_param_float("opacity");
+}
+
+#include "../clear-n_.h"
+
+void
+Opacity::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Opacity") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.opacity</id>\n"
+ "<param name=\"opacity\" gui-text=\"" N_("Opacity:") "\" type=\"float\" min=\"0.0\" max=\"100.0\">80.0</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Modify opacity channel(s) of selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Opacity());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/opacity.h b/src/extension/internal/bitmap/opacity.h
new file mode 100644
index 0000000..e8cb548
--- /dev/null
+++ b/src/extension/internal/bitmap/opacity.h
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Opacity : public ImageMagick
+{
+private:
+ double _opacity;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/raise.cpp b/src/extension/internal/bitmap/raise.cpp
new file mode 100644
index 0000000..e209f2d
--- /dev/null
+++ b/src/extension/internal/bitmap/raise.cpp
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "raise.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Raise::applyEffect(Magick::Image* image) {
+ Magick::Geometry geometry(_width, _height, 0, 0);
+ image->raise(geometry, _raisedFlag);
+}
+
+void
+Raise::refreshParameters(Inkscape::Extension::Effect* module) {
+ _width = module->get_param_int("width");
+ _height = module->get_param_int("height");
+ _raisedFlag = module->get_param_bool("raisedFlag");
+}
+
+#include "../clear-n_.h"
+
+void
+Raise::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Raise") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.raise</id>\n"
+ "<param name=\"width\" gui-text=\"" N_("Width:") "\" type=\"int\" min=\"0\" max=\"800\">6</param>\n"
+ "<param name=\"height\" gui-text=\"" N_("Height:") "\" type=\"int\" min=\"0\" max=\"800\">6</param>\n"
+ "<param name=\"raisedFlag\" gui-text=\"" N_("Raised") "\" type=\"bool\">false</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Alter lightness the edges of selected bitmap(s) to create a raised appearance") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Raise());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/raise.h b/src/extension/internal/bitmap/raise.h
new file mode 100644
index 0000000..90023fb
--- /dev/null
+++ b/src/extension/internal/bitmap/raise.h
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Raise : public ImageMagick
+{
+private:
+ int _width;
+ int _height;
+ bool _raisedFlag;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/reduceNoise.cpp b/src/extension/internal/bitmap/reduceNoise.cpp
new file mode 100644
index 0000000..e1e5e83
--- /dev/null
+++ b/src/extension/internal/bitmap/reduceNoise.cpp
@@ -0,0 +1,59 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "reduceNoise.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+ReduceNoise::applyEffect(Magick::Image* image) {
+ if (_order > -1)
+ image->reduceNoise(_order);
+ else
+ image->reduceNoise();
+}
+
+void
+ReduceNoise::refreshParameters(Inkscape::Extension::Effect* module) {
+ _order = module->get_param_int("order");
+}
+
+#include "../clear-n_.h"
+
+void
+ReduceNoise::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Reduce Noise") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.reduceNoise</id>\n"
+ "<param name=\"order\" gui-text=\"" N_("Order:") "\" type=\"int\" min=\"-1\" max=\"100\">-1</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Reduce noise in selected bitmap(s) using a noise peak elimination filter") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new ReduceNoise());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/reduceNoise.h b/src/extension/internal/bitmap/reduceNoise.h
new file mode 100644
index 0000000..3c9d2d6
--- /dev/null
+++ b/src/extension/internal/bitmap/reduceNoise.h
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class ReduceNoise : public ImageMagick
+{
+private:
+ int _order;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/sample.cpp b/src/extension/internal/bitmap/sample.cpp
new file mode 100644
index 0000000..47b0147
--- /dev/null
+++ b/src/extension/internal/bitmap/sample.cpp
@@ -0,0 +1,59 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "sample.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Sample::applyEffect(Magick::Image* image) {
+ Magick::Geometry geometry(_width, _height, 0, 0);
+ image->sample(geometry);
+}
+
+void
+Sample::refreshParameters(Inkscape::Extension::Effect* module) {
+ _width = module->get_param_int("width");
+ _height = module->get_param_int("height");
+}
+
+#include "../clear-n_.h"
+
+void
+Sample::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Resample") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.sample</id>\n"
+ "<param name=\"width\" gui-text=\"" N_("Width:") "\" type=\"int\" min=\"0\" max=\"6400\">100</param>\n"
+ "<param name=\"height\" gui-text=\"" N_("Height:") "\" type=\"int\" min=\"0\" max=\"6400\">100</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Alter the resolution of selected image by resizing it to the given pixel size") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Sample());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/sample.h b/src/extension/internal/bitmap/sample.h
new file mode 100644
index 0000000..c93ab0a
--- /dev/null
+++ b/src/extension/internal/bitmap/sample.h
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Sample : public ImageMagick
+{
+private:
+ int _width;
+ int _height;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/shade.cpp b/src/extension/internal/bitmap/shade.cpp
new file mode 100644
index 0000000..4a4f907
--- /dev/null
+++ b/src/extension/internal/bitmap/shade.cpp
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "shade.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Shade::applyEffect(Magick::Image* image) {
+ image->shade(_azimuth, _elevation, !_colorShading);
+ // I don't know why, but I have to invert colorShading here
+}
+
+void
+Shade::refreshParameters(Inkscape::Extension::Effect* module) {
+ _azimuth = module->get_param_float("azimuth");
+ _elevation = module->get_param_float("elevation");
+ _colorShading = module->get_param_bool("colorShading");
+}
+
+#include "../clear-n_.h"
+
+void
+Shade::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Shade") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.shade</id>\n"
+ "<param name=\"azimuth\" gui-text=\"" N_("Azimuth:") "\" type=\"float\" min=\"-180\" max=\"180\">30</param>\n"
+ "<param name=\"elevation\" gui-text=\"" N_("Elevation:") "\" type=\"float\" min=\"-180\" max=\"180\">30</param>\n"
+ "<param name=\"colorShading\" gui-text=\"" N_("Colored Shading") "\" type=\"bool\">false</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Shade selected bitmap(s) simulating distant light source") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Shade());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/shade.h b/src/extension/internal/bitmap/shade.h
new file mode 100644
index 0000000..928dc87
--- /dev/null
+++ b/src/extension/internal/bitmap/shade.h
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Shade : public ImageMagick
+{
+private:
+ double _azimuth;
+ double _elevation;
+ bool _colorShading;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/sharpen.cpp b/src/extension/internal/bitmap/sharpen.cpp
new file mode 100644
index 0000000..40e159c
--- /dev/null
+++ b/src/extension/internal/bitmap/sharpen.cpp
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "sharpen.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Sharpen::applyEffect(Magick::Image* image) {
+ image->sharpen(_radius, _sigma);
+}
+
+void
+Sharpen::refreshParameters(Inkscape::Extension::Effect* module) {
+ _radius = module->get_param_float("radius");
+ _sigma = module->get_param_float("sigma");
+}
+
+#include "../clear-n_.h"
+
+void
+Sharpen::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Sharpen") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.sharpen</id>\n"
+ "<param name=\"radius\" gui-text=\"" N_("Radius:") "\" type=\"float\" min=\"0\" max=\"50\">1.0</param>\n"
+ "<param name=\"sigma\" gui-text=\"" N_("Sigma:") "\" type=\"float\" min=\"0\" max=\"10\">0.5</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Sharpen selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Sharpen());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/sharpen.h b/src/extension/internal/bitmap/sharpen.h
new file mode 100644
index 0000000..6bbae73
--- /dev/null
+++ b/src/extension/internal/bitmap/sharpen.h
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Sharpen : public ImageMagick
+{
+private:
+ double _radius;
+ double _sigma;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/solarize.cpp b/src/extension/internal/bitmap/solarize.cpp
new file mode 100644
index 0000000..41952d8
--- /dev/null
+++ b/src/extension/internal/bitmap/solarize.cpp
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "solarize.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Solarize::applyEffect(Magick::Image* image) {
+ // Image Magick Quantum depth = 16
+ // 655.35 = (2^16 - 1) / 100
+ image->solarize(_factor * 655.35);
+}
+
+void
+Solarize::refreshParameters(Inkscape::Extension::Effect* module) {
+ _factor = module->get_param_float("factor");
+}
+
+#include "../clear-n_.h"
+
+void
+Solarize::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Solarize") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.solarize</id>\n"
+ "<param name=\"factor\" gui-text=\"" N_("Factor:") "\" type=\"float\" min=\"0\" max=\"100\">50</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Solarize selected bitmap(s), like overexposing photographic film") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Solarize());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/solarize.h b/src/extension/internal/bitmap/solarize.h
new file mode 100644
index 0000000..0e6bbea
--- /dev/null
+++ b/src/extension/internal/bitmap/solarize.h
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Solarize : public ImageMagick
+{
+private:
+ double _factor;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/spread.cpp b/src/extension/internal/bitmap/spread.cpp
new file mode 100644
index 0000000..cb7aa5d
--- /dev/null
+++ b/src/extension/internal/bitmap/spread.cpp
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "spread.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Spread::applyEffect(Magick::Image* image) {
+ image->spread(_amount);
+}
+
+void
+Spread::refreshParameters(Inkscape::Extension::Effect* module) {
+ _amount = module->get_param_int("amount");
+}
+
+#include "../clear-n_.h"
+
+void
+Spread::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Dither") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.spread</id>\n"
+ "<param name=\"amount\" gui-text=\"" N_("Amount:") "\" type=\"int\" min=\"0\" max=\"100\">3</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Randomly scatter pixels in selected bitmap(s), within the given radius of the original position") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Spread());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/spread.h b/src/extension/internal/bitmap/spread.h
new file mode 100644
index 0000000..ad77544
--- /dev/null
+++ b/src/extension/internal/bitmap/spread.h
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Spread : public ImageMagick
+{
+private:
+ int _amount;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/swirl.cpp b/src/extension/internal/bitmap/swirl.cpp
new file mode 100644
index 0000000..50dc75d
--- /dev/null
+++ b/src/extension/internal/bitmap/swirl.cpp
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "swirl.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Swirl::applyEffect(Magick::Image* image) {
+ image->swirl(_degrees);
+}
+
+void
+Swirl::refreshParameters(Inkscape::Extension::Effect* module) {
+ _degrees = module->get_param_int("degrees");
+}
+
+#include "../clear-n_.h"
+
+void
+Swirl::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Swirl") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.swirl</id>\n"
+ "<param name=\"degrees\" gui-text=\"" N_("Degrees:") "\" type=\"int\" min=\"-360\" max=\"360\">30</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Swirl selected bitmap(s) around center point") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Swirl());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/swirl.h b/src/extension/internal/bitmap/swirl.h
new file mode 100644
index 0000000..d95c0c9
--- /dev/null
+++ b/src/extension/internal/bitmap/swirl.h
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Swirl : public ImageMagick
+{
+private:
+ int _degrees;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/threshold.cpp b/src/extension/internal/bitmap/threshold.cpp
new file mode 100644
index 0000000..235cf48
--- /dev/null
+++ b/src/extension/internal/bitmap/threshold.cpp
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "threshold.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Threshold::applyEffect(Magick::Image* image) {
+ image->threshold(_threshold);
+}
+
+void
+Threshold::refreshParameters(Inkscape::Extension::Effect* module) {
+ _threshold = module->get_param_float("threshold");
+}
+
+#include "../clear-n_.h"
+
+void
+Threshold::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ // TRANSLATORS: see http://docs.gimp.org/en/gimp-tool-threshold.html
+ "<name>" N_("Threshold") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.threshold</id>\n"
+ "<param name=\"threshold\" gui-text=\"" N_("Threshold:") "\" type=\"float\" min=\"-100.0\" max=\"100.0\"></param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Threshold selected bitmap(s)") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Threshold());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/threshold.h b/src/extension/internal/bitmap/threshold.h
new file mode 100644
index 0000000..93e15bc
--- /dev/null
+++ b/src/extension/internal/bitmap/threshold.h
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Threshold : public ImageMagick
+{
+private:
+ double _threshold;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/unsharpmask.cpp b/src/extension/internal/bitmap/unsharpmask.cpp
new file mode 100644
index 0000000..73940d7
--- /dev/null
+++ b/src/extension/internal/bitmap/unsharpmask.cpp
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "unsharpmask.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Unsharpmask::applyEffect(Magick::Image* image) {
+ double amount = _amount / 100.0;
+ image->unsharpmask(_radius, _sigma, amount, _threshold);
+}
+
+void
+Unsharpmask::refreshParameters(Inkscape::Extension::Effect* module) {
+ _radius = module->get_param_float("radius");
+ _sigma = module->get_param_float("sigma");
+ _amount = module->get_param_float("amount");
+ _threshold = module->get_param_float("threshold");
+}
+
+#include "../clear-n_.h"
+
+void
+Unsharpmask::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Unsharp Mask") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.unsharpmask</id>\n"
+ "<param name=\"radius\" gui-text=\"" N_("Radius:") "\" type=\"float\" min=\"0.0\" max=\"50.0\">5.0</param>\n"
+ "<param name=\"sigma\" gui-text=\"" N_("Sigma:") "\" type=\"float\" min=\"0.0\" max=\"50.0\">5.0</param>\n"
+ "<param name=\"amount\" gui-text=\"" N_("Amount:") "\" type=\"float\" min=\"0.0\" max=\"100.0\">50.0</param>\n"
+ "<param name=\"threshold\" gui-text=\"" N_("Threshold:") "\" type=\"float\" min=\"0.0\" max=\"50.0\">5.0</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Sharpen selected bitmap(s) using unsharp mask algorithms") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Unsharpmask());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/unsharpmask.h b/src/extension/internal/bitmap/unsharpmask.h
new file mode 100644
index 0000000..2fb4679
--- /dev/null
+++ b/src/extension/internal/bitmap/unsharpmask.h
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Unsharpmask : public ImageMagick
+{
+private:
+ double _radius;
+ double _sigma;
+ double _amount;
+ double _threshold;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/wave.cpp b/src/extension/internal/bitmap/wave.cpp
new file mode 100644
index 0000000..80ae768
--- /dev/null
+++ b/src/extension/internal/bitmap/wave.cpp
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "extension/effect.h"
+#include "extension/system.h"
+
+#include "wave.h"
+#include <Magick++.h>
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+void
+Wave::applyEffect(Magick::Image* image) {
+ image->wave(_amplitude, _wavelength);
+}
+
+void
+Wave::refreshParameters(Inkscape::Extension::Effect* module) {
+ _amplitude = module->get_param_float("amplitude");
+ _wavelength = module->get_param_float("wavelength");
+}
+
+#include "../clear-n_.h"
+
+void
+Wave::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">\n"
+ "<name>" N_("Wave") "</name>\n"
+ "<id>org.inkscape.effect.bitmap.wave</id>\n"
+ "<param name=\"amplitude\" gui-text=\"" N_("Amplitude:") "\" type=\"float\" min=\"-720.0\" max=\"720.0\">25</param>\n"
+ "<param name=\"wavelength\" gui-text=\"" N_("Wavelength:") "\" type=\"float\" min=\"-720.0\" max=\"720.0\">150</param>\n"
+ "<effect>\n"
+ "<object-type>all</object-type>\n"
+ "<effects-menu>\n"
+ "<submenu name=\"" N_("Raster") "\" />\n"
+ "</effects-menu>\n"
+ "<menu-tip>" N_("Alter selected bitmap(s) along sine wave") "</menu-tip>\n"
+ "</effect>\n"
+ "</inkscape-extension>\n", new Wave());
+ // clang-format on
+}
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */
diff --git a/src/extension/internal/bitmap/wave.h b/src/extension/internal/bitmap/wave.h
new file mode 100644
index 0000000..65342ce
--- /dev/null
+++ b/src/extension/internal/bitmap/wave.h
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2007 Authors:
+ * Christopher Brown <audiere@gmail.com>
+ * Ted Gould <ted@gould.cx>
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "imagemagick.h"
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+namespace Bitmap {
+
+class Wave : public ImageMagick
+{
+private:
+ double _amplitude;
+ double _wavelength;
+public:
+ void applyEffect(Magick::Image *image) override;
+ void refreshParameters(Inkscape::Extension::Effect *module) override;
+ static void init();
+};
+
+}; /* namespace Bitmap */
+}; /* namespace Internal */
+}; /* namespace Extension */
+}; /* namespace Inkscape */