summaryrefslogtreecommitdiffstats
path: root/src/filters
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2013-09-19 02:05:00 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2013-09-19 02:05:00 +0000
commitf6e99d7d1b76dd7a7933f55ba095bdcb534f81b3 (patch)
treecbee5d1eec2e1afe8c3f8033d528cab4504c3c49 /src/filters
parentEncapsulate the shared memory hack for Cairo and GdkPixbuf in a class (diff)
parentAdded gpl notice (diff)
downloadinkscape-f6e99d7d1b76dd7a7933f55ba095bdcb534f81b3.tar.gz
inkscape-f6e99d7d1b76dd7a7933f55ba095bdcb534f81b3.zip
Merge C++ification of the SP tree by Markus Engel
(bzr r12532)
Diffstat (limited to 'src/filters')
-rw-r--r--src/filters/blend.cpp166
-rw-r--r--src/filters/blend.h28
-rw-r--r--src/filters/colormatrix.cpp120
-rw-r--r--src/filters/colormatrix.h29
-rw-r--r--src/filters/componenttransfer-funcnode.cpp267
-rw-r--r--src/filters/componenttransfer-funcnode.h53
-rw-r--r--src/filters/componenttransfer.cpp131
-rw-r--r--src/filters/componenttransfer.h31
-rw-r--r--src/filters/composite.cpp257
-rw-r--r--src/filters/composite.h29
-rw-r--r--src/filters/convolvematrix.cpp301
-rw-r--r--src/filters/convolvematrix.h29
-rw-r--r--src/filters/diffuselighting.cpp303
-rw-r--r--src/filters/diffuselighting.h34
-rw-r--r--src/filters/displacementmap.cpp198
-rw-r--r--src/filters/displacementmap.h29
-rw-r--r--src/filters/distantlight.cpp139
-rw-r--r--src/filters/distantlight.h27
-rw-r--r--src/filters/flood.cpp146
-rw-r--r--src/filters/flood.h30
-rw-r--r--src/filters/gaussian-blur.cpp106
-rw-r--r--src/filters/gaussian-blur.h29
-rw-r--r--src/filters/image.cpp165
-rw-r--r--src/filters/image.h29
-rw-r--r--src/filters/merge.cpp99
-rw-r--r--src/filters/merge.h30
-rw-r--r--src/filters/mergenode.cpp93
-rw-r--r--src/filters/mergenode.h24
-rw-r--r--src/filters/morphology.cpp139
-rw-r--r--src/filters/morphology.h28
-rw-r--r--src/filters/offset.cpp120
-rw-r--r--src/filters/offset.h28
-rw-r--r--src/filters/pointlight.cpp178
-rw-r--r--src/filters/pointlight.h26
-rw-r--r--src/filters/specularlighting.cpp319
-rw-r--r--src/filters/specularlighting.h33
-rw-r--r--src/filters/spotlight.cpp349
-rw-r--r--src/filters/spotlight.h26
-rw-r--r--src/filters/tile.cpp92
-rw-r--r--src/filters/tile.h29
-rw-r--r--src/filters/turbulence.cpp208
-rw-r--r--src/filters/turbulence.h28
42 files changed, 1986 insertions, 2539 deletions
diff --git a/src/filters/blend.cpp b/src/filters/blend.cpp
index a43927e81..219a099d1 100644
--- a/src/filters/blend.cpp
+++ b/src/filters/blend.cpp
@@ -30,35 +30,23 @@
#include "display/nr-filter-blend.h"
#include "display/nr-filter-types.h"
-/* FeBlend base class */
-static void sp_feBlend_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feBlend_release(SPObject *object);
-static void sp_feBlend_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feBlend_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feBlend_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_feBlend_build_renderer(SPFilterPrimitive *sp_prim, Inkscape::Filters::Filter *filter);
-
-G_DEFINE_TYPE(SPFeBlend, sp_feBlend, SP_TYPE_FILTER_PRIMITIVE);
-
-static void
-sp_feBlend_class_init(SPFeBlendClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
+#include "sp-factory.h"
- sp_object_class->build = sp_feBlend_build;
- sp_object_class->release = sp_feBlend_release;
- sp_object_class->write = sp_feBlend_write;
- sp_object_class->set = sp_feBlend_set;
- sp_object_class->update = sp_feBlend_update;
+namespace {
+ SPObject* createBlend() {
+ return new SPFeBlend();
+ }
- sp_primitive_class->build_renderer = sp_feBlend_build_renderer;
+ bool blendRegistered = SPFactory::instance().registerObject("svg:feBlend", createBlend);
}
-static void
-sp_feBlend_init(SPFeBlend *feBlend)
+SPFeBlend::SPFeBlend()
+ : SPFilterPrimitive(), blend_mode(Inkscape::Filters::BLEND_NORMAL),
+ in2(Inkscape::Filters::NR_FILTER_SLOT_NOT_SET)
{
- feBlend->in2 = Inkscape::Filters::NR_FILTER_SLOT_NOT_SET;
+}
+
+SPFeBlend::~SPFeBlend() {
}
/**
@@ -66,43 +54,36 @@ sp_feBlend_init(SPFeBlend *feBlend)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feBlend_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- SPFeBlend *blend = SP_FEBLEND(object);
-
- if (((SPObjectClass *) sp_feBlend_parent_class)->build) {
- ((SPObjectClass *) sp_feBlend_parent_class)->build(object, document, repr);
- }
+void SPFeBlend::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
/*LOAD ATTRIBUTES FROM REPR HERE*/
- object->readAttr( "mode" );
- object->readAttr( "in2" );
+ this->readAttr( "mode" );
+ this->readAttr( "in2" );
/* Unlike normal in, in2 is required attribute. Make sure, we can call
* it by some name. */
- if (blend->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
- blend->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
+ if (this->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
+ this->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
{
- SPFilter *parent = SP_FILTER(object->parent);
- blend->in2 = sp_filter_primitive_name_previous_out(blend);
- repr->setAttribute("in2", sp_filter_name_for_image(parent, blend->in2));
+ SPFilter *parent = SP_FILTER(this->parent);
+ this->in2 = sp_filter_primitive_name_previous_out(this);
+ repr->setAttribute("in2", sp_filter_name_for_image(parent, this->in2));
}
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feBlend_release(SPObject *object)
-{
- if (((SPObjectClass *) sp_feBlend_parent_class)->release)
- ((SPObjectClass *) sp_feBlend_parent_class)->release(object);
+void SPFeBlend::release() {
+ SPFilterPrimitive::release();
}
-static Inkscape::Filters::FilterBlendMode sp_feBlend_readmode(gchar const *value)
-{
- if (!value) return Inkscape::Filters::BLEND_NORMAL;
+static Inkscape::Filters::FilterBlendMode sp_feBlend_readmode(gchar const *value) {
+ if (!value) {
+ return Inkscape::Filters::BLEND_NORMAL;
+ }
+
switch (value[0]) {
case 'n':
if (strncmp(value, "normal", 6) == 0)
@@ -128,103 +109,97 @@ static Inkscape::Filters::FilterBlendMode sp_feBlend_readmode(gchar const *value
// do nothing by default
break;
}
+
return Inkscape::Filters::BLEND_NORMAL;
}
/**
* Sets a specific value in the SPFeBlend.
*/
-static void
-sp_feBlend_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeBlend *feBlend = SP_FEBLEND(object);
- (void)feBlend;
-
+void SPFeBlend::set(unsigned int key, gchar const *value) {
Inkscape::Filters::FilterBlendMode mode;
int input;
+
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
case SP_ATTR_MODE:
mode = sp_feBlend_readmode(value);
- if (mode != feBlend->blend_mode) {
- feBlend->blend_mode = mode;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (mode != this->blend_mode) {
+ this->blend_mode = mode;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_IN2:
- input = sp_filter_primitive_read_in(feBlend, value);
- if (input != feBlend->in2) {
- feBlend->in2 = input;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ input = sp_filter_primitive_read_in(this, value);
+
+ if (input != this->in2) {
+ this->in2 = input;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
default:
- if (((SPObjectClass *) sp_feBlend_parent_class)->set)
- ((SPObjectClass *) sp_feBlend_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
-
}
/**
* Receives update notifications.
*/
-static void
-sp_feBlend_update(SPObject *object, SPCtx *ctx, guint flags)
-{
- SPFeBlend *blend = SP_FEBLEND(object);
-
+void SPFeBlend::update(SPCtx *ctx, guint flags) {
if (flags & SP_OBJECT_MODIFIED_FLAG) {
- object->readAttr( "mode" );
- object->readAttr( "in2" );
+ this->readAttr( "mode" );
+ this->readAttr( "in2" );
}
/* Unlike normal in, in2 is required attribute. Make sure, we can call
* it by some name. */
- if (blend->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
- blend->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
+ if (this->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
+ this->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
{
- SPFilter *parent = SP_FILTER(object->parent);
- blend->in2 = sp_filter_primitive_name_previous_out(blend);
+ SPFilter *parent = SP_FILTER(this->parent);
+ this->in2 = sp_filter_primitive_name_previous_out(this);
- //XML Tree being used directly here while it shouldn't be.
- object->getRepr()->setAttribute("in2", sp_filter_name_for_image(parent, blend->in2));
+ // TODO: XML Tree being used directly here while it shouldn't be.
+ this->getRepr()->setAttribute("in2", sp_filter_name_for_image(parent, this->in2));
}
- if (((SPObjectClass *) sp_feBlend_parent_class)->update) {
- ((SPObjectClass *) sp_feBlend_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feBlend_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
- SPFeBlend *blend = SP_FEBLEND(object);
- SPFilter *parent = SP_FILTER(object->parent);
+Inkscape::XML::Node* SPFeBlend::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
+ SPFilter *parent = SP_FILTER(this->parent);
if (!repr) {
repr = doc->createElement("svg:feBlend");
}
- gchar const *out_name = sp_filter_name_for_image(parent, blend->in2);
+ gchar const *out_name = sp_filter_name_for_image(parent, this->in2);
+
if (out_name) {
repr->setAttribute("in2", out_name);
} else {
SPObject *i = parent->children;
- while (i && i->next != object) i = i->next;
+
+ while (i && i->next != this) {
+ i = i->next;
+ }
+
SPFilterPrimitive *i_prim = SP_FILTER_PRIMITIVE(i);
out_name = sp_filter_name_for_image(parent, i_prim->image_out);
repr->setAttribute("in2", out_name);
+
if (!out_name) {
g_warning("Unable to set in2 for feBlend");
}
}
char const *mode;
- switch(blend->blend_mode) {
+ switch(this->blend_mode) {
case Inkscape::Filters::BLEND_NORMAL:
mode = "normal"; break;
case Inkscape::Filters::BLEND_MULTIPLY:
@@ -238,30 +213,27 @@ sp_feBlend_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::
default:
mode = 0;
}
+
repr->setAttribute("mode", mode);
- if (((SPObjectClass *) sp_feBlend_parent_class)->write) {
- ((SPObjectClass *) sp_feBlend_parent_class)->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
-static void sp_feBlend_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeBlend::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeBlend *sp_blend = SP_FEBLEND(primitive);
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_BLEND);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterBlend *nr_blend = dynamic_cast<Inkscape::Filters::FilterBlend*>(nr_primitive);
g_assert(nr_blend != NULL);
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ sp_filter_primitive_renderer_common(this, nr_primitive);
- nr_blend->set_mode(sp_blend->blend_mode);
- nr_blend->set_input(1, sp_blend->in2);
+ nr_blend->set_mode(this->blend_mode);
+ nr_blend->set_input(1, this->in2);
}
/*
diff --git a/src/filters/blend.h b/src/filters/blend.h
index 5d65c92fc..d5af9fe7d 100644
--- a/src/filters/blend.h
+++ b/src/filters/blend.h
@@ -16,23 +16,29 @@
#include "sp-filter-primitive.h"
#include "display/nr-filter-blend.h"
-#define SP_TYPE_FEBLEND (sp_feBlend_get_type())
-#define SP_FEBLEND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEBLEND, SPFeBlend))
-#define SP_FEBLEND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FEBLEND, SPFeBlendClass))
-#define SP_IS_FEBLEND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEBLEND))
-#define SP_IS_FEBLEND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FEBLEND))
+#define SP_FEBLEND(obj) (dynamic_cast<SPFeBlend*>((SPObject*)obj))
+#define SP_IS_FEBLEND(obj) (dynamic_cast<const SPFeBlend*>((SPObject*)obj) != NULL)
+
+class SPFeBlend : public SPFilterPrimitive {
+public:
+ SPFeBlend();
+ virtual ~SPFeBlend();
-struct SPFeBlend : public SPFilterPrimitive {
Inkscape::Filters::FilterBlendMode blend_mode;
int in2;
-};
-struct SPFeBlendClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
-GType sp_feBlend_get_type();
+ virtual void set(unsigned int key, const gchar* value);
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FEBLEND_H_SEEN */
diff --git a/src/filters/colormatrix.cpp b/src/filters/colormatrix.cpp
index aaf1c2986..58f601a65 100644
--- a/src/filters/colormatrix.cpp
+++ b/src/filters/colormatrix.cpp
@@ -29,64 +29,49 @@
#include "display/nr-filter.h"
#include "display/nr-filter-colormatrix.h"
-/* FeColorMatrix base class */
-static void sp_feColorMatrix_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feColorMatrix_release(SPObject *object);
-static void sp_feColorMatrix_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feColorMatrix_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feColorMatrix_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_feColorMatrix_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
-
-G_DEFINE_TYPE(SPFeColorMatrix, sp_feColorMatrix, SP_TYPE_FILTER_PRIMITIVE);
-
-static void
-sp_feColorMatrix_class_init(SPFeColorMatrixClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
-
- sp_object_class->build = sp_feColorMatrix_build;
- sp_object_class->release = sp_feColorMatrix_release;
- sp_object_class->write = sp_feColorMatrix_write;
- sp_object_class->set = sp_feColorMatrix_set;
- sp_object_class->update = sp_feColorMatrix_update;
- sp_primitive_class->build_renderer = sp_feColorMatrix_build_renderer;
+#include "sp-factory.h"
+
+namespace {
+ SPObject* createColorMatrix() {
+ return new SPFeColorMatrix();
+ }
+
+ bool colorMatrixRegistered = SPFactory::instance().registerObject("svg:feColorMatrix", createColorMatrix);
}
-static void
-sp_feColorMatrix_init(SPFeColorMatrix */*feColorMatrix*/)
+SPFeColorMatrix::SPFeColorMatrix()
+ : SPFilterPrimitive(), type(Inkscape::Filters::COLORMATRIX_MATRIX), value(0)
{
}
+SPFeColorMatrix::~SPFeColorMatrix() {
+}
+
/**
* Reads the Inkscape::XML::Node, and initializes SPFeColorMatrix variables. For this to get called,
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feColorMatrix_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_feColorMatrix_parent_class)->build) {
- ((SPObjectClass *) sp_feColorMatrix_parent_class)->build(object, document, repr);
- }
+void SPFeColorMatrix::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
- /*LOAD ATTRIBUTES FROM REPR HERE*/
- object->readAttr( "type" );
- object->readAttr( "values" );
+ /*LOAD ATTRIBUTES FROM REPR HERE*/
+ this->readAttr( "type" );
+ this->readAttr( "values" );
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feColorMatrix_release(SPObject *object)
-{
- if (((SPObjectClass *) sp_feColorMatrix_parent_class)->release)
- ((SPObjectClass *) sp_feColorMatrix_parent_class)->release(object);
+void SPFeColorMatrix::release() {
+ SPFilterPrimitive::release();
}
static Inkscape::Filters::FilterColorMatrixType sp_feColorMatrix_read_type(gchar const *value){
- if (!value) return Inkscape::Filters::COLORMATRIX_MATRIX; //matrix is default
+ if (!value) {
+ return Inkscape::Filters::COLORMATRIX_MATRIX; //matrix is default
+ }
+
switch(value[0]){
case 'm':
if (strcmp(value, "matrix") == 0) return Inkscape::Filters::COLORMATRIX_MATRIX;
@@ -101,38 +86,35 @@ static Inkscape::Filters::FilterColorMatrixType sp_feColorMatrix_read_type(gchar
if (strcmp(value, "luminanceToAlpha") == 0) return Inkscape::Filters::COLORMATRIX_LUMINANCETOALPHA;
break;
}
+
return Inkscape::Filters::COLORMATRIX_MATRIX; //matrix is default
}
/**
* Sets a specific value in the SPFeColorMatrix.
*/
-static void
-sp_feColorMatrix_set(SPObject *object, unsigned int key, gchar const *str)
-{
- SPFeColorMatrix *feColorMatrix = SP_FECOLORMATRIX(object);
- (void)feColorMatrix;
-
+void SPFeColorMatrix::set(unsigned int key, gchar const *str) {
Inkscape::Filters::FilterColorMatrixType read_type;
+
/*DEAL WITH SETTING ATTRIBUTES HERE*/
switch(key) {
case SP_ATTR_TYPE:
read_type = sp_feColorMatrix_read_type(str);
- if (feColorMatrix->type != read_type){
- feColorMatrix->type = read_type;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->type != read_type){
+ this->type = read_type;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_VALUES:
if (str){
- feColorMatrix->values = helperfns_read_vector(str);
- feColorMatrix->value = helperfns_read_number(str, HELPERFNS_NO_WARNING);
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ this->values = helperfns_read_vector(str);
+ this->value = helperfns_read_number(str, HELPERFNS_NO_WARNING);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
default:
- if (((SPObjectClass *) sp_feColorMatrix_parent_class)->set)
- ((SPObjectClass *) sp_feColorMatrix_parent_class)->set(object, key, str);
+ SPFilterPrimitive::set(key, str);
break;
}
}
@@ -140,9 +122,7 @@ sp_feColorMatrix_set(SPObject *object, unsigned int key, gchar const *str)
/**
* Receives update notifications.
*/
-static void
-sp_feColorMatrix_update(SPObject *object, SPCtx *ctx, guint flags)
-{
+void SPFeColorMatrix::update(SPCtx *ctx, guint flags) {
if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
@@ -150,45 +130,37 @@ sp_feColorMatrix_update(SPObject *object, SPCtx *ctx, guint flags)
}
- if (((SPObjectClass *) sp_feColorMatrix_parent_class)->update) {
- ((SPObjectClass *) sp_feColorMatrix_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feColorMatrix_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
+Inkscape::XML::Node* SPFeColorMatrix::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if (((SPObjectClass *) sp_feColorMatrix_parent_class)->write) {
- ((SPObjectClass *) sp_feColorMatrix_parent_class)->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
-static void sp_feColorMatrix_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeColorMatrix::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeColorMatrix *sp_colormatrix = SP_FECOLORMATRIX(primitive);
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_COLORMATRIX);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterColorMatrix *nr_colormatrix = dynamic_cast<Inkscape::Filters::FilterColorMatrix*>(nr_primitive);
g_assert(nr_colormatrix != NULL);
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
- nr_colormatrix->set_type(sp_colormatrix->type);
- nr_colormatrix->set_value(sp_colormatrix->value);
- nr_colormatrix->set_values(sp_colormatrix->values);
+ sp_filter_primitive_renderer_common(this, nr_primitive);
+ nr_colormatrix->set_type(this->type);
+ nr_colormatrix->set_value(this->value);
+ nr_colormatrix->set_values(this->values);
}
/*
diff --git a/src/filters/colormatrix.h b/src/filters/colormatrix.h
index 558f01070..2a1c403f1 100644
--- a/src/filters/colormatrix.h
+++ b/src/filters/colormatrix.h
@@ -15,23 +15,30 @@
#include "sp-filter-primitive.h"
#include "display/nr-filter-colormatrix.h"
-#define SP_TYPE_FECOLORMATRIX (sp_feColorMatrix_get_type())
-#define SP_FECOLORMATRIX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FECOLORMATRIX, SPFeColorMatrix))
-#define SP_FECOLORMATRIX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FECOLORMATRIX, SPFeColorMatrixClass))
-#define SP_IS_FECOLORMATRIX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FECOLORMATRIX))
-#define SP_IS_FECOLORMATRIX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FECOLORMATRIX))
+#define SP_FECOLORMATRIX(obj) (dynamic_cast<SPFeColorMatrix*>((SPObject*)obj))
+#define SP_IS_FECOLORMATRIX(obj) (dynamic_cast<const SPFeColorMatrix*>((SPObject*)obj) != NULL)
+
+class SPFeColorMatrix : public SPFilterPrimitive {
+public:
+ SPFeColorMatrix();
+ virtual ~SPFeColorMatrix();
-struct SPFeColorMatrix : public SPFilterPrimitive {
Inkscape::Filters::FilterColorMatrixType type;
gdouble value;
std::vector<gdouble> values;
-};
-struct SPFeColorMatrixClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void set(unsigned int key, const gchar* value);
-GType sp_feColorMatrix_get_type();
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FECOLORMATRIX_H_SEEN */
diff --git a/src/filters/componenttransfer-funcnode.cpp b/src/filters/componenttransfer-funcnode.cpp
index 446009e1d..7c5191700 100644
--- a/src/filters/componenttransfer-funcnode.cpp
+++ b/src/filters/componenttransfer-funcnode.cpp
@@ -31,127 +31,12 @@
#include "macros.h"
/* FeFuncNode class */
-
-static void sp_fefuncnode_class_init(SPFeFuncNodeClass *klass);
-static void sp_fefuncnode_init(SPFeFuncNode *fefuncnode);
-
-static void sp_fefuncnode_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_fefuncnode_release(SPObject *object);
-static void sp_fefuncnode_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_fefuncnode_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_fefuncnode_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-
-static SPObjectClass *feFuncNode_parent_class;
-
-GType
-sp_fefuncR_get_type()
-{
- static GType fefuncnode_type = 0;
-
- if (!fefuncnode_type) {
- GTypeInfo fefuncnode_info = {
- sizeof(SPFeFuncNodeClass),
- NULL, NULL,
- (GClassInitFunc) sp_fefuncnode_class_init,
- NULL, NULL,
- sizeof(SPFeFuncNode),
- 16,
- (GInstanceInitFunc) sp_fefuncnode_init,
- NULL, /* value_table */
- };
- fefuncnode_type = g_type_register_static(SP_TYPE_OBJECT, "SPFeFuncR", &fefuncnode_info, (GTypeFlags)0);
- }
- return fefuncnode_type;
-}
-
-GType
-sp_fefuncG_get_type()
-{
- static GType fefuncnode_type = 0;
-
- if (!fefuncnode_type) {
- GTypeInfo fefuncnode_info = {
- sizeof(SPFeFuncNodeClass),
- NULL, NULL,
- (GClassInitFunc) sp_fefuncnode_class_init,
- NULL, NULL,
- sizeof(SPFeFuncNode),
- 16,
- (GInstanceInitFunc) sp_fefuncnode_init,
- NULL, /* value_table */
- };
- fefuncnode_type = g_type_register_static(SP_TYPE_OBJECT, "SPFeFuncG", &fefuncnode_info, (GTypeFlags)0);
- }
- return fefuncnode_type;
-}
-
-GType
-sp_fefuncB_get_type()
-{
- static GType fefuncnode_type = 0;
-
- if (!fefuncnode_type) {
- GTypeInfo fefuncnode_info = {
- sizeof(SPFeFuncNodeClass),
- NULL, NULL,
- (GClassInitFunc) sp_fefuncnode_class_init,
- NULL, NULL,
- sizeof(SPFeFuncNode),
- 16,
- (GInstanceInitFunc) sp_fefuncnode_init,
- NULL, /* value_table */
- };
- fefuncnode_type = g_type_register_static(SP_TYPE_OBJECT, "SPFeFuncB", &fefuncnode_info, (GTypeFlags)0);
- }
- return fefuncnode_type;
-}
-
-GType
-sp_fefuncA_get_type()
-{
- static GType fefuncnode_type = 0;
-
- if (!fefuncnode_type) {
- GTypeInfo fefuncnode_info = {
- sizeof(SPFeFuncNodeClass),
- NULL, NULL,
- (GClassInitFunc) sp_fefuncnode_class_init,
- NULL, NULL,
- sizeof(SPFeFuncNode),
- 16,
- (GInstanceInitFunc) sp_fefuncnode_init,
- NULL, /* value_table */
- };
- fefuncnode_type = g_type_register_static(SP_TYPE_OBJECT, "SPFeFuncA", &fefuncnode_info, (GTypeFlags)0);
- }
- return fefuncnode_type;
-}
-
-static void
-sp_fefuncnode_class_init(SPFeFuncNodeClass *klass)
-{
-
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
-
- feFuncNode_parent_class = (SPObjectClass*)g_type_class_peek_parent(klass);
-
- sp_object_class->build = sp_fefuncnode_build;
- sp_object_class->release = sp_fefuncnode_release;
- sp_object_class->write = sp_fefuncnode_write;
- sp_object_class->set = sp_fefuncnode_set;
- sp_object_class->update = sp_fefuncnode_update;
+SPFeFuncNode::SPFeFuncNode()
+ : SPObject(), type(Inkscape::Filters::COMPONENTTRANSFER_TYPE_IDENTITY),
+ slope(1), intercept(0), amplitude(1), exponent(1), offset(0) {
}
-static void
-sp_fefuncnode_init(SPFeFuncNode *fefuncnode)
-{
- fefuncnode->type = Inkscape::Filters::COMPONENTTRANSFER_TYPE_IDENTITY;
- //fefuncnode->tableValues = NULL;
- fefuncnode->slope = 1;
- fefuncnode->intercept = 0;
- fefuncnode->amplitude = 1;
- fefuncnode->exponent = 1;
- fefuncnode->offset = 0;
+SPFeFuncNode::~SPFeFuncNode() {
}
/**
@@ -159,125 +44,135 @@ sp_fefuncnode_init(SPFeFuncNode *fefuncnode)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_fefuncnode_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) feFuncNode_parent_class)->build) {
- ((SPObjectClass *) feFuncNode_parent_class)->build(object, document, repr);
- }
+void SPFeFuncNode::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPObject::build(document, repr);
//Read values of key attributes from XML nodes into object.
- object->readAttr( "type" );
- object->readAttr( "tableValues" );
- object->readAttr( "slope" );
- object->readAttr( "intercept" );
- object->readAttr( "amplitude" );
- object->readAttr( "exponent" );
- object->readAttr( "offset" );
+ this->readAttr( "type" );
+ this->readAttr( "tableValues" );
+ this->readAttr( "slope" );
+ this->readAttr( "intercept" );
+ this->readAttr( "amplitude" );
+ this->readAttr( "exponent" );
+ this->readAttr( "offset" );
//is this necessary?
- document->addResource("fefuncnode", object); //maybe feFuncR, fefuncG, feFuncB and fefuncA ?
+ document->addResource("fefuncnode", this); //maybe feFuncR, fefuncG, feFuncB and fefuncA ?
}
/**
* Drops any allocated memory.
*/
-static void sp_fefuncnode_release(SPObject *object)
-{
- //SPFeFuncNode *fefuncnode = SP_FEFUNCNODE(object);
-
- if ( object->document ) {
+void SPFeFuncNode::release() {
+ if ( this->document ) {
// Unregister ourselves
- object->document->removeResource("fefuncnode", object);
+ this->document->removeResource("fefuncnode", this);
}
//TODO: release resources here
}
static Inkscape::Filters::FilterComponentTransferType sp_feComponenttransfer_read_type(gchar const *value){
- if (!value) return Inkscape::Filters::COMPONENTTRANSFER_TYPE_ERROR; //type attribute is REQUIRED.
+ if (!value) {
+ return Inkscape::Filters::COMPONENTTRANSFER_TYPE_ERROR; //type attribute is REQUIRED.
+ }
+
switch(value[0]){
case 'i':
- if (strncmp(value, "identity", 8) == 0) return Inkscape::Filters::COMPONENTTRANSFER_TYPE_IDENTITY;
+ if (strncmp(value, "identity", 8) == 0) {
+ return Inkscape::Filters::COMPONENTTRANSFER_TYPE_IDENTITY;
+ }
break;
case 't':
- if (strncmp(value, "table", 5) == 0) return Inkscape::Filters::COMPONENTTRANSFER_TYPE_TABLE;
+ if (strncmp(value, "table", 5) == 0) {
+ return Inkscape::Filters::COMPONENTTRANSFER_TYPE_TABLE;
+ }
break;
case 'd':
- if (strncmp(value, "discrete", 8) == 0) return Inkscape::Filters::COMPONENTTRANSFER_TYPE_DISCRETE;
+ if (strncmp(value, "discrete", 8) == 0) {
+ return Inkscape::Filters::COMPONENTTRANSFER_TYPE_DISCRETE;
+ }
break;
case 'l':
- if (strncmp(value, "linear", 6) == 0) return Inkscape::Filters::COMPONENTTRANSFER_TYPE_LINEAR;
+ if (strncmp(value, "linear", 6) == 0) {
+ return Inkscape::Filters::COMPONENTTRANSFER_TYPE_LINEAR;
+ }
break;
case 'g':
- if (strncmp(value, "gamma", 5) == 0) return Inkscape::Filters::COMPONENTTRANSFER_TYPE_GAMMA;
+ if (strncmp(value, "gamma", 5) == 0) {
+ return Inkscape::Filters::COMPONENTTRANSFER_TYPE_GAMMA;
+ }
break;
}
+
return Inkscape::Filters::COMPONENTTRANSFER_TYPE_ERROR; //type attribute is REQUIRED.
}
/**
* Sets a specific value in the SPFeFuncNode.
*/
-static void
-sp_fefuncnode_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeFuncNode *feFuncNode = SP_FEFUNCNODE(object);
+void SPFeFuncNode::set(unsigned int key, gchar const *value) {
Inkscape::Filters::FilterComponentTransferType type;
double read_num;
+
switch(key) {
case SP_ATTR_TYPE:
type = sp_feComponenttransfer_read_type(value);
- if(type != feFuncNode->type) {
- feFuncNode->type = type;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if(type != this->type) {
+ this->type = type;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_TABLEVALUES:
if (value){
- feFuncNode->tableValues = helperfns_read_vector(value);
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ this->tableValues = helperfns_read_vector(value);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_SLOPE:
read_num = value ? helperfns_read_number(value) : 1;
- if (read_num != feFuncNode->slope) {
- feFuncNode->slope = read_num;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_num != this->slope) {
+ this->slope = read_num;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_INTERCEPT:
read_num = value ? helperfns_read_number(value) : 0;
- if (read_num != feFuncNode->intercept) {
- feFuncNode->intercept = read_num;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_num != this->intercept) {
+ this->intercept = read_num;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_AMPLITUDE:
read_num = value ? helperfns_read_number(value) : 1;
- if (read_num != feFuncNode->amplitude) {
- feFuncNode->amplitude = read_num;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_num != this->amplitude) {
+ this->amplitude = read_num;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_EXPONENT:
read_num = value ? helperfns_read_number(value) : 1;
- if (read_num != feFuncNode->exponent) {
- feFuncNode->exponent = read_num;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_num != this->exponent) {
+ this->exponent = read_num;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_OFFSET:
read_num = value ? helperfns_read_number(value) : 0;
- if (read_num != feFuncNode->offset) {
- feFuncNode->offset = read_num;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_num != this->offset) {
+ this->offset = read_num;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
default:
- if (((SPObjectClass *) feFuncNode_parent_class)->set)
- ((SPObjectClass *) feFuncNode_parent_class)->set(object, key, value);
+ SPObject::set(key, value);
break;
}
}
@@ -285,48 +180,34 @@ sp_fefuncnode_set(SPObject *object, unsigned int key, gchar const *value)
/**
* * Receives update notifications.
* */
-static void
-sp_fefuncnode_update(SPObject *object, SPCtx *ctx, guint flags)
-{
- SPFeFuncNode *feFuncNode = SP_FEFUNCNODE(object);
- (void)feFuncNode;
-
+void SPFeFuncNode::update(SPCtx *ctx, guint flags) {
if (flags & SP_OBJECT_MODIFIED_FLAG) {
/* do something to trigger redisplay, updates? */
//TODO
- //object->readAttr( "azimuth" );
- //object->readAttr( "elevation" );
+ //this->readAttr( "azimuth" );
+ //this->readAttr( "elevation" );
}
- if (((SPObjectClass *) feFuncNode_parent_class)->update) {
- ((SPObjectClass *) feFuncNode_parent_class)->update(object, ctx, flags);
- }
+ SPObject::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_fefuncnode_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
- SPFeFuncNode *fefuncnode = SP_FEFUNCNODE(object);
-
+Inkscape::XML::Node* SPFeFuncNode::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- (void)fefuncnode;
/*
-TODO: I'm not sure what to do here...
+ TODO: I'm not sure what to do here...
if (fefuncnode->azimuth_set)
sp_repr_set_css_double(repr, "azimuth", fefuncnode->azimuth);
if (fefuncnode->elevation_set)
sp_repr_set_css_double(repr, "elevation", fefuncnode->elevation);*/
- if (((SPObjectClass *) feFuncNode_parent_class)->write) {
- ((SPObjectClass *) feFuncNode_parent_class)->write(object, doc, repr, flags);
- }
+ SPObject::write(doc, repr, flags);
return repr;
}
diff --git a/src/filters/componenttransfer-funcnode.h b/src/filters/componenttransfer-funcnode.h
index ae1b2f8bb..a5f813e1e 100644
--- a/src/filters/componenttransfer-funcnode.h
+++ b/src/filters/componenttransfer-funcnode.h
@@ -18,23 +18,34 @@
#include "sp-object.h"
#include "display/nr-filter-component-transfer.h"
-#define SP_TYPE_FEFUNCR (sp_fefuncR_get_type())
-#define SP_TYPE_FEFUNCG (sp_fefuncG_get_type())
-#define SP_TYPE_FEFUNCB (sp_fefuncB_get_type())
-#define SP_TYPE_FEFUNCA (sp_fefuncA_get_type())
+//#define SP_TYPE_FEFUNCR (sp_fefuncR_get_type())
+//#define SP_TYPE_FEFUNCG (sp_fefuncG_get_type())
+//#define SP_TYPE_FEFUNCB (sp_fefuncB_get_type())
+//#define SP_TYPE_FEFUNCA (sp_fefuncA_get_type())
-#define SP_IS_FEFUNCR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEFUNCR))
-#define SP_IS_FEFUNCG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEFUNCG))
-#define SP_IS_FEFUNCB(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEFUNCB))
-#define SP_IS_FEFUNCA(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEFUNCA))
+// CPPIFY: Casting macros buggy, as these aren't classes.
+//#define SP_IS_FEFUNCR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEFUNCR))
+//#define SP_IS_FEFUNCG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEFUNCG))
+//#define SP_IS_FEFUNCB(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEFUNCB))
+//#define SP_IS_FEFUNCA(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEFUNCA))
-#define SP_FEFUNCNODE(obj) (SP_IS_FEFUNCR(obj) ? G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEFUNCR, SPFeFuncNode) : (SP_IS_FEFUNCG(obj) ? G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEFUNCG, SPFeFuncNode) : (SP_IS_FEFUNCB(obj) ? G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEFUNCB, SPFeFuncNode):(SP_IS_FEFUNCA(obj) ? G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEFUNCA, SPFeFuncNode): NULL))))
+#define SP_FEFUNCNODE(obj) (dynamic_cast<SPFeFuncNode*>((SPObject*)obj))
-#define SP_FEFUNCNODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FEFUNCNODE, SPFeFuncNodeClass))
+//#define SP_IS_FEFUNCR(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPFeFuncNode)))
+//#define SP_IS_FEFUNCG(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPFeFuncNode)))
+//#define SP_IS_FEFUNCB(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPFeFuncNode)))
+//#define SP_IS_FEFUNCA(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPFeFuncNode)))
-#define SP_IS_FEFUNCNODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FEFUNCNODE))
+#define SP_IS_FEFUNCR(obj) (dynamic_cast<const SPFeFuncNode*>((SPObject*)obj) != NULL)
+#define SP_IS_FEFUNCG(obj) (dynamic_cast<const SPFeFuncNode*>((SPObject*)obj) != NULL)
+#define SP_IS_FEFUNCB(obj) (dynamic_cast<const SPFeFuncNode*>((SPObject*)obj) != NULL)
+#define SP_IS_FEFUNCA(obj) (dynamic_cast<const SPFeFuncNode*>((SPObject*)obj) != NULL)
+
+class SPFeFuncNode : public SPObject {
+public:
+ SPFeFuncNode();
+ virtual ~SPFeFuncNode();
-struct SPFeFuncNode : public SPObject {
Inkscape::Filters::FilterComponentTransferType type;
std::vector<double> tableValues;
double slope;
@@ -42,17 +53,17 @@ struct SPFeFuncNode : public SPObject {
double amplitude;
double exponent;
double offset;
-};
-/* Component Transfer funcNode class */
-struct SPFeFuncNodeClass {
- SPObjectClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
-GType sp_fefuncR_get_type();
-GType sp_fefuncG_get_type();
-GType sp_fefuncB_get_type();
-GType sp_fefuncA_get_type();
+ virtual void set(unsigned int key, const gchar* value);
+
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+};
#endif /* !SP_FECOMPONENTTRANSFER_FUNCNODE_H_SEEN */
diff --git a/src/filters/componenttransfer.cpp b/src/filters/componenttransfer.cpp
index 71e1ffe8e..96d1ea0bf 100644
--- a/src/filters/componenttransfer.cpp
+++ b/src/filters/componenttransfer.cpp
@@ -27,55 +27,36 @@
#include "display/nr-filter.h"
#include "display/nr-filter-component-transfer.h"
-/* FeComponentTransfer base class */
-static void sp_feComponentTransfer_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feComponentTransfer_release(SPObject *object);
-static void sp_feComponentTransfer_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feComponentTransfer_update(SPObject *object, SPCtx *ctx, guint flags);
-static void sp_feComponentTransfer_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
-static void sp_feComponentTransfer_remove_child(SPObject *object, Inkscape::XML::Node *child);
-static void sp_feComponentTransfer_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref);
-static Inkscape::XML::Node *sp_feComponentTransfer_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-
-G_DEFINE_TYPE(SPFeComponentTransfer, sp_feComponentTransfer, SP_TYPE_FILTER_PRIMITIVE);
-
-static void
-sp_feComponentTransfer_class_init(SPFeComponentTransferClass *klass)
+#include "sp-factory.h"
+
+namespace {
+ SPObject* createComponentTransfer() {
+ return new SPFeComponentTransfer();
+ }
+
+ bool componentTransferRegistered = SPFactory::instance().registerObject("svg:feComponentTransfer", createComponentTransfer);
+}
+
+SPFeComponentTransfer::SPFeComponentTransfer()
+ : SPFilterPrimitive(), renderer(NULL)
{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
-
- sp_object_class->build = sp_feComponentTransfer_build;
- sp_object_class->release = sp_feComponentTransfer_release;
- sp_object_class->write = sp_feComponentTransfer_write;
- sp_object_class->set = sp_feComponentTransfer_set;
- sp_object_class->update = sp_feComponentTransfer_update;
- sp_object_class->child_added = sp_feComponentTransfer_child_added;
- sp_object_class->remove_child = sp_feComponentTransfer_remove_child;
-
- sp_primitive_class->build_renderer = sp_feComponentTransfer_build_renderer;
}
-static void
-sp_feComponentTransfer_init(SPFeComponentTransfer */*feComponentTransfer*/)
-{}
+SPFeComponentTransfer::~SPFeComponentTransfer() {
+}
/**
* Reads the Inkscape::XML::Node, and initializes SPFeComponentTransfer variables. For this to get called,
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feComponentTransfer_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_feComponentTransfer_parent_class)->build) {
- ((SPObjectClass *) sp_feComponentTransfer_parent_class)->build(object, document, repr);
- }
+void SPFeComponentTransfer::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
- /*LOAD ATTRIBUTES FROM REPR HERE*/
+ /*LOAD ATTRIBUTES FROM REPR HERE*/
- //do we need this?
- //document->addResource("feComponentTransfer", object);
+ //do we need this?
+ //document->addResource("feComponentTransfer", object);
}
static void sp_feComponentTransfer_children_modified(SPFeComponentTransfer *sp_componenttransfer)
@@ -114,58 +95,38 @@ static void sp_feComponentTransfer_children_modified(SPFeComponentTransfer *sp_c
/**
* Callback for child_added event.
*/
-static void
-sp_feComponentTransfer_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref)
-{
- SPFeComponentTransfer *f = SP_FECOMPONENTTRANSFER(object);
+void SPFeComponentTransfer::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) {
+ SPFilterPrimitive::child_added(child, ref);
- if (((SPObjectClass *) sp_feComponentTransfer_parent_class)->child_added)
- (* ((SPObjectClass *) sp_feComponentTransfer_parent_class)->child_added)(object, child, ref);
-
- sp_feComponentTransfer_children_modified(f);
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ sp_feComponentTransfer_children_modified(this);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
-
/**
* Callback for remove_child event.
*/
-static void
-sp_feComponentTransfer_remove_child(SPObject *object, Inkscape::XML::Node *child)
-{
- SPFeComponentTransfer *f = SP_FECOMPONENTTRANSFER(object);
-
- if (((SPObjectClass *) sp_feComponentTransfer_parent_class)->remove_child)
- (* ((SPObjectClass *) sp_feComponentTransfer_parent_class)->remove_child)(object, child);
+void SPFeComponentTransfer::remove_child(Inkscape::XML::Node *child) {
+ SPFilterPrimitive::remove_child(child);
- sp_feComponentTransfer_children_modified(f);
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ sp_feComponentTransfer_children_modified(this);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feComponentTransfer_release(SPObject *object)
-{
- if (((SPObjectClass *) sp_feComponentTransfer_parent_class)->release)
- ((SPObjectClass *) sp_feComponentTransfer_parent_class)->release(object);
+void SPFeComponentTransfer::release() {
+ SPFilterPrimitive::release();
}
/**
* Sets a specific value in the SPFeComponentTransfer.
*/
-static void
-sp_feComponentTransfer_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeComponentTransfer *feComponentTransfer = SP_FECOMPONENTTRANSFER(object);
- (void)feComponentTransfer;
-
+void SPFeComponentTransfer::set(unsigned int key, gchar const *value) {
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
default:
- if (((SPObjectClass *) sp_feComponentTransfer_parent_class)->set)
- ((SPObjectClass *) sp_feComponentTransfer_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
}
@@ -173,9 +134,7 @@ sp_feComponentTransfer_set(SPObject *object, unsigned int key, gchar const *valu
/**
* Receives update notifications.
*/
-static void
-sp_feComponentTransfer_update(SPObject *object, SPCtx *ctx, guint flags)
-{
+void SPFeComponentTransfer::update(SPCtx *ctx, guint flags) {
if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
@@ -183,46 +142,38 @@ sp_feComponentTransfer_update(SPObject *object, SPCtx *ctx, guint flags)
}
- if (((SPObjectClass *) sp_feComponentTransfer_parent_class)->update) {
- ((SPObjectClass *) sp_feComponentTransfer_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feComponentTransfer_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
+Inkscape::XML::Node* SPFeComponentTransfer::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if (((SPObjectClass *) sp_feComponentTransfer_parent_class)->write) {
- ((SPObjectClass *) sp_feComponentTransfer_parent_class)->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
-static void sp_feComponentTransfer_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeComponentTransfer::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeComponentTransfer *sp_componenttransfer = SP_FECOMPONENTTRANSFER(primitive);
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_COMPONENTTRANSFER);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterComponentTransfer *nr_componenttransfer = dynamic_cast<Inkscape::Filters::FilterComponentTransfer*>(nr_primitive);
g_assert(nr_componenttransfer != NULL);
- sp_componenttransfer->renderer = nr_componenttransfer;
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ this->renderer = nr_componenttransfer;
+ sp_filter_primitive_renderer_common(this, nr_primitive);
- sp_feComponentTransfer_children_modified(sp_componenttransfer); //do we need it?!
+ sp_feComponentTransfer_children_modified(this); //do we need it?!
}
/*
diff --git a/src/filters/componenttransfer.h b/src/filters/componenttransfer.h
index deb6fb740..8dbe91db1 100644
--- a/src/filters/componenttransfer.h
+++ b/src/filters/componenttransfer.h
@@ -13,27 +13,36 @@
#include "sp-filter-primitive.h"
-#define SP_TYPE_FECOMPONENTTRANSFER (sp_feComponentTransfer_get_type())
-#define SP_FECOMPONENTTRANSFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FECOMPONENTTRANSFER, SPFeComponentTransfer))
-#define SP_FECOMPONENTTRANSFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FECOMPONENTTRANSFER, SPFeComponentTransferClass))
-#define SP_IS_FECOMPONENTTRANSFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FECOMPONENTTRANSFER))
-#define SP_IS_FECOMPONENTTRANSFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FECOMPONENTTRANSFER))
+#define SP_FECOMPONENTTRANSFER(obj) (dynamic_cast<SPFeComponentTransfer*>((SPObject*)obj))
+#define SP_IS_FECOMPONENTTRANSFER(obj) (dynamic_cast<const SPFeComponentTransfer*>((SPObject*)obj) != NULL)
namespace Inkscape {
namespace Filters {
class FilterComponentTransfer;
} }
-struct SPFeComponentTransfer : public SPFilterPrimitive {
+class SPFeComponentTransfer : public SPFilterPrimitive {
+public:
+ SPFeComponentTransfer();
+ virtual ~SPFeComponentTransfer();
+
Inkscape::Filters::FilterComponentTransfer *renderer;
-};
-struct SPFeComponentTransferClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
+ virtual void remove_child(Inkscape::XML::Node* child);
-GType sp_feComponentTransfer_get_type();
+ virtual void set(unsigned int key, const gchar* value);
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FECOMPONENTTRANSFER_H_SEEN */
diff --git a/src/filters/composite.cpp b/src/filters/composite.cpp
index d490f336c..3c214a7a1 100644
--- a/src/filters/composite.cpp
+++ b/src/filters/composite.cpp
@@ -25,40 +25,23 @@
#include "display/nr-filter-composite.h"
#include "sp-filter.h"
-/* FeComposite base class */
-static void sp_feComposite_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feComposite_release(SPObject *object);
-static void sp_feComposite_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feComposite_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feComposite_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_feComposite_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
-
-G_DEFINE_TYPE(SPFeComposite, sp_feComposite, SP_TYPE_FILTER_PRIMITIVE);
-
-static void
-sp_feComposite_class_init(SPFeCompositeClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
+#include "sp-factory.h"
- sp_object_class->build = sp_feComposite_build;
- sp_object_class->release = sp_feComposite_release;
- sp_object_class->write = sp_feComposite_write;
- sp_object_class->set = sp_feComposite_set;
- sp_object_class->update = sp_feComposite_update;
+namespace {
+ SPObject* createComposite() {
+ return new SPFeComposite();
+ }
- sp_primitive_class->build_renderer = sp_feComposite_build_renderer;
+ bool compositeRegistered = SPFactory::instance().registerObject("svg:feComposite", createComposite);
}
-static void
-sp_feComposite_init(SPFeComposite *feComposite)
+SPFeComposite::SPFeComposite()
+ : SPFilterPrimitive(), composite_operator(COMPOSITE_DEFAULT),
+ k1(0), k2(0), k3(0), k4(0), in2(Inkscape::Filters::NR_FILTER_SLOT_NOT_SET)
{
- feComposite->composite_operator = COMPOSITE_DEFAULT;
- feComposite->k1 = 0;
- feComposite->k2 = 0;
- feComposite->k3 = 0;
- feComposite->k4 = 0;
- feComposite->in2 = Inkscape::Filters::NR_FILTER_SLOT_NOT_SET;
+}
+
+SPFeComposite::~SPFeComposite() {
}
/**
@@ -66,140 +49,133 @@ sp_feComposite_init(SPFeComposite *feComposite)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feComposite_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_feComposite_parent_class)->build) {
- ((SPObjectClass *) sp_feComposite_parent_class)->build(object, document, repr);
- }
-
- SPFeComposite *comp = SP_FECOMPOSITE(object);
-
- object->readAttr( "operator" );
- if (comp->composite_operator == COMPOSITE_ARITHMETIC) {
- object->readAttr( "k1" );
- object->readAttr( "k2" );
- object->readAttr( "k3" );
- object->readAttr( "k4" );
- }
- object->readAttr( "in2" );
-
- /* Unlike normal in, in2 is required attribute. Make sure, we can call
- * it by some name. */
- if (comp->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
- comp->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
- {
- SPFilter *parent = SP_FILTER(object->parent);
- comp->in2 = sp_filter_primitive_name_previous_out(comp);
- repr->setAttribute("in2", sp_filter_name_for_image(parent, comp->in2));
- }
+void SPFeComposite::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
+
+ this->readAttr( "operator" );
+
+ if (this->composite_operator == COMPOSITE_ARITHMETIC) {
+ this->readAttr( "k1" );
+ this->readAttr( "k2" );
+ this->readAttr( "k3" );
+ this->readAttr( "k4" );
+ }
+
+ this->readAttr( "in2" );
+
+ /* Unlike normal in, in2 is required attribute. Make sure, we can call
+ * it by some name. */
+ if (this->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
+ this->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
+ {
+ SPFilter *parent = SP_FILTER(this->parent);
+ this->in2 = sp_filter_primitive_name_previous_out(this);
+ repr->setAttribute("in2", sp_filter_name_for_image(parent, this->in2));
+ }
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feComposite_release(SPObject *object)
-{
- if (((SPObjectClass *) sp_feComposite_parent_class)->release)
- ((SPObjectClass *) sp_feComposite_parent_class)->release(object);
+void SPFeComposite::release() {
+ SPFilterPrimitive::release();
}
static FeCompositeOperator
sp_feComposite_read_operator(gchar const *value) {
- if (!value) return COMPOSITE_DEFAULT;
-
- if (strcmp(value, "over") == 0) return COMPOSITE_OVER;
- else if (strcmp(value, "in") == 0) return COMPOSITE_IN;
- else if (strcmp(value, "out") == 0) return COMPOSITE_OUT;
- else if (strcmp(value, "atop") == 0) return COMPOSITE_ATOP;
- else if (strcmp(value, "xor") == 0) return COMPOSITE_XOR;
- else if (strcmp(value, "arithmetic") == 0) return COMPOSITE_ARITHMETIC;
+ if (!value) {
+ return COMPOSITE_DEFAULT;
+ }
+
+ if (strcmp(value, "over") == 0) {
+ return COMPOSITE_OVER;
+ } else if (strcmp(value, "in") == 0) {
+ return COMPOSITE_IN;
+ } else if (strcmp(value, "out") == 0) {
+ return COMPOSITE_OUT;
+ } else if (strcmp(value, "atop") == 0) {
+ return COMPOSITE_ATOP;
+ } else if (strcmp(value, "xor") == 0) {
+ return COMPOSITE_XOR;
+ } else if (strcmp(value, "arithmetic") == 0) {
+ return COMPOSITE_ARITHMETIC;
+ }
+
return COMPOSITE_DEFAULT;
}
/**
* Sets a specific value in the SPFeComposite.
*/
-static void
-sp_feComposite_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeComposite *feComposite = SP_FECOMPOSITE(object);
- (void)feComposite;
-
+void SPFeComposite::set(unsigned int key, gchar const *value) {
int input;
FeCompositeOperator op;
double k_n;
+
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
case SP_ATTR_OPERATOR:
op = sp_feComposite_read_operator(value);
- if (op != feComposite->composite_operator) {
- feComposite->composite_operator = op;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ if (op != this->composite_operator) {
+ this->composite_operator = op;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_K1:
k_n = value ? helperfns_read_number(value) : 0;
- if (k_n != feComposite->k1) {
- feComposite->k1 = k_n;
- if (feComposite->composite_operator == COMPOSITE_ARITHMETIC)
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ if (k_n != this->k1) {
+ this->k1 = k_n;
+ if (this->composite_operator == COMPOSITE_ARITHMETIC)
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_K2:
k_n = value ? helperfns_read_number(value) : 0;
- if (k_n != feComposite->k2) {
- feComposite->k2 = k_n;
- if (feComposite->composite_operator == COMPOSITE_ARITHMETIC)
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ if (k_n != this->k2) {
+ this->k2 = k_n;
+ if (this->composite_operator == COMPOSITE_ARITHMETIC)
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_K3:
k_n = value ? helperfns_read_number(value) : 0;
- if (k_n != feComposite->k3) {
- feComposite->k3 = k_n;
- if (feComposite->composite_operator == COMPOSITE_ARITHMETIC)
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ if (k_n != this->k3) {
+ this->k3 = k_n;
+ if (this->composite_operator == COMPOSITE_ARITHMETIC)
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_K4:
k_n = value ? helperfns_read_number(value) : 0;
- if (k_n != feComposite->k4) {
- feComposite->k4 = k_n;
- if (feComposite->composite_operator == COMPOSITE_ARITHMETIC)
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ if (k_n != this->k4) {
+ this->k4 = k_n;
+ if (this->composite_operator == COMPOSITE_ARITHMETIC)
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_IN2:
- input = sp_filter_primitive_read_in(feComposite, value);
- if (input != feComposite->in2) {
- feComposite->in2 = input;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ input = sp_filter_primitive_read_in(this, value);
+ if (input != this->in2) {
+ this->in2 = input;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
default:
- if (((SPObjectClass *) sp_feComposite_parent_class)->set)
- ((SPObjectClass *) sp_feComposite_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
-
}
/**
* Receives update notifications.
*/
-static void
-sp_feComposite_update(SPObject *object, SPCtx *ctx, guint flags)
-{
- SPFeComposite *comp = SP_FECOMPOSITE(object);
-
+void SPFeComposite::update(SPCtx *ctx, guint flags) {
if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
@@ -209,50 +185,52 @@ sp_feComposite_update(SPObject *object, SPCtx *ctx, guint flags)
/* Unlike normal in, in2 is required attribute. Make sure, we can call
* it by some name. */
- if (comp->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
- comp->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
+ if (this->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
+ this->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
{
- SPFilter *parent = SP_FILTER(object->parent);
- comp->in2 = sp_filter_primitive_name_previous_out(comp);
+ SPFilter *parent = SP_FILTER(this->parent);
+ this->in2 = sp_filter_primitive_name_previous_out(this);
//XML Tree being used directly here while it shouldn't be.
- object->getRepr()->setAttribute("in2", sp_filter_name_for_image(parent, comp->in2));
+ this->getRepr()->setAttribute("in2", sp_filter_name_for_image(parent, this->in2));
}
- if (((SPObjectClass *) sp_feComposite_parent_class)->update) {
- ((SPObjectClass *) sp_feComposite_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feComposite_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
- SPFeComposite *comp = SP_FECOMPOSITE(object);
- SPFilter *parent = SP_FILTER(object->parent);
+Inkscape::XML::Node* SPFeComposite::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
+ SPFilter *parent = SP_FILTER(this->parent);
if (!repr) {
repr = doc->createElement("svg:feComposite");
}
- gchar const *out_name = sp_filter_name_for_image(parent, comp->in2);
+ gchar const *out_name = sp_filter_name_for_image(parent, this->in2);
+
if (out_name) {
repr->setAttribute("in2", out_name);
} else {
SPObject *i = parent->children;
- while (i && i->next != object) i = i->next;
+
+ while (i && i->next != this) {
+ i = i->next;
+ }
+
SPFilterPrimitive *i_prim = SP_FILTER_PRIMITIVE(i);
out_name = sp_filter_name_for_image(parent, i_prim->image_out);
repr->setAttribute("in2", out_name);
+
if (!out_name) {
g_warning("Unable to set in2 for feComposite");
}
}
char const *comp_op;
- switch (comp->composite_operator) {
+
+ switch (this->composite_operator) {
case COMPOSITE_OVER:
comp_op = "over"; break;
case COMPOSITE_IN:
@@ -268,13 +246,14 @@ sp_feComposite_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::X
default:
comp_op = 0;
}
+
repr->setAttribute("operator", comp_op);
- if (comp->composite_operator == COMPOSITE_ARITHMETIC) {
- sp_repr_set_svg_double(repr, "k1", comp->k1);
- sp_repr_set_svg_double(repr, "k2", comp->k2);
- sp_repr_set_svg_double(repr, "k3", comp->k3);
- sp_repr_set_svg_double(repr, "k4", comp->k4);
+ if (this->composite_operator == COMPOSITE_ARITHMETIC) {
+ sp_repr_set_svg_double(repr, "k1", this->k1);
+ sp_repr_set_svg_double(repr, "k2", this->k2);
+ sp_repr_set_svg_double(repr, "k3", this->k3);
+ sp_repr_set_svg_double(repr, "k4", this->k4);
} else {
repr->setAttribute("k1", 0);
repr->setAttribute("k2", 0);
@@ -282,35 +261,31 @@ sp_feComposite_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::X
repr->setAttribute("k4", 0);
}
- if (((SPObjectClass *) sp_feComposite_parent_class)->write) {
- ((SPObjectClass *) sp_feComposite_parent_class)->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
-static void sp_feComposite_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeComposite::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeComposite *sp_composite = SP_FECOMPOSITE(primitive);
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_COMPOSITE);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterComposite *nr_composite = dynamic_cast<Inkscape::Filters::FilterComposite*>(nr_primitive);
g_assert(nr_composite != NULL);
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ sp_filter_primitive_renderer_common(this, nr_primitive);
- nr_composite->set_operator(sp_composite->composite_operator);
- nr_composite->set_input(1, sp_composite->in2);
- if (sp_composite->composite_operator == COMPOSITE_ARITHMETIC) {
- nr_composite->set_arithmetic(sp_composite->k1, sp_composite->k2,
- sp_composite->k3, sp_composite->k4);
+ nr_composite->set_operator(this->composite_operator);
+ nr_composite->set_input(1, this->in2);
+
+ if (this->composite_operator == COMPOSITE_ARITHMETIC) {
+ nr_composite->set_arithmetic(this->k1, this->k2,
+ this->k3, this->k4);
}
}
-
/*
Local Variables:
mode:c++
diff --git a/src/filters/composite.h b/src/filters/composite.h
index 4f2d1ff69..b8c0178d1 100644
--- a/src/filters/composite.h
+++ b/src/filters/composite.h
@@ -13,11 +13,8 @@
#include "sp-filter-primitive.h"
-#define SP_TYPE_FECOMPOSITE (sp_feComposite_get_type())
-#define SP_FECOMPOSITE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FECOMPOSITE, SPFeComposite))
-#define SP_FECOMPOSITE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FECOMPOSITE, SPFeCompositeClass))
-#define SP_IS_FECOMPOSITE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FECOMPOSITE))
-#define SP_IS_FECOMPOSITE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FECOMPOSITE))
+#define SP_FECOMPOSITE(obj) (dynamic_cast<SPFeComposite*>((SPObject*)obj))
+#define SP_IS_FECOMPOSITE(obj) (dynamic_cast<const SPFeComposite*>((SPObject*)obj) != NULL)
enum FeCompositeOperator {
// Default value is 'over', but let's distinquish specifying the
@@ -32,17 +29,27 @@ enum FeCompositeOperator {
COMPOSITE_ENDOPERATOR
};
-struct SPFeComposite : public SPFilterPrimitive {
+class SPFeComposite : public SPFilterPrimitive {
+public:
+ SPFeComposite();
+ virtual ~SPFeComposite();
+
FeCompositeOperator composite_operator;
double k1, k2, k3, k4;
int in2;
-};
-struct SPFeCompositeClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void set(unsigned int key, const gchar* value);
-GType sp_feComposite_get_type();
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FECOMPOSITE_H_SEEN */
diff --git a/src/filters/convolvematrix.cpp b/src/filters/convolvematrix.cpp
index d002ef731..bd710b116 100644
--- a/src/filters/convolvematrix.cpp
+++ b/src/filters/convolvematrix.cpp
@@ -28,45 +28,35 @@
#include "display/nr-filter.h"
#include "display/nr-filter-convolve-matrix.h"
-/* FeConvolveMatrix base class */
-static void sp_feConvolveMatrix_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feConvolveMatrix_release(SPObject *object);
-static void sp_feConvolveMatrix_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feConvolveMatrix_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feConvolveMatrix_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_feConvolveMatrix_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
+#include "sp-factory.h"
-G_DEFINE_TYPE(SPFeConvolveMatrix, sp_feConvolveMatrix, SP_TYPE_FILTER_PRIMITIVE);
+namespace {
+ SPObject* createConvolveMatrix() {
+ return new SPFeConvolveMatrix();
+ }
-static void
-sp_feConvolveMatrix_class_init(SPFeConvolveMatrixClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
-
- sp_object_class->build = sp_feConvolveMatrix_build;
- sp_object_class->release = sp_feConvolveMatrix_release;
- sp_object_class->write = sp_feConvolveMatrix_write;
- sp_object_class->set = sp_feConvolveMatrix_set;
- sp_object_class->update = sp_feConvolveMatrix_update;
-
- sp_primitive_class->build_renderer = sp_feConvolveMatrix_build_renderer;
+ bool convolveMatrixRegistered = SPFactory::instance().registerObject("svg:feConvolveMatrix", createConvolveMatrix);
}
-static void
-sp_feConvolveMatrix_init(SPFeConvolveMatrix *feConvolveMatrix)
-{
+SPFeConvolveMatrix::SPFeConvolveMatrix() : SPFilterPrimitive() {
+ this->bias = 0;
+ this->divisorIsSet = 0;
+ this->divisor = 0;
+
//Setting default values:
- feConvolveMatrix->order.set("3 3");
- feConvolveMatrix->targetX = 1;
- feConvolveMatrix->targetY = 1;
- feConvolveMatrix->edgeMode = Inkscape::Filters::CONVOLVEMATRIX_EDGEMODE_DUPLICATE;
- feConvolveMatrix->preserveAlpha = false;
+ this->order.set("3 3");
+ this->targetX = 1;
+ this->targetY = 1;
+ this->edgeMode = Inkscape::Filters::CONVOLVEMATRIX_EDGEMODE_DUPLICATE;
+ this->preserveAlpha = false;
//some helper variables:
- feConvolveMatrix->targetXIsSet = false;
- feConvolveMatrix->targetYIsSet = false;
- feConvolveMatrix->kernelMatrixIsSet = false;
+ this->targetXIsSet = false;
+ this->targetYIsSet = false;
+ this->kernelMatrixIsSet = false;
+}
+
+SPFeConvolveMatrix::~SPFeConvolveMatrix() {
}
/**
@@ -74,59 +64,58 @@ sp_feConvolveMatrix_init(SPFeConvolveMatrix *feConvolveMatrix)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feConvolveMatrix_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_feConvolveMatrix_parent_class)->build) {
- ((SPObjectClass *) sp_feConvolveMatrix_parent_class)->build(object, document, repr);
- }
+void SPFeConvolveMatrix::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
- /*LOAD ATTRIBUTES FROM REPR HERE*/
- object->readAttr( "order" );
- object->readAttr( "kernelMatrix" );
- object->readAttr( "divisor" );
- object->readAttr( "bias" );
- object->readAttr( "targetX" );
- object->readAttr( "targetY" );
- object->readAttr( "edgeMode" );
- object->readAttr( "kernelUnitLength" );
- object->readAttr( "preserveAlpha" );
+ /*LOAD ATTRIBUTES FROM REPR HERE*/
+ this->readAttr( "order" );
+ this->readAttr( "kernelMatrix" );
+ this->readAttr( "divisor" );
+ this->readAttr( "bias" );
+ this->readAttr( "targetX" );
+ this->readAttr( "targetY" );
+ this->readAttr( "edgeMode" );
+ this->readAttr( "kernelUnitLength" );
+ this->readAttr( "preserveAlpha" );
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feConvolveMatrix_release(SPObject *object)
-{
- if (((SPObjectClass *) sp_feConvolveMatrix_parent_class)->release)
- ((SPObjectClass *) sp_feConvolveMatrix_parent_class)->release(object);
+void SPFeConvolveMatrix::release() {
+ SPFilterPrimitive::release();
}
static Inkscape::Filters::FilterConvolveMatrixEdgeMode sp_feConvolveMatrix_read_edgeMode(gchar const *value){
- if (!value) return Inkscape::Filters::CONVOLVEMATRIX_EDGEMODE_DUPLICATE; //duplicate is default
- switch(value[0]){
+ if (!value) {
+ return Inkscape::Filters::CONVOLVEMATRIX_EDGEMODE_DUPLICATE; //duplicate is default
+ }
+
+ switch (value[0]) {
case 'd':
- if (strncmp(value, "duplicate", 9) == 0) return Inkscape::Filters::CONVOLVEMATRIX_EDGEMODE_DUPLICATE;
+ if (strncmp(value, "duplicate", 9) == 0) {
+ return Inkscape::Filters::CONVOLVEMATRIX_EDGEMODE_DUPLICATE;
+ }
break;
case 'w':
- if (strncmp(value, "wrap", 4) == 0) return Inkscape::Filters::CONVOLVEMATRIX_EDGEMODE_WRAP;
+ if (strncmp(value, "wrap", 4) == 0) {
+ return Inkscape::Filters::CONVOLVEMATRIX_EDGEMODE_WRAP;
+ }
break;
case 'n':
- if (strncmp(value, "none", 4) == 0) return Inkscape::Filters::CONVOLVEMATRIX_EDGEMODE_NONE;
+ if (strncmp(value, "none", 4) == 0) {
+ return Inkscape::Filters::CONVOLVEMATRIX_EDGEMODE_NONE;
+ }
break;
}
+
return Inkscape::Filters::CONVOLVEMATRIX_EDGEMODE_DUPLICATE; //duplicate is default
}
/**
* Sets a specific value in the SPFeConvolveMatrix.
*/
-static void
-sp_feConvolveMatrix_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeConvolveMatrix *feConvolveMatrix = SP_FECONVOLVEMATRIX(object);
- (void)feConvolveMatrix;
+void SPFeConvolveMatrix::set(unsigned int key, gchar const *value) {
double read_num;
int read_int;
bool read_bool;
@@ -135,25 +124,41 @@ sp_feConvolveMatrix_set(SPObject *object, unsigned int key, gchar const *value)
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
case SP_ATTR_ORDER:
- feConvolveMatrix->order.set(value);
+ this->order.set(value);
+
//From SVG spec: If <orderY> is not provided, it defaults to <orderX>.
- if (feConvolveMatrix->order.optNumIsSet() == false)
- feConvolveMatrix->order.setOptNumber(feConvolveMatrix->order.getNumber());
- if (feConvolveMatrix->targetXIsSet == false) feConvolveMatrix->targetX = (int) floor(feConvolveMatrix->order.getNumber()/2);
- if (feConvolveMatrix->targetYIsSet == false) feConvolveMatrix->targetY = (int) floor(feConvolveMatrix->order.getOptNumber()/2);
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ if (this->order.optNumIsSet() == false) {
+ this->order.setOptNumber(this->order.getNumber());
+ }
+
+ if (this->targetXIsSet == false) {
+ this->targetX = (int) floor(this->order.getNumber()/2);
+ }
+
+ if (this->targetYIsSet == false) {
+ this->targetY = (int) floor(this->order.getOptNumber()/2);
+ }
+
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_KERNELMATRIX:
if (value){
- feConvolveMatrix->kernelMatrixIsSet = true;
- feConvolveMatrix->kernelMatrix = helperfns_read_vector(value);
- if (! feConvolveMatrix->divisorIsSet) {
- feConvolveMatrix->divisor = 0;
- for (unsigned int i = 0; i< feConvolveMatrix->kernelMatrix.size(); i++)
- feConvolveMatrix->divisor += feConvolveMatrix->kernelMatrix[i];
- if (feConvolveMatrix->divisor == 0) feConvolveMatrix->divisor = 1;
+ this->kernelMatrixIsSet = true;
+ this->kernelMatrix = helperfns_read_vector(value);
+
+ if (! this->divisorIsSet) {
+ this->divisor = 0;
+
+ for (unsigned int i = 0; i< this->kernelMatrix.size(); i++) {
+ this->divisor += this->kernelMatrix[i];
+ }
+
+ if (this->divisor == 0) {
+ this->divisor = 1;
+ }
}
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
} else {
g_warning("For feConvolveMatrix you MUST pass a kernelMatrix parameter!");
}
@@ -161,85 +166,104 @@ sp_feConvolveMatrix_set(SPObject *object, unsigned int key, gchar const *value)
case SP_ATTR_DIVISOR:
if (value) {
read_num = helperfns_read_number(value);
+
if (read_num == 0) {
// This should actually be an error, but given our UI it is more useful to simply set divisor to the default.
- if (feConvolveMatrix->kernelMatrixIsSet) {
- for (unsigned int i = 0; i< feConvolveMatrix->kernelMatrix.size(); i++)
- read_num += feConvolveMatrix->kernelMatrix[i];
+ if (this->kernelMatrixIsSet) {
+ for (unsigned int i = 0; i< this->kernelMatrix.size(); i++) {
+ read_num += this->kernelMatrix[i];
+ }
}
- if (read_num == 0) read_num = 1;
- if (feConvolveMatrix->divisorIsSet || feConvolveMatrix->divisor!=read_num) {
- feConvolveMatrix->divisorIsSet = false;
- feConvolveMatrix->divisor = read_num;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_num == 0) {
+ read_num = 1;
}
- } else if (!feConvolveMatrix->divisorIsSet || feConvolveMatrix->divisor!=read_num) {
- feConvolveMatrix->divisorIsSet = true;
- feConvolveMatrix->divisor = read_num;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->divisorIsSet || this->divisor!=read_num) {
+ this->divisorIsSet = false;
+ this->divisor = read_num;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ }
+ } else if (!this->divisorIsSet || this->divisor!=read_num) {
+ this->divisorIsSet = true;
+ this->divisor = read_num;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
}
break;
case SP_ATTR_BIAS:
read_num = 0;
- if (value) read_num = helperfns_read_number(value);
- if (read_num != feConvolveMatrix->bias){
- feConvolveMatrix->bias = read_num;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ if (value) {
+ read_num = helperfns_read_number(value);
+ }
+
+ if (read_num != this->bias){
+ this->bias = read_num;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_TARGETX:
if (value) {
read_int = (int) helperfns_read_number(value);
- if (read_int < 0 || read_int > feConvolveMatrix->order.getNumber()){
+
+ if (read_int < 0 || read_int > this->order.getNumber()){
g_warning("targetX must be a value between 0 and orderX! Assuming floor(orderX/2) as default value.");
- read_int = (int) floor(feConvolveMatrix->order.getNumber()/2.0);
+ read_int = (int) floor(this->order.getNumber()/2.0);
}
- feConvolveMatrix->targetXIsSet = true;
- if (read_int != feConvolveMatrix->targetX){
- feConvolveMatrix->targetX = read_int;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ this->targetXIsSet = true;
+
+ if (read_int != this->targetX){
+ this->targetX = read_int;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
}
break;
case SP_ATTR_TARGETY:
if (value) {
read_int = (int) helperfns_read_number(value);
- if (read_int < 0 || read_int > feConvolveMatrix->order.getOptNumber()){
+
+ if (read_int < 0 || read_int > this->order.getOptNumber()){
g_warning("targetY must be a value between 0 and orderY! Assuming floor(orderY/2) as default value.");
- read_int = (int) floor(feConvolveMatrix->order.getOptNumber()/2.0);
+ read_int = (int) floor(this->order.getOptNumber()/2.0);
}
- feConvolveMatrix->targetYIsSet = true;
- if (read_int != feConvolveMatrix->targetY){
- feConvolveMatrix->targetY = read_int;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ this->targetYIsSet = true;
+
+ if (read_int != this->targetY){
+ this->targetY = read_int;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
}
break;
case SP_ATTR_EDGEMODE:
read_mode = sp_feConvolveMatrix_read_edgeMode(value);
- if (read_mode != feConvolveMatrix->edgeMode){
- feConvolveMatrix->edgeMode = read_mode;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_mode != this->edgeMode){
+ this->edgeMode = read_mode;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_KERNELUNITLENGTH:
- feConvolveMatrix->kernelUnitLength.set(value);
+ this->kernelUnitLength.set(value);
+
//From SVG spec: If the <dy> value is not specified, it defaults to the same value as <dx>.
- if (feConvolveMatrix->kernelUnitLength.optNumIsSet() == false)
- feConvolveMatrix->kernelUnitLength.setOptNumber(feConvolveMatrix->kernelUnitLength.getNumber());
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ if (this->kernelUnitLength.optNumIsSet() == false) {
+ this->kernelUnitLength.setOptNumber(this->kernelUnitLength.getNumber());
+ }
+
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_PRESERVEALPHA:
read_bool = helperfns_read_bool(value, false);
- if (read_bool != feConvolveMatrix->preserveAlpha){
- feConvolveMatrix->preserveAlpha = read_bool;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_bool != this->preserveAlpha){
+ this->preserveAlpha = read_bool;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
default:
- if (((SPObjectClass *) sp_feConvolveMatrix_parent_class)->set)
- ((SPObjectClass *) sp_feConvolveMatrix_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
@@ -248,9 +272,7 @@ sp_feConvolveMatrix_set(SPObject *object, unsigned int key, gchar const *value)
/**
* Receives update notifications.
*/
-static void
-sp_feConvolveMatrix_update(SPObject *object, SPCtx *ctx, guint flags)
-{
+void SPFeConvolveMatrix::update(SPCtx *ctx, guint flags) {
if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
@@ -258,53 +280,44 @@ sp_feConvolveMatrix_update(SPObject *object, SPCtx *ctx, guint flags)
}
- if (((SPObjectClass *) sp_feConvolveMatrix_parent_class)->update) {
- ((SPObjectClass *) sp_feConvolveMatrix_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feConvolveMatrix_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
+Inkscape::XML::Node* SPFeConvolveMatrix::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if (((SPObjectClass *) sp_feConvolveMatrix_parent_class)->write) {
- ((SPObjectClass *) sp_feConvolveMatrix_parent_class)->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
-static void sp_feConvolveMatrix_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeConvolveMatrix::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeConvolveMatrix *sp_convolve = SP_FECONVOLVEMATRIX(primitive);
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_CONVOLVEMATRIX);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterConvolveMatrix *nr_convolve = dynamic_cast<Inkscape::Filters::FilterConvolveMatrix*>(nr_primitive);
g_assert(nr_convolve != NULL);
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
-
- nr_convolve->set_targetX(sp_convolve->targetX);
- nr_convolve->set_targetY(sp_convolve->targetY);
- nr_convolve->set_orderX( (int)sp_convolve->order.getNumber() );
- nr_convolve->set_orderY( (int)sp_convolve->order.getOptNumber() );
- nr_convolve->set_kernelMatrix(sp_convolve->kernelMatrix);
- nr_convolve->set_divisor(sp_convolve->divisor);
- nr_convolve->set_bias(sp_convolve->bias);
- nr_convolve->set_preserveAlpha(sp_convolve->preserveAlpha);
+ sp_filter_primitive_renderer_common(this, nr_primitive);
+ nr_convolve->set_targetX(this->targetX);
+ nr_convolve->set_targetY(this->targetY);
+ nr_convolve->set_orderX( (int)this->order.getNumber() );
+ nr_convolve->set_orderY( (int)this->order.getOptNumber() );
+ nr_convolve->set_kernelMatrix(this->kernelMatrix);
+ nr_convolve->set_divisor(this->divisor);
+ nr_convolve->set_bias(this->bias);
+ nr_convolve->set_preserveAlpha(this->preserveAlpha);
}
/*
Local Variables:
diff --git a/src/filters/convolvematrix.h b/src/filters/convolvematrix.h
index cb2fbfb8d..9783eaa47 100644
--- a/src/filters/convolvematrix.h
+++ b/src/filters/convolvematrix.h
@@ -18,13 +18,14 @@
#include "number-opt-number.h"
#include "display/nr-filter-convolve-matrix.h"
-#define SP_TYPE_FECONVOLVEMATRIX (sp_feConvolveMatrix_get_type())
-#define SP_FECONVOLVEMATRIX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FECONVOLVEMATRIX, SPFeConvolveMatrix))
-#define SP_FECONVOLVEMATRIX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FECONVOLVEMATRIX, SPFeConvolveMatrixClass))
-#define SP_IS_FECONVOLVEMATRIX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FECONVOLVEMATRIX))
-#define SP_IS_FECONVOLVEMATRIX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FECONVOLVEMATRIX))
+#define SP_FECONVOLVEMATRIX(obj) (dynamic_cast<SPFeConvolveMatrix*>((SPObject*)obj))
+#define SP_IS_FECONVOLVEMATRIX(obj) (dynamic_cast<const SPFeConvolveMatrix*>((SPObject*)obj) != NULL)
+
+class SPFeConvolveMatrix : public SPFilterPrimitive {
+public:
+ SPFeConvolveMatrix();
+ virtual ~SPFeConvolveMatrix();
-struct SPFeConvolveMatrix : public SPFilterPrimitive {
NumberOptNumber order;
std::vector<gdouble> kernelMatrix;
double divisor, bias;
@@ -37,13 +38,19 @@ struct SPFeConvolveMatrix : public SPFilterPrimitive {
bool targetYIsSet;
bool divisorIsSet;
bool kernelMatrixIsSet;
-};
-struct SPFeConvolveMatrixClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void set(unsigned int key, const gchar* value);
-GType sp_feConvolveMatrix_get_type();
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FECONVOLVEMATRIX_H_SEEN */
diff --git a/src/filters/diffuselighting.cpp b/src/filters/diffuselighting.cpp
index 66dd825f6..09179a69d 100644
--- a/src/filters/diffuselighting.cpp
+++ b/src/filters/diffuselighting.cpp
@@ -34,57 +34,33 @@
#include "display/nr-filter-diffuselighting.h"
/* FeDiffuseLighting base class */
-static void sp_feDiffuseLighting_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feDiffuseLighting_release(SPObject *object);
-static void sp_feDiffuseLighting_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feDiffuseLighting_update(SPObject *object, SPCtx *ctx, guint flags);
-//we assume that svg:feDiffuseLighting can have any number of children
-//only the first one is considered as the light source of the filter
-//TODO is that right?
-//if not modify child_added and remove_child to raise errors
-static void sp_feDiffuseLighting_child_added(SPObject *object,
- Inkscape::XML::Node *child,
- Inkscape::XML::Node *ref);
-static void sp_feDiffuseLighting_remove_child(SPObject *object, Inkscape::XML::Node *child);
-static void sp_feDiffuseLighting_order_changed(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref);
-static Inkscape::XML::Node *sp_feDiffuseLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_feDiffuseLighting_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
static void sp_feDiffuseLighting_children_modified(SPFeDiffuseLighting *sp_diffuselighting);
-G_DEFINE_TYPE(SPFeDiffuseLighting, sp_feDiffuseLighting, SP_TYPE_FILTER_PRIMITIVE);
+#include "sp-factory.h"
-static void
-sp_feDiffuseLighting_class_init(SPFeDiffuseLightingClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
-
- sp_object_class->build = sp_feDiffuseLighting_build;
- sp_object_class->release = sp_feDiffuseLighting_release;
- sp_object_class->write = sp_feDiffuseLighting_write;
- sp_object_class->set = sp_feDiffuseLighting_set;
- sp_object_class->update = sp_feDiffuseLighting_update;
- sp_object_class->child_added = sp_feDiffuseLighting_child_added;
- sp_object_class->remove_child = sp_feDiffuseLighting_remove_child;
- sp_object_class->order_changed = sp_feDiffuseLighting_order_changed;
-
- sp_primitive_class->build_renderer = sp_feDiffuseLighting_build_renderer;
+namespace {
+ SPObject* createDiffuseLighting() {
+ return new SPFeDiffuseLighting();
+ }
+
+ bool diffuseLightingRegistered = SPFactory::instance().registerObject("svg:feDiffuseLighting", createDiffuseLighting);
}
-static void
-sp_feDiffuseLighting_init(SPFeDiffuseLighting *feDiffuseLighting)
-{
- feDiffuseLighting->surfaceScale = 1;
- feDiffuseLighting->diffuseConstant = 1;
- feDiffuseLighting->lighting_color = 0xffffffff;
- feDiffuseLighting->icc = NULL;
+SPFeDiffuseLighting::SPFeDiffuseLighting() : SPFilterPrimitive() {
+ this->surfaceScale = 1;
+ this->diffuseConstant = 1;
+ this->lighting_color = 0xffffffff;
+ this->icc = NULL;
//TODO kernelUnit
- feDiffuseLighting->renderer = NULL;
+ this->renderer = NULL;
- feDiffuseLighting->surfaceScale_set = FALSE;
- feDiffuseLighting->diffuseConstant_set = FALSE;
- feDiffuseLighting->lighting_color_set = FALSE;
+ this->surfaceScale_set = FALSE;
+ this->diffuseConstant_set = FALSE;
+ this->lighting_color_set = FALSE;
+}
+
+SPFeDiffuseLighting::~SPFeDiffuseLighting() {
}
/**
@@ -92,175 +68,175 @@ sp_feDiffuseLighting_init(SPFeDiffuseLighting *feDiffuseLighting)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feDiffuseLighting_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_feDiffuseLighting_parent_class)->build) {
- ((SPObjectClass *) sp_feDiffuseLighting_parent_class)->build(object, document, repr);
- }
-
- /*LOAD ATTRIBUTES FROM REPR HERE*/
- object->readAttr( "surfaceScale" );
- object->readAttr( "diffuseConstant" );
- object->readAttr( "kernelUnitLength" );
- object->readAttr( "lighting-color" );
-
+void SPFeDiffuseLighting::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
+
+ /*LOAD ATTRIBUTES FROM REPR HERE*/
+ this->readAttr( "surfaceScale" );
+ this->readAttr( "diffuseConstant" );
+ this->readAttr( "kernelUnitLength" );
+ this->readAttr( "lighting-color" );
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feDiffuseLighting_release(SPObject *object)
-{
- if (((SPObjectClass *) sp_feDiffuseLighting_parent_class)->release)
- ((SPObjectClass *) sp_feDiffuseLighting_parent_class)->release(object);
+void SPFeDiffuseLighting::release() {
+ SPFilterPrimitive::release();
}
/**
* Sets a specific value in the SPFeDiffuseLighting.
*/
-static void
-sp_feDiffuseLighting_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeDiffuseLighting *feDiffuseLighting = SP_FEDIFFUSELIGHTING(object);
+void SPFeDiffuseLighting::set(unsigned int key, gchar const *value) {
gchar const *cend_ptr = NULL;
gchar *end_ptr = NULL;
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
-//TODO test forbidden values
+ //TODO test forbidden values
case SP_ATTR_SURFACESCALE:
end_ptr = NULL;
+
if (value) {
- feDiffuseLighting->surfaceScale = g_ascii_strtod(value, &end_ptr);
+ this->surfaceScale = g_ascii_strtod(value, &end_ptr);
+
if (end_ptr) {
- feDiffuseLighting->surfaceScale_set = TRUE;
+ this->surfaceScale_set = TRUE;
}
}
+
if (!value || !end_ptr) {
- feDiffuseLighting->surfaceScale = 1;
- feDiffuseLighting->surfaceScale_set = FALSE;
+ this->surfaceScale = 1;
+ this->surfaceScale_set = FALSE;
}
- if (feDiffuseLighting->renderer) {
- feDiffuseLighting->renderer->surfaceScale = feDiffuseLighting->surfaceScale;
+
+ if (this->renderer) {
+ this->renderer->surfaceScale = this->surfaceScale;
}
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_DIFFUSECONSTANT:
end_ptr = NULL;
+
if (value) {
- feDiffuseLighting->diffuseConstant = g_ascii_strtod(value, &end_ptr);
- if (end_ptr && feDiffuseLighting->diffuseConstant >= 0) {
- feDiffuseLighting->diffuseConstant_set = TRUE;
+ this->diffuseConstant = g_ascii_strtod(value, &end_ptr);
+
+ if (end_ptr && this->diffuseConstant >= 0) {
+ this->diffuseConstant_set = TRUE;
} else {
end_ptr = NULL;
- g_warning("feDiffuseLighting: diffuseConstant should be a positive number ... defaulting to 1");
+ g_warning("this: diffuseConstant should be a positive number ... defaulting to 1");
}
}
+
if (!value || !end_ptr) {
- feDiffuseLighting->diffuseConstant = 1;
- feDiffuseLighting->diffuseConstant_set = FALSE;
+ this->diffuseConstant = 1;
+ this->diffuseConstant_set = FALSE;
}
- if (feDiffuseLighting->renderer) {
- feDiffuseLighting->renderer->diffuseConstant = feDiffuseLighting->diffuseConstant;
- }
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->renderer) {
+ this->renderer->diffuseConstant = this->diffuseConstant;
+ }
+
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_KERNELUNITLENGTH:
//TODO kernelUnit
- //feDiffuseLighting->kernelUnitLength.set(value);
+ //this->kernelUnitLength.set(value);
/*TODOif (feDiffuseLighting->renderer) {
feDiffuseLighting->renderer->surfaceScale = feDiffuseLighting->renderer;
}
*/
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_PROP_LIGHTING_COLOR:
cend_ptr = NULL;
- feDiffuseLighting->lighting_color = sp_svg_read_color(value, &cend_ptr, 0xffffffff);
+ this->lighting_color = sp_svg_read_color(value, &cend_ptr, 0xffffffff);
+
//if a value was read
if (cend_ptr) {
while (g_ascii_isspace(*cend_ptr)) {
++cend_ptr;
}
+
if (strneq(cend_ptr, "icc-color(", 10)) {
- if (!feDiffuseLighting->icc) feDiffuseLighting->icc = new SVGICCColor();
- if ( ! sp_svg_read_icc_color( cend_ptr, feDiffuseLighting->icc ) ) {
- delete feDiffuseLighting->icc;
- feDiffuseLighting->icc = NULL;
+ if (!this->icc) {
+ this->icc = new SVGICCColor();
+ }
+
+ if ( ! sp_svg_read_icc_color( cend_ptr, this->icc ) ) {
+ delete this->icc;
+ this->icc = NULL;
}
}
- feDiffuseLighting->lighting_color_set = TRUE;
+
+ this->lighting_color_set = TRUE;
} else {
//lighting_color already contains the default value
- feDiffuseLighting->lighting_color_set = FALSE;
+ this->lighting_color_set = FALSE;
}
- if (feDiffuseLighting->renderer) {
- feDiffuseLighting->renderer->lighting_color = feDiffuseLighting->lighting_color;
+
+ if (this->renderer) {
+ this->renderer->lighting_color = this->lighting_color;
}
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
default:
- if (((SPObjectClass *) sp_feDiffuseLighting_parent_class)->set)
- ((SPObjectClass *) sp_feDiffuseLighting_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
-
}
/**
* Receives update notifications.
*/
-static void
-sp_feDiffuseLighting_update(SPObject *object, SPCtx *ctx, guint flags)
-{
+void SPFeDiffuseLighting::update(SPCtx *ctx, guint flags) {
if (flags & (SP_OBJECT_MODIFIED_FLAG)) {
- object->readAttr( "surfaceScale" );
- object->readAttr( "diffuseConstant" );
- object->readAttr( "kernelUnit" );
- object->readAttr( "lighting-color" );
+ this->readAttr( "surfaceScale" );
+ this->readAttr( "diffuseConstant" );
+ this->readAttr( "kernelUnit" );
+ this->readAttr( "lighting-color" );
}
- if (((SPObjectClass *) sp_feDiffuseLighting_parent_class)->update) {
- ((SPObjectClass *) sp_feDiffuseLighting_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feDiffuseLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
- SPFeDiffuseLighting *fediffuselighting = SP_FEDIFFUSELIGHTING(object);
-
+Inkscape::XML::Node* SPFeDiffuseLighting::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values _and children_ into it */
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
//repr = doc->createElement("svg:feDiffuseLighting");
}
- if (fediffuselighting->surfaceScale_set)
- sp_repr_set_css_double(repr, "surfaceScale", fediffuselighting->surfaceScale);
- else
+ if (this->surfaceScale_set) {
+ sp_repr_set_css_double(repr, "surfaceScale", this->surfaceScale);
+ } else {
repr->setAttribute("surfaceScale", NULL);
- if (fediffuselighting->diffuseConstant_set)
- sp_repr_set_css_double(repr, "diffuseConstant", fediffuselighting->diffuseConstant);
- else
+ }
+
+ if (this->diffuseConstant_set) {
+ sp_repr_set_css_double(repr, "diffuseConstant", this->diffuseConstant);
+ } else {
repr->setAttribute("diffuseConstant", NULL);
- /*TODO kernelUnits */
- if (fediffuselighting->lighting_color_set) {
+ }
+
+ /*TODO kernelUnits */
+ if (this->lighting_color_set) {
gchar c[64];
- sp_svg_write_color(c, sizeof(c), fediffuselighting->lighting_color);
+ sp_svg_write_color(c, sizeof(c), this->lighting_color);
repr->setAttribute("lighting-color", c);
- } else
+ } else {
repr->setAttribute("lighting-color", NULL);
-
- if (((SPObjectClass *) sp_feDiffuseLighting_parent_class)->write) {
- ((SPObjectClass *) sp_feDiffuseLighting_parent_class)->write(object, doc, repr, flags);
}
+
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
@@ -268,43 +244,28 @@ sp_feDiffuseLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inksc
/**
* Callback for child_added event.
*/
-static void
-sp_feDiffuseLighting_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref)
-{
- SPFeDiffuseLighting *f = SP_FEDIFFUSELIGHTING(object);
-
- if (((SPObjectClass *) sp_feDiffuseLighting_parent_class)->child_added)
- (* ((SPObjectClass *) sp_feDiffuseLighting_parent_class)->child_added)(object, child, ref);
+void SPFeDiffuseLighting::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) {
+ SPFilterPrimitive::child_added(child, ref);
- sp_feDiffuseLighting_children_modified(f);
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ sp_feDiffuseLighting_children_modified(this);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
-
/**
* Callback for remove_child event.
*/
-static void
-sp_feDiffuseLighting_remove_child(SPObject *object, Inkscape::XML::Node *child)
-{
- SPFeDiffuseLighting *f = SP_FEDIFFUSELIGHTING(object);
-
- if (((SPObjectClass *) sp_feDiffuseLighting_parent_class)->remove_child)
- (* ((SPObjectClass *) sp_feDiffuseLighting_parent_class)->remove_child)(object, child);
+void SPFeDiffuseLighting::remove_child(Inkscape::XML::Node *child) {
+ SPFilterPrimitive::remove_child(child);
- sp_feDiffuseLighting_children_modified(f);
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ sp_feDiffuseLighting_children_modified(this);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
-static void
-sp_feDiffuseLighting_order_changed (SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref)
-{
- SPFeDiffuseLighting *f = SP_FEDIFFUSELIGHTING(object);
- if (((SPObjectClass *) (sp_feDiffuseLighting_parent_class))->order_changed)
- (* ((SPObjectClass *) (sp_feDiffuseLighting_parent_class))->order_changed) (object, child, old_ref, new_ref);
+void SPFeDiffuseLighting::order_changed(Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref) {
+ SPFilterPrimitive::order_changed(child, old_ref, new_ref);
- sp_feDiffuseLighting_children_modified(f);
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ sp_feDiffuseLighting_children_modified(this);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
static void sp_feDiffuseLighting_children_modified(SPFeDiffuseLighting *sp_diffuselighting)
@@ -326,45 +287,45 @@ static void sp_feDiffuseLighting_children_modified(SPFeDiffuseLighting *sp_diffu
}
}
-static void sp_feDiffuseLighting_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeDiffuseLighting::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeDiffuseLighting *sp_diffuselighting = SP_FEDIFFUSELIGHTING(primitive);
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_DIFFUSELIGHTING);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterDiffuseLighting *nr_diffuselighting = dynamic_cast<Inkscape::Filters::FilterDiffuseLighting*>(nr_primitive);
g_assert(nr_diffuselighting != NULL);
- sp_diffuselighting->renderer = nr_diffuselighting;
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ this->renderer = nr_diffuselighting;
+ sp_filter_primitive_renderer_common(this, nr_primitive);
- nr_diffuselighting->diffuseConstant = sp_diffuselighting->diffuseConstant;
- nr_diffuselighting->surfaceScale = sp_diffuselighting->surfaceScale;
- nr_diffuselighting->lighting_color = sp_diffuselighting->lighting_color;
- nr_diffuselighting->set_icc(sp_diffuselighting->icc);
+ nr_diffuselighting->diffuseConstant = this->diffuseConstant;
+ nr_diffuselighting->surfaceScale = this->surfaceScale;
+ nr_diffuselighting->lighting_color = this->lighting_color;
+ nr_diffuselighting->set_icc(this->icc);
//We assume there is at most one child
nr_diffuselighting->light_type = Inkscape::Filters::NO_LIGHT;
- if (SP_IS_FEDISTANTLIGHT(primitive->children)) {
+
+ if (SP_IS_FEDISTANTLIGHT(this->children)) {
nr_diffuselighting->light_type = Inkscape::Filters::DISTANT_LIGHT;
- nr_diffuselighting->light.distant = SP_FEDISTANTLIGHT(primitive->children);
+ nr_diffuselighting->light.distant = SP_FEDISTANTLIGHT(this->children);
}
- if (SP_IS_FEPOINTLIGHT(primitive->children)) {
+
+ if (SP_IS_FEPOINTLIGHT(this->children)) {
nr_diffuselighting->light_type = Inkscape::Filters::POINT_LIGHT;
- nr_diffuselighting->light.point = SP_FEPOINTLIGHT(primitive->children);
+ nr_diffuselighting->light.point = SP_FEPOINTLIGHT(this->children);
}
- if (SP_IS_FESPOTLIGHT(primitive->children)) {
+
+ if (SP_IS_FESPOTLIGHT(this->children)) {
nr_diffuselighting->light_type = Inkscape::Filters::SPOT_LIGHT;
- nr_diffuselighting->light.spot = SP_FESPOTLIGHT(primitive->children);
+ nr_diffuselighting->light.spot = SP_FESPOTLIGHT(this->children);
}
//nr_offset->set_dx(sp_offset->dx);
//nr_offset->set_dy(sp_offset->dy);
}
-
/*
Local Variables:
mode:c++
diff --git a/src/filters/diffuselighting.h b/src/filters/diffuselighting.h
index 1572385b9..f41c6c056 100644
--- a/src/filters/diffuselighting.h
+++ b/src/filters/diffuselighting.h
@@ -15,11 +15,8 @@
#include "sp-filter-primitive.h"
#include "number-opt-number.h"
-#define SP_TYPE_FEDIFFUSELIGHTING (sp_feDiffuseLighting_get_type())
-#define SP_FEDIFFUSELIGHTING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEDIFFUSELIGHTING, SPFeDiffuseLighting))
-#define SP_FEDIFFUSELIGHTING_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FEDIFFUSELIGHTING, SPFeDiffuseLightingClass))
-#define SP_IS_FEDIFFUSELIGHTING(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEDIFFUSELIGHTING))
-#define SP_IS_FEDIFFUSELIGHTING_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FEDIFFUSELIGHTING))
+#define SP_FEDIFFUSELIGHTING(obj) (dynamic_cast<SPFeDiffuseLighting*>((SPObject*)obj))
+#define SP_IS_FEDIFFUSELIGHTING(obj) (dynamic_cast<const SPFeDiffuseLighting*>((SPObject*)obj) != NULL)
struct SVGICCColor;
@@ -28,7 +25,11 @@ namespace Filters {
class FilterDiffuseLighting;
} }
-struct SPFeDiffuseLighting : public SPFilterPrimitive {
+class SPFeDiffuseLighting : public SPFilterPrimitive {
+public:
+ SPFeDiffuseLighting();
+ virtual ~SPFeDiffuseLighting();
+
gfloat surfaceScale;
guint surfaceScale_set : 1;
gfloat diffuseConstant;
@@ -38,13 +39,24 @@ struct SPFeDiffuseLighting : public SPFilterPrimitive {
guint lighting_color_set : 1;
Inkscape::Filters::FilterDiffuseLighting *renderer;
SVGICCColor *icc;
-};
-struct SPFeDiffuseLightingClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
+ virtual void remove_child(Inkscape::XML::Node* child);
+
+ virtual void order_changed(Inkscape::XML::Node* child, Inkscape::XML::Node* old_repr, Inkscape::XML::Node* new_repr);
-GType sp_feDiffuseLighting_get_type();
+ virtual void set(unsigned int key, const gchar* value);
+
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FEDIFFUSELIGHTING_H_SEEN */
diff --git a/src/filters/displacementmap.cpp b/src/filters/displacementmap.cpp
index 408ffce9e..473e4913f 100644
--- a/src/filters/displacementmap.cpp
+++ b/src/filters/displacementmap.cpp
@@ -25,37 +25,24 @@
#include "display/nr-filter.h"
#include "display/nr-filter-displacement-map.h"
-/* FeDisplacementMap base class */
-static void sp_feDisplacementMap_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feDisplacementMap_release(SPObject *object);
-static void sp_feDisplacementMap_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feDisplacementMap_update(SPObject *object, SPCtx *ctx, guint flags);
-static void sp_feDisplacementMap_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
-static Inkscape::XML::Node *sp_feDisplacementMap_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-
-G_DEFINE_TYPE(SPFeDisplacementMap, sp_feDisplacementMap, SP_TYPE_FILTER_PRIMITIVE);
-
-static void
-sp_feDisplacementMap_class_init(SPFeDisplacementMapClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
-
- sp_object_class->build = sp_feDisplacementMap_build;
- sp_object_class->release = sp_feDisplacementMap_release;
- sp_object_class->write = sp_feDisplacementMap_write;
- sp_object_class->set = sp_feDisplacementMap_set;
- sp_object_class->update = sp_feDisplacementMap_update;
- sp_primitive_class->build_renderer = sp_feDisplacementMap_build_renderer;
+#include "sp-factory.h"
+
+namespace {
+ SPObject* createDisplacementMap() {
+ return new SPFeDisplacementMap();
+ }
+
+ bool displacementMapRegistered = SPFactory::instance().registerObject("svg:feDisplacementMap", createDisplacementMap);
}
-static void
-sp_feDisplacementMap_init(SPFeDisplacementMap *feDisplacementMap)
-{
- feDisplacementMap->scale=0;
- feDisplacementMap->xChannelSelector = DISPLACEMENTMAP_CHANNEL_ALPHA;
- feDisplacementMap->yChannelSelector = DISPLACEMENTMAP_CHANNEL_ALPHA;
- feDisplacementMap->in2 = Inkscape::Filters::NR_FILTER_SLOT_NOT_SET;
+SPFeDisplacementMap::SPFeDisplacementMap() : SPFilterPrimitive() {
+ this->scale=0;
+ this->xChannelSelector = DISPLACEMENTMAP_CHANNEL_ALPHA;
+ this->yChannelSelector = DISPLACEMENTMAP_CHANNEL_ALPHA;
+ this->in2 = Inkscape::Filters::NR_FILTER_SLOT_NOT_SET;
+}
+
+SPFeDisplacementMap::~SPFeDisplacementMap() {
}
/**
@@ -63,44 +50,37 @@ sp_feDisplacementMap_init(SPFeDisplacementMap *feDisplacementMap)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feDisplacementMap_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_feDisplacementMap_parent_class)->build) {
- ((SPObjectClass *) sp_feDisplacementMap_parent_class)->build(object, document, repr);
- }
-
- /*LOAD ATTRIBUTES FROM REPR HERE*/
- object->readAttr( "scale" );
- object->readAttr( "in2" );
- object->readAttr( "xChannelSelector" );
- object->readAttr( "yChannelSelector" );
-
- /* Unlike normal in, in2 is required attribute. Make sure, we can call
- * it by some name. */
- SPFeDisplacementMap *disp = SP_FEDISPLACEMENTMAP(object);
- if (disp->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
- disp->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
- {
- SPFilter *parent = SP_FILTER(object->parent);
- disp->in2 = sp_filter_primitive_name_previous_out(disp);
- repr->setAttribute("in2", sp_filter_name_for_image(parent, disp->in2));
- }
+void SPFeDisplacementMap::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
+
+ /*LOAD ATTRIBUTES FROM REPR HERE*/
+ this->readAttr( "scale" );
+ this->readAttr( "in2" );
+ this->readAttr( "xChannelSelector" );
+ this->readAttr( "yChannelSelector" );
+
+ /* Unlike normal in, in2 is required attribute. Make sure, we can call
+ * it by some name. */
+ if (this->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
+ this->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
+ {
+ SPFilter *parent = SP_FILTER(this->parent);
+ this->in2 = sp_filter_primitive_name_previous_out(this);
+ repr->setAttribute("in2", sp_filter_name_for_image(parent, this->in2));
+ }
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feDisplacementMap_release(SPObject *object)
-{
- if (((SPObjectClass *) sp_feDisplacementMap_parent_class)->release)
- ((SPObjectClass *) sp_feDisplacementMap_parent_class)->release(object);
+void SPFeDisplacementMap::release() {
+ SPFilterPrimitive::release();
}
static FilterDisplacementMapChannelSelector sp_feDisplacementMap_readChannelSelector(gchar const *value)
{
if (!value) return DISPLACEMENTMAP_CHANNEL_ALPHA;
+
switch (value[0]) {
case 'R':
return DISPLACEMENTMAP_CHANNEL_RED;
@@ -119,64 +99,62 @@ static FilterDisplacementMapChannelSelector sp_feDisplacementMap_readChannelSele
g_warning("Invalid attribute for Channel Selector. Valid modes are 'R', 'G', 'B' or 'A'");
break;
}
+
return DISPLACEMENTMAP_CHANNEL_ALPHA; //default is Alpha Channel
}
/**
* Sets a specific value in the SPFeDisplacementMap.
*/
-static void
-sp_feDisplacementMap_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeDisplacementMap *feDisplacementMap = SP_FEDISPLACEMENTMAP(object);
- (void)feDisplacementMap;
+void SPFeDisplacementMap::set(unsigned int key, gchar const *value) {
int input;
double read_num;
FilterDisplacementMapChannelSelector read_selector;
+
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
case SP_ATTR_XCHANNELSELECTOR:
read_selector = sp_feDisplacementMap_readChannelSelector(value);
- if (read_selector != feDisplacementMap->xChannelSelector){
- feDisplacementMap->xChannelSelector = read_selector;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_selector != this->xChannelSelector){
+ this->xChannelSelector = read_selector;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_YCHANNELSELECTOR:
read_selector = sp_feDisplacementMap_readChannelSelector(value);
- if (read_selector != feDisplacementMap->yChannelSelector){
- feDisplacementMap->yChannelSelector = read_selector;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_selector != this->yChannelSelector){
+ this->yChannelSelector = read_selector;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_SCALE:
read_num = value ? helperfns_read_number(value) : 0;
- if (read_num != feDisplacementMap->scale) {
- feDisplacementMap->scale = read_num;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_num != this->scale) {
+ this->scale = read_num;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_IN2:
- input = sp_filter_primitive_read_in(feDisplacementMap, value);
- if (input != feDisplacementMap->in2) {
- feDisplacementMap->in2 = input;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ input = sp_filter_primitive_read_in(this, value);
+
+ if (input != this->in2) {
+ this->in2 = input;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
default:
- if (((SPObjectClass *) sp_feDisplacementMap_parent_class)->set)
- ((SPObjectClass *) sp_feDisplacementMap_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
-
}
/**
* Receives update notifications.
*/
-static void
-sp_feDisplacementMap_update(SPObject *object, SPCtx *ctx, guint flags)
-{
+void SPFeDisplacementMap::update(SPCtx *ctx, guint flags) {
if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
@@ -186,20 +164,17 @@ sp_feDisplacementMap_update(SPObject *object, SPCtx *ctx, guint flags)
/* Unlike normal in, in2 is required attribute. Make sure, we can call
* it by some name. */
- SPFeDisplacementMap *disp = SP_FEDISPLACEMENTMAP(object);
- if (disp->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
- disp->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
+ if (this->in2 == Inkscape::Filters::NR_FILTER_SLOT_NOT_SET ||
+ this->in2 == Inkscape::Filters::NR_FILTER_UNNAMED_SLOT)
{
- SPFilter *parent = SP_FILTER(object->parent);
- disp->in2 = sp_filter_primitive_name_previous_out(disp);
+ SPFilter *parent = SP_FILTER(this->parent);
+ this->in2 = sp_filter_primitive_name_previous_out(this);
//XML Tree being used directly here while it shouldn't be.
- object->getRepr()->setAttribute("in2", sp_filter_name_for_image(parent, disp->in2));
+ this->getRepr()->setAttribute("in2", sp_filter_name_for_image(parent, this->in2));
}
- if (((SPObjectClass *) sp_feDisplacementMap_parent_class)->update) {
- ((SPObjectClass *) sp_feDisplacementMap_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
static char const * get_channelselector_name(FilterDisplacementMapChannelSelector selector) {
@@ -220,63 +195,60 @@ static char const * get_channelselector_name(FilterDisplacementMapChannelSelecto
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feDisplacementMap_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
- SPFeDisplacementMap *disp = SP_FEDISPLACEMENTMAP(object);
- SPFilter *parent = SP_FILTER(object->parent);
+Inkscape::XML::Node* SPFeDisplacementMap::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
+ SPFilter *parent = SP_FILTER(this->parent);
if (!repr) {
repr = doc->createElement("svg:feDisplacementMap");
}
- gchar const *out_name = sp_filter_name_for_image(parent, disp->in2);
+ gchar const *out_name = sp_filter_name_for_image(parent, this->in2);
if (out_name) {
repr->setAttribute("in2", out_name);
} else {
SPObject *i = parent->children;
- while (i && i->next != object) i = i->next;
+
+ while (i && i->next != this) {
+ i = i->next;
+ }
+
SPFilterPrimitive *i_prim = SP_FILTER_PRIMITIVE(i);
out_name = sp_filter_name_for_image(parent, i_prim->image_out);
repr->setAttribute("in2", out_name);
+
if (!out_name) {
g_warning("Unable to set in2 for feDisplacementMap");
}
}
- sp_repr_set_svg_double(repr, "scale", disp->scale);
+ sp_repr_set_svg_double(repr, "scale", this->scale);
repr->setAttribute("xChannelSelector",
- get_channelselector_name(disp->xChannelSelector));
+ get_channelselector_name(this->xChannelSelector));
repr->setAttribute("yChannelSelector",
- get_channelselector_name(disp->yChannelSelector));
+ get_channelselector_name(this->yChannelSelector));
- if (((SPObjectClass *) sp_feDisplacementMap_parent_class)->write) {
- ((SPObjectClass *) sp_feDisplacementMap_parent_class)->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
-static void sp_feDisplacementMap_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeDisplacementMap::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeDisplacementMap *sp_displacement_map = SP_FEDISPLACEMENTMAP(primitive);
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_DISPLACEMENTMAP);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterDisplacementMap *nr_displacement_map = dynamic_cast<Inkscape::Filters::FilterDisplacementMap*>(nr_primitive);
g_assert(nr_displacement_map != NULL);
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ sp_filter_primitive_renderer_common(this, nr_primitive);
- nr_displacement_map->set_input(1, sp_displacement_map->in2);
- nr_displacement_map->set_scale(sp_displacement_map->scale);
- nr_displacement_map->set_channel_selector(0, sp_displacement_map->xChannelSelector);
- nr_displacement_map->set_channel_selector(1, sp_displacement_map->yChannelSelector);
+ nr_displacement_map->set_input(1, this->in2);
+ nr_displacement_map->set_scale(this->scale);
+ nr_displacement_map->set_channel_selector(0, this->xChannelSelector);
+ nr_displacement_map->set_channel_selector(1, this->yChannelSelector);
}
-
/*
Local Variables:
mode:c++
diff --git a/src/filters/displacementmap.h b/src/filters/displacementmap.h
index 93dc86d27..85a6beaaa 100644
--- a/src/filters/displacementmap.h
+++ b/src/filters/displacementmap.h
@@ -14,11 +14,8 @@
#include "sp-filter-primitive.h"
-#define SP_TYPE_FEDISPLACEMENTMAP (sp_feDisplacementMap_get_type())
-#define SP_FEDISPLACEMENTMAP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEDISPLACEMENTMAP, SPFeDisplacementMap))
-#define SP_FEDISPLACEMENTMAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FEDISPLACEMENTMAP, SPFeDisplacementMapClass))
-#define SP_IS_FEDISPLACEMENTMAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEDISPLACEMENTMAP))
-#define SP_IS_FEDISPLACEMENTMAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FEDISPLACEMENTMAP))
+#define SP_FEDISPLACEMENTMAP(obj) (dynamic_cast<SPFeDisplacementMap*>((SPObject*)obj))
+#define SP_IS_FEDISPLACEMENTMAP(obj) (dynamic_cast<const SPFeDisplacementMap*>((SPObject*)obj) != NULL)
enum FilterDisplacementMapChannelSelector {
DISPLACEMENTMAP_CHANNEL_RED,
@@ -28,18 +25,28 @@ enum FilterDisplacementMapChannelSelector {
DISPLACEMENTMAP_CHANNEL_ENDTYPE
};
-struct SPFeDisplacementMap : public SPFilterPrimitive {
+class SPFeDisplacementMap : public SPFilterPrimitive {
+public:
+ SPFeDisplacementMap();
+ virtual ~SPFeDisplacementMap();
+
int in2;
double scale;
FilterDisplacementMapChannelSelector xChannelSelector;
FilterDisplacementMapChannelSelector yChannelSelector;
-};
-struct SPFeDisplacementMapClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void set(unsigned int key, const gchar* value);
-GType sp_feDisplacementMap_get_type();
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FEDISPLACEMENTMAP_H_SEEN */
diff --git a/src/filters/distantlight.cpp b/src/filters/distantlight.cpp
index 5e1c35a95..8b6ef023b 100644
--- a/src/filters/distantlight.cpp
+++ b/src/filters/distantlight.cpp
@@ -29,34 +29,11 @@
#define SP_MACROS_SILENT
#include "macros.h"
-/* FeDistantLight class */
-static void sp_fedistantlight_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_fedistantlight_release(SPObject *object);
-static void sp_fedistantlight_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_fedistantlight_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_fedistantlight_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-
-G_DEFINE_TYPE(SPFeDistantLight, sp_fedistantlight, SP_TYPE_OBJECT);
-
-static void
-sp_fedistantlight_class_init(SPFeDistantLightClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
-
- sp_object_class->build = sp_fedistantlight_build;
- sp_object_class->release = sp_fedistantlight_release;
- sp_object_class->write = sp_fedistantlight_write;
- sp_object_class->set = sp_fedistantlight_set;
- sp_object_class->update = sp_fedistantlight_update;
+SPFeDistantLight::SPFeDistantLight()
+ : SPObject(), azimuth(0), azimuth_set(FALSE), elevation(0), elevation_set(FALSE) {
}
-static void
-sp_fedistantlight_init(SPFeDistantLight *fedistantlight)
-{
- fedistantlight->azimuth = 0;
- fedistantlight->elevation = 0;
- fedistantlight->azimuth_set = FALSE;
- fedistantlight->elevation_set = FALSE;
+SPFeDistantLight::~SPFeDistantLight() {
}
/**
@@ -64,32 +41,24 @@ sp_fedistantlight_init(SPFeDistantLight *fedistantlight)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_fedistantlight_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_fedistantlight_parent_class)->build) {
- ((SPObjectClass *) sp_fedistantlight_parent_class)->build(object, document, repr);
- }
+void SPFeDistantLight::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPObject::build(document, repr);
//Read values of key attributes from XML nodes into object.
- object->readAttr( "azimuth" );
- object->readAttr( "elevation" );
+ this->readAttr( "azimuth" );
+ this->readAttr( "elevation" );
//is this necessary?
- document->addResource("fedistantlight", object);
+ document->addResource("fedistantlight", this);
}
/**
* Drops any allocated memory.
*/
-static void
-sp_fedistantlight_release(SPObject *object)
-{
- //SPFeDistantLight *fedistantlight = SP_FEDISTANTLIGHT(object);
-
- if ( object->document ) {
+void SPFeDistantLight::release() {
+ if ( this->document ) {
// Unregister ourselves
- object->document->removeResource("fedistantlight", object);
+ this->document->removeResource("fedistantlight", this);
}
//TODO: release resources here
@@ -98,53 +67,57 @@ sp_fedistantlight_release(SPObject *object)
/**
* Sets a specific value in the SPFeDistantLight.
*/
-static void
-sp_fedistantlight_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeDistantLight *fedistantlight = SP_FEDISTANTLIGHT(object);
+void SPFeDistantLight::set(unsigned int key, gchar const *value) {
gchar *end_ptr;
+
switch (key) {
case SP_ATTR_AZIMUTH:
end_ptr =NULL;
+
if (value) {
- fedistantlight->azimuth = g_ascii_strtod(value, &end_ptr);
+ this->azimuth = g_ascii_strtod(value, &end_ptr);
+
if (end_ptr) {
- fedistantlight->azimuth_set = TRUE;
+ this->azimuth_set = TRUE;
}
}
+
if (!value || !end_ptr) {
- fedistantlight->azimuth_set = FALSE;
- fedistantlight->azimuth = 0;
+ this->azimuth_set = FALSE;
+ this->azimuth = 0;
}
- if (object->parent &&
- (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
- SP_IS_FESPECULARLIGHTING(object->parent))) {
- object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->parent &&
+ (SP_IS_FEDIFFUSELIGHTING(this->parent) ||
+ SP_IS_FESPECULARLIGHTING(this->parent))) {
+ this->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_ELEVATION:
end_ptr =NULL;
+
if (value) {
- fedistantlight->elevation = g_ascii_strtod(value, &end_ptr);
+ this->elevation = g_ascii_strtod(value, &end_ptr);
+
if (end_ptr) {
- fedistantlight->elevation_set = TRUE;
+ this->elevation_set = TRUE;
}
}
+
if (!value || !end_ptr) {
- fedistantlight->elevation_set = FALSE;
- fedistantlight->elevation = 0;
+ this->elevation_set = FALSE;
+ this->elevation = 0;
}
- if (object->parent &&
- (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
- SP_IS_FESPECULARLIGHTING(object->parent))) {
- object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->parent &&
+ (SP_IS_FEDIFFUSELIGHTING(this->parent) ||
+ SP_IS_FESPECULARLIGHTING(this->parent))) {
+ this->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
default:
// See if any parents need this value.
- if (((SPObjectClass *) sp_fedistantlight_parent_class)->set) {
- ((SPObjectClass *) sp_fedistantlight_parent_class)->set(object, key, value);
- }
+ SPObject::set(key, value);
break;
}
}
@@ -152,44 +125,34 @@ sp_fedistantlight_set(SPObject *object, unsigned int key, gchar const *value)
/**
* * Receives update notifications.
* */
-static void
-sp_fedistantlight_update(SPObject *object, SPCtx *ctx, guint flags)
-{
- SPFeDistantLight *feDistantLight = SP_FEDISTANTLIGHT(object);
- (void)feDistantLight;
-
+void SPFeDistantLight::update(SPCtx *ctx, guint flags) {
if (flags & SP_OBJECT_MODIFIED_FLAG) {
/* do something to trigger redisplay, updates? */
- object->readAttr( "azimuth" );
- object->readAttr( "elevation" );
+ this->readAttr( "azimuth" );
+ this->readAttr( "elevation" );
}
- if (((SPObjectClass *) sp_fedistantlight_parent_class)->update) {
- ((SPObjectClass *) sp_fedistantlight_parent_class)->update(object, ctx, flags);
- }
+ SPObject::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_fedistantlight_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
- SPFeDistantLight *fedistantlight = SP_FEDISTANTLIGHT(object);
-
+Inkscape::XML::Node* SPFeDistantLight::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if (fedistantlight->azimuth_set)
- sp_repr_set_css_double(repr, "azimuth", fedistantlight->azimuth);
- if (fedistantlight->elevation_set)
- sp_repr_set_css_double(repr, "elevation", fedistantlight->elevation);
+ if (this->azimuth_set) {
+ sp_repr_set_css_double(repr, "azimuth", this->azimuth);
+ }
- if (((SPObjectClass *) sp_fedistantlight_parent_class)->write) {
- ((SPObjectClass *) sp_fedistantlight_parent_class)->write(object, doc, repr, flags);
+ if (this->elevation_set) {
+ sp_repr_set_css_double(repr, "elevation", this->elevation);
}
+ SPObject::write(doc, repr, flags);
+
return repr;
}
diff --git a/src/filters/distantlight.h b/src/filters/distantlight.h
index b1febf5d3..0eebf768f 100644
--- a/src/filters/distantlight.h
+++ b/src/filters/distantlight.h
@@ -17,15 +17,14 @@
#include "sp-object.h"
-#define SP_TYPE_FEDISTANTLIGHT (sp_fedistantlight_get_type())
-#define SP_FEDISTANTLIGHT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEDISTANTLIGHT, SPFeDistantLight))
-#define SP_FEDISTANTLIGHT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FEDISTANTLIGHT, SPFeDistantLightClass))
-#define SP_IS_FEDISTANTLIGHT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEDISTANTLIGHT))
-#define SP_IS_FEDISTANTLIGHT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FEDISTANTLIGHT))
+#define SP_FEDISTANTLIGHT(obj) (dynamic_cast<SPFeDistantLight*>((SPObject*)obj))
+#define SP_IS_FEDISTANTLIGHT(obj) (dynamic_cast<const SPFeDistantLight*>((SPObject*)obj) != NULL)
/* Distant light class */
-
-struct SPFeDistantLight : public SPObject {
+class SPFeDistantLight : public SPObject {
+public:
+ SPFeDistantLight();
+ virtual ~SPFeDistantLight();
/** azimuth attribute */
gfloat azimuth;
@@ -33,14 +32,18 @@ struct SPFeDistantLight : public SPObject {
/** elevation attribute */
gfloat elevation;
guint elevation_set : 1;
-};
-struct SPFeDistantLightClass {
- SPObjectClass parent_class;
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void set(unsigned int key, const gchar* value);
+
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
};
-GType
-sp_fedistantlight_get_type();
#endif /* !SP_FEDISTANTLIGHT_H_SEEN */
/*
diff --git a/src/filters/flood.cpp b/src/filters/flood.cpp
index 51b139b34..134492d34 100644
--- a/src/filters/flood.cpp
+++ b/src/filters/flood.cpp
@@ -27,34 +27,24 @@
#include "display/nr-filter.h"
#include "display/nr-filter-flood.h"
-/* FeFlood base class */
-
-static void sp_feFlood_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feFlood_release(SPObject *object);
-static void sp_feFlood_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feFlood_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feFlood_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_feFlood_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
-
-G_DEFINE_TYPE(SPFeFlood, sp_feFlood, SP_TYPE_FILTER_PRIMITIVE);
-
-static void sp_feFlood_class_init(SPFeFloodClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
-
- sp_object_class->build = sp_feFlood_build;
- sp_object_class->release = sp_feFlood_release;
- sp_object_class->write = sp_feFlood_write;
- sp_object_class->set = sp_feFlood_set;
- sp_object_class->update = sp_feFlood_update;
- sp_primitive_class->build_renderer = sp_feFlood_build_renderer;
+#include "sp-factory.h"
+
+namespace {
+ SPObject* createFlood() {
+ return new SPFeFlood();
+ }
+
+ bool floodRegistered = SPFactory::instance().registerObject("svg:feFlood", createFlood);
+}
+
+SPFeFlood::SPFeFlood() : SPFilterPrimitive() {
+ this->color = 0;
+
+ this->opacity = 1;
+ this->icc = NULL;
}
-static void sp_feFlood_init(SPFeFlood *feFlood)
-{
- feFlood->opacity = 1;
- feFlood->icc = NULL;
+SPFeFlood::~SPFeFlood() {
}
/**
@@ -62,35 +52,25 @@ static void sp_feFlood_init(SPFeFlood *feFlood)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feFlood_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if ((SP_OBJECT_CLASS(sp_feFlood_parent_class))->build) {
- (SP_OBJECT_CLASS(sp_feFlood_parent_class))->build(object, document, repr);
- }
+void SPFeFlood::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
- /*LOAD ATTRIBUTES FROM REPR HERE*/
- object->readAttr( "flood-opacity" );
- object->readAttr( "flood-color" );
+ /*LOAD ATTRIBUTES FROM REPR HERE*/
+ this->readAttr( "flood-opacity" );
+ this->readAttr( "flood-color" );
}
/**
* Drops any allocated memory.
*/
-static void sp_feFlood_release(SPObject *object)
-{
- if ((SP_OBJECT_CLASS(sp_feFlood_parent_class))->release)
- (SP_OBJECT_CLASS(sp_feFlood_parent_class))->release(object);
+void SPFeFlood::release() {
+ SPFilterPrimitive::release();
}
/**
* Sets a specific value in the SPFeFlood.
*/
-static void
-sp_feFlood_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeFlood *feFlood = SP_FEFLOOD(object);
- (void)feFlood;
+void SPFeFlood::set(unsigned int key, gchar const *value) {
gchar const *cend_ptr = NULL;
gchar *end_ptr = NULL;
guint32 read_color;
@@ -103,8 +83,8 @@ sp_feFlood_set(SPObject *object, unsigned int key, gchar const *value)
cend_ptr = NULL;
read_color = sp_svg_read_color(value, &cend_ptr, 0xffffffff);
- if (cend_ptr && read_color != feFlood->color){
- feFlood->color = read_color;
+ if (cend_ptr && read_color != this->color){
+ this->color = read_color;
dirty=true;
}
@@ -112,52 +92,54 @@ sp_feFlood_set(SPObject *object, unsigned int key, gchar const *value)
while (g_ascii_isspace(*cend_ptr)) {
++cend_ptr;
}
+
if (strneq(cend_ptr, "icc-color(", 10)) {
- if (!feFlood->icc) feFlood->icc = new SVGICCColor();
- if ( ! sp_svg_read_icc_color( cend_ptr, feFlood->icc ) ) {
- delete feFlood->icc;
- feFlood->icc = NULL;
+ if (!this->icc) {
+ this->icc = new SVGICCColor();
}
+
+ if ( ! sp_svg_read_icc_color( cend_ptr, this->icc ) ) {
+ delete this->icc;
+ this->icc = NULL;
+ }
+
dirty = true;
}
}
- if (dirty)
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (dirty) {
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ }
break;
case SP_PROP_FLOOD_OPACITY:
if (value) {
read_num = g_ascii_strtod(value, &end_ptr);
- if (end_ptr != NULL)
- {
- if (*end_ptr)
- {
+
+ if (end_ptr != NULL) {
+ if (*end_ptr) {
g_warning("Unable to convert \"%s\" to number", value);
read_num = 1;
}
}
- }
- else {
+ } else {
read_num = 1;
}
- if (read_num != feFlood->opacity){
- feFlood->opacity = read_num;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_num != this->opacity) {
+ this->opacity = read_num;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
default:
- if ((SP_OBJECT_CLASS(sp_feFlood_parent_class))->set)
- (SP_OBJECT_CLASS(sp_feFlood_parent_class))->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
-
}
/**
* Receives update notifications.
*/
-static void
-sp_feFlood_update(SPObject *object, SPCtx *ctx, guint flags)
-{
+void SPFeFlood::update(SPCtx *ctx, guint flags) {
if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
@@ -165,50 +147,40 @@ sp_feFlood_update(SPObject *object, SPCtx *ctx, guint flags)
}
- if ((SP_OBJECT_CLASS(sp_feFlood_parent_class))->update) {
- (SP_OBJECT_CLASS(sp_feFlood_parent_class))->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feFlood_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
+Inkscape::XML::Node* SPFeFlood::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if ((SP_OBJECT_CLASS(sp_feFlood_parent_class))->write) {
- (SP_OBJECT_CLASS(sp_feFlood_parent_class))->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
-static void sp_feFlood_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeFlood::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeFlood *sp_flood = SP_FEFLOOD(primitive);
- (void)sp_flood;
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_FLOOD);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterFlood *nr_flood = dynamic_cast<Inkscape::Filters::FilterFlood*>(nr_primitive);
g_assert(nr_flood != NULL);
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ sp_filter_primitive_renderer_common(this, nr_primitive);
- nr_flood->set_opacity(sp_flood->opacity);
- nr_flood->set_color(sp_flood->color);
- nr_flood->set_icc(sp_flood->icc);
+ nr_flood->set_opacity(this->opacity);
+ nr_flood->set_color(this->color);
+ nr_flood->set_icc(this->icc);
}
-
/*
Local Variables:
mode:c++
diff --git a/src/filters/flood.h b/src/filters/flood.h
index ab9f061d6..75e332b73 100644
--- a/src/filters/flood.h
+++ b/src/filters/flood.h
@@ -15,27 +15,31 @@
#include "sp-filter-primitive.h"
#include "svg/svg-icc-color.h"
-G_BEGIN_DECLS
+#define SP_FEFLOOD(obj) (dynamic_cast<SPFeFlood*>((SPObject*)obj))
+#define SP_IS_FEFLOOD(obj) (dynamic_cast<const SPFeFlood*>((SPObject*)obj) != NULL)
-#define SP_TYPE_FEFLOOD (sp_feFlood_get_type())
-#define SP_FEFLOOD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEFLOOD, SPFeFlood))
-#define SP_FEFLOOD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FEFLOOD, SPFeFloodClass))
-#define SP_IS_FEFLOOD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEFLOOD))
-#define SP_IS_FEFLOOD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FEFLOOD))
+class SPFeFlood : public SPFilterPrimitive {
+public:
+ SPFeFlood();
+ virtual ~SPFeFlood();
-struct SPFeFlood : public SPFilterPrimitive {
guint32 color;
SVGICCColor *icc;
double opacity;
-};
-struct SPFeFloodClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void set(unsigned int key, const gchar* value);
-GType sp_feFlood_get_type() G_GNUC_CONST;
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
-G_END_DECLS
#endif /* !SP_FEFLOOD_H_SEEN */
/*
diff --git a/src/filters/gaussian-blur.cpp b/src/filters/gaussian-blur.cpp
index ca93cf6d8..fc1e65925 100644
--- a/src/filters/gaussian-blur.cpp
+++ b/src/filters/gaussian-blur.cpp
@@ -30,34 +30,20 @@
//#define SP_MACROS_SILENT
//#include "macros.h"
-/* GaussianBlur base class */
-static void sp_gaussianBlur_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_gaussianBlur_release(SPObject *object);
-static void sp_gaussianBlur_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_gaussianBlur_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_gaussianBlur_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_gaussianBlur_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
-
-G_DEFINE_TYPE(SPGaussianBlur, sp_gaussianBlur, SP_TYPE_FILTER_PRIMITIVE);
-
-static void
-sp_gaussianBlur_class_init(SPGaussianBlurClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
+#include "sp-factory.h"
- sp_object_class->build = sp_gaussianBlur_build;
- sp_object_class->release = sp_gaussianBlur_release;
- sp_object_class->write = sp_gaussianBlur_write;
- sp_object_class->set = sp_gaussianBlur_set;
- sp_object_class->update = sp_gaussianBlur_update;
+namespace {
+ SPObject* createGaussianBlur() {
+ return new SPGaussianBlur();
+ }
- sp_primitive_class->build_renderer = sp_gaussianBlur_build_renderer;
+ bool gaussianBlurRegistered = SPFactory::instance().registerObject("svg:feGaussianBlur", createGaussianBlur);
}
-static void
-sp_gaussianBlur_init(SPGaussianBlur */*gaussianBlur*/)
-{
+SPGaussianBlur::SPGaussianBlur() : SPFilterPrimitive() {
+}
+
+SPGaussianBlur::~SPGaussianBlur() {
}
/**
@@ -65,110 +51,88 @@ sp_gaussianBlur_init(SPGaussianBlur */*gaussianBlur*/)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_gaussianBlur_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_gaussianBlur_parent_class)->build) {
- ((SPObjectClass *) sp_gaussianBlur_parent_class)->build(object, document, repr);
- }
-
- object->readAttr( "stdDeviation" );
+void SPGaussianBlur::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
+ this->readAttr( "stdDeviation" );
}
/**
* Drops any allocated memory.
*/
-static void
-sp_gaussianBlur_release(SPObject *object)
-{
-
- if (((SPObjectClass *) sp_gaussianBlur_parent_class)->release)
- ((SPObjectClass *) sp_gaussianBlur_parent_class)->release(object);
+void SPGaussianBlur::release() {
+ SPFilterPrimitive::release();
}
/**
* Sets a specific value in the SPGaussianBlur.
*/
-static void
-sp_gaussianBlur_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPGaussianBlur *gaussianBlur = SP_GAUSSIANBLUR(object);
-
+void SPGaussianBlur::set(unsigned int key, gchar const *value) {
switch(key) {
case SP_ATTR_STDDEVIATION:
- gaussianBlur->stdDeviation.set(value);
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ this->stdDeviation.set(value);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
default:
- if (((SPObjectClass *) sp_gaussianBlur_parent_class)->set)
- ((SPObjectClass *) sp_gaussianBlur_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
-
}
/**
* Receives update notifications.
*/
-static void
-sp_gaussianBlur_update(SPObject *object, SPCtx *ctx, guint flags)
-{
+void SPGaussianBlur::update(SPCtx *ctx, guint flags) {
if (flags & SP_OBJECT_MODIFIED_FLAG) {
- object->readAttr( "stdDeviation" );
+ this->readAttr( "stdDeviation" );
}
- if (((SPObjectClass *) sp_gaussianBlur_parent_class)->update) {
- ((SPObjectClass *) sp_gaussianBlur_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_gaussianBlur_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
+Inkscape::XML::Node* SPGaussianBlur::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if (((SPObjectClass *) sp_gaussianBlur_parent_class)->write) {
- ((SPObjectClass *) sp_gaussianBlur_parent_class)->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
-
void sp_gaussianBlur_setDeviation(SPGaussianBlur *blur, float num)
{
blur->stdDeviation.setNumber(num);
}
+
void sp_gaussianBlur_setDeviation(SPGaussianBlur *blur, float num, float optnum)
{
blur->stdDeviation.setNumber(num);
blur->stdDeviation.setOptNumber(optnum);
}
-static void sp_gaussianBlur_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- SPGaussianBlur *sp_blur = SP_GAUSSIANBLUR(primitive);
-
+void SPGaussianBlur::build_renderer(Inkscape::Filters::Filter* filter) {
int handle = filter->add_primitive(Inkscape::Filters::NR_FILTER_GAUSSIANBLUR);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(handle);
Inkscape::Filters::FilterGaussian *nr_blur = dynamic_cast<Inkscape::Filters::FilterGaussian*>(nr_primitive);
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ sp_filter_primitive_renderer_common(this, nr_primitive);
+
+ gfloat num = this->stdDeviation.getNumber();
- gfloat num = sp_blur->stdDeviation.getNumber();
if (num >= 0.0) {
- gfloat optnum = sp_blur->stdDeviation.getOptNumber();
- if(optnum >= 0.0)
+ gfloat optnum = this->stdDeviation.getOptNumber();
+
+ if(optnum >= 0.0) {
nr_blur->set_deviation((double) num, (double) optnum);
- else
+ } else {
nr_blur->set_deviation((double) num);
+ }
}
}
diff --git a/src/filters/gaussian-blur.h b/src/filters/gaussian-blur.h
index 8929627ba..00de8a95f 100644
--- a/src/filters/gaussian-blur.h
+++ b/src/filters/gaussian-blur.h
@@ -15,23 +15,30 @@
#include "sp-filter-primitive.h"
#include "number-opt-number.h"
-#define SP_TYPE_GAUSSIANBLUR (sp_gaussianBlur_get_type())
-#define SP_GAUSSIANBLUR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_GAUSSIANBLUR, SPGaussianBlur))
-#define SP_GAUSSIANBLUR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_GAUSSIANBLUR, SPGaussianBlurClass))
-#define SP_IS_GAUSSIANBLUR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_GAUSSIANBLUR))
-#define SP_IS_GAUSSIANBLUR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_GAUSSIANBLUR))
+#define SP_GAUSSIANBLUR(obj) (dynamic_cast<SPGaussianBlur*>((SPObject*)obj))
+#define SP_IS_GAUSSIANBLUR(obj) (dynamic_cast<const SPGaussianBlur*>((SPObject*)obj) != NULL)
+
+class SPGaussianBlur : public SPFilterPrimitive {
+public:
+ SPGaussianBlur();
+ virtual ~SPGaussianBlur();
-struct SPGaussianBlur : public SPFilterPrimitive {
/** stdDeviation attribute */
NumberOptNumber stdDeviation;
-};
-/* GaussianBlur base class */
-struct SPGaussianBlurClass {
- SPFilterPrimitiveClass parent_class;
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void set(unsigned int key, const gchar* value);
+
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
};
-GType sp_gaussianBlur_get_type();
void sp_gaussianBlur_setDeviation(SPGaussianBlur *blur, float num);
void sp_gaussianBlur_setDeviation(SPGaussianBlur *blur, float num, float optnum);
diff --git a/src/filters/image.cpp b/src/filters/image.cpp
index 365ad9eb6..9a1b85911 100644
--- a/src/filters/image.cpp
+++ b/src/filters/image.cpp
@@ -31,34 +31,28 @@
#include "display/nr-filter.h"
-/* FeImage base class */
-static void sp_feImage_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feImage_release(SPObject *object);
-static void sp_feImage_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feImage_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feImage_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_feImage_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
+#include "sp-factory.h"
-G_DEFINE_TYPE(SPFeImage, sp_feImage, SP_TYPE_FILTER_PRIMITIVE);
+namespace {
+ SPObject* createImage() {
+ return new SPFeImage();
+ }
-static void sp_feImage_class_init(SPFeImageClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass * sp_primitive_class = (SPFilterPrimitiveClass *)klass;
+ bool imageRegistered = SPFactory::instance().registerObject("svg:feImage", createImage);
+}
- sp_object_class->build = sp_feImage_build;
- sp_object_class->release = sp_feImage_release;
- sp_object_class->write = sp_feImage_write;
- sp_object_class->set = sp_feImage_set;
- sp_object_class->update = sp_feImage_update;
+SPFeImage::SPFeImage() : SPFilterPrimitive() {
+ this->document = NULL;
+ this->href = NULL;
+ this->from_element = 0;
+ this->SVGElemRef = NULL;
+ this->SVGElem = NULL;
- sp_primitive_class->build_renderer = sp_feImage_build_renderer;
+ this->aspect_align = SP_ASPECT_XMID_YMID; // Default
+ this->aspect_clip = SP_ASPECT_MEET; // Default
}
-static void sp_feImage_init(SPFeImage *feImage)
-{
- feImage->aspect_align = SP_ASPECT_XMID_YMID; // Default
- feImage->aspect_clip = SP_ASPECT_MEET; // Default
+SPFeImage::~SPFeImage() {
}
/**
@@ -66,35 +60,30 @@ static void sp_feImage_init(SPFeImage *feImage)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void sp_feImage_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
+void SPFeImage::build(SPDocument *document, Inkscape::XML::Node *repr) {
// Save document reference so we can load images with relative paths.
- SPFeImage *feImage = SP_FEIMAGE(object);
- feImage->document = document;
+ this->document = document;
- if (((SPObjectClass *) sp_feImage_parent_class)->build) {
- ((SPObjectClass *) sp_feImage_parent_class)->build(object, document, repr);
- }
+ SPFilterPrimitive::build(document, repr);
/*LOAD ATTRIBUTES FROM REPR HERE*/
- object->readAttr( "preserveAspectRatio" );
- object->readAttr( "xlink:href" );
-
+ this->readAttr( "preserveAspectRatio" );
+ this->readAttr( "xlink:href" );
}
/**
* Drops any allocated memory.
*/
-static void sp_feImage_release(SPObject *object)
-{
- SPFeImage *feImage = SP_FEIMAGE(object);
- feImage->_image_modified_connection.disconnect();
- feImage->_href_modified_connection.disconnect();
- if (feImage->SVGElemRef) delete feImage->SVGElemRef;
+void SPFeImage::release() {
+ this->_image_modified_connection.disconnect();
+ this->_href_modified_connection.disconnect();
+
+ if (this->SVGElemRef) {
+ delete this->SVGElemRef;
+ }
- if (((SPObjectClass *) sp_feImage_parent_class)->release)
- ((SPObjectClass *) sp_feImage_parent_class)->release(object);
+ SPFilterPrimitive::release();
}
static void sp_feImage_elem_modified(SPObject* /*href*/, guint /*flags*/, SPObject* obj)
@@ -119,42 +108,39 @@ static void sp_feImage_href_modified(SPObject* /*old_elem*/, SPObject* new_elem,
/**
* Sets a specific value in the SPFeImage.
*/
-static void sp_feImage_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeImage *feImage = SP_FEIMAGE(object);
- (void)feImage;
+void SPFeImage::set(unsigned int key, gchar const *value) {
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
case SP_ATTR_XLINK_HREF:
- if (feImage->href) {
- g_free(feImage->href);
+ if (this->href) {
+ g_free(this->href);
}
- feImage->href = (value) ? g_strdup (value) : NULL;
- if (!feImage->href) return;
- delete feImage->SVGElemRef;
- feImage->SVGElemRef = 0;
- feImage->SVGElem = 0;
- feImage->_image_modified_connection.disconnect();
- feImage->_href_modified_connection.disconnect();
+ this->href = (value) ? g_strdup (value) : NULL;
+ if (!this->href) return;
+ delete this->SVGElemRef;
+ this->SVGElemRef = 0;
+ this->SVGElem = 0;
+ this->_image_modified_connection.disconnect();
+ this->_href_modified_connection.disconnect();
try{
- Inkscape::URI SVGElem_uri(feImage->href);
- feImage->SVGElemRef = new Inkscape::URIReference(feImage->document);
- feImage->SVGElemRef->attach(SVGElem_uri);
- feImage->from_element = true;
- feImage->_href_modified_connection = feImage->SVGElemRef->changedSignal().connect(sigc::bind(sigc::ptr_fun(&sp_feImage_href_modified), object));
- if (SPObject *elemref = feImage->SVGElemRef->getObject()) {
- feImage->SVGElem = SP_ITEM(elemref);
- feImage->_image_modified_connection = ((SPObject*) feImage->SVGElem)->connectModified(sigc::bind(sigc::ptr_fun(&sp_feImage_elem_modified), object));
- object->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ Inkscape::URI SVGElem_uri(this->href);
+ this->SVGElemRef = new Inkscape::URIReference(this->document);
+ this->SVGElemRef->attach(SVGElem_uri);
+ this->from_element = true;
+ this->_href_modified_connection = this->SVGElemRef->changedSignal().connect(sigc::bind(sigc::ptr_fun(&sp_feImage_href_modified), this));
+ if (SPObject *elemref = this->SVGElemRef->getObject()) {
+ this->SVGElem = SP_ITEM(elemref);
+ this->_image_modified_connection = ((SPObject*) this->SVGElem)->connectModified(sigc::bind(sigc::ptr_fun(&sp_feImage_elem_modified), this));
+ this->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
} else {
- g_warning("SVG element URI was not found in the document while loading feImage");
+ g_warning("SVG element URI was not found in the document while loading this");
}
}
// catches either MalformedURIException or UnsupportedURIException
catch(const Inkscape::BadURIException & e)
{
- feImage->from_element = false;
+ this->from_element = false;
/* This occurs when using external image as the source */
//g_warning("caught Inkscape::BadURIException in sp_feImage_set");
break;
@@ -164,9 +150,9 @@ static void sp_feImage_set(SPObject *object, unsigned int key, gchar const *valu
case SP_ATTR_PRESERVEASPECTRATIO:
/* Copied from sp-image.cpp */
/* Do setup before, so we can use break to escape */
- feImage->aspect_align = SP_ASPECT_XMID_YMID; // Default
- feImage->aspect_clip = SP_ASPECT_MEET; // Default
- object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG);
+ this->aspect_align = SP_ASPECT_XMID_YMID; // Default
+ this->aspect_clip = SP_ASPECT_MEET; // Default
+ this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG);
if (value) {
int len;
gchar c[256];
@@ -217,73 +203,62 @@ static void sp_feImage_set(SPObject *object, unsigned int key, gchar const *valu
break;
}
}
- feImage->aspect_align = align;
- feImage->aspect_clip = clip;
+ this->aspect_align = align;
+ this->aspect_clip = clip;
}
break;
default:
- if (((SPObjectClass *) sp_feImage_parent_class)->set)
- ((SPObjectClass *) sp_feImage_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
-
}
/**
* Receives update notifications.
*/
-static void sp_feImage_update(SPObject *object, SPCtx *ctx, guint flags)
-{
-
+void SPFeImage::update(SPCtx *ctx, guint flags) {
if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
/* do something to trigger redisplay, updates? */
}
- if (((SPObjectClass *) sp_feImage_parent_class)->update) {
- ((SPObjectClass *) sp_feImage_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node * sp_feImage_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
+Inkscape::XML::Node* SPFeImage::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if (((SPObjectClass *) sp_feImage_parent_class)->write) {
- ((SPObjectClass *) sp_feImage_parent_class)->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
-static void sp_feImage_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeImage::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeImage *sp_image = SP_FEIMAGE(primitive);
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_IMAGE);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterImage *nr_image = dynamic_cast<Inkscape::Filters::FilterImage*>(nr_primitive);
g_assert(nr_image != NULL);
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ sp_filter_primitive_renderer_common(this, nr_primitive);
- nr_image->from_element = sp_image->from_element;
- nr_image->SVGElem = sp_image->SVGElem;
- nr_image->set_align( sp_image->aspect_align );
- nr_image->set_clip( sp_image->aspect_clip );
- nr_image->set_href(sp_image->href);
- nr_image->set_document(sp_image->document);
+ nr_image->from_element = this->from_element;
+ nr_image->SVGElem = this->SVGElem;
+ nr_image->set_align( this->aspect_align );
+ nr_image->set_clip( this->aspect_clip );
+ nr_image->set_href(this->href);
+ nr_image->set_document(this->document);
}
/*
diff --git a/src/filters/image.h b/src/filters/image.h
index a96e650b7..452e08134 100644
--- a/src/filters/image.h
+++ b/src/filters/image.h
@@ -18,13 +18,14 @@
#include "sp-item.h"
#include "uri-references.h"
-#define SP_TYPE_FEIMAGE (sp_feImage_get_type())
-#define SP_FEIMAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEIMAGE, SPFeImage))
-#define SP_FEIMAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FEIMAGE, SPFeImageClass))
-#define SP_IS_FEIMAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEIMAGE))
-#define SP_IS_FEIMAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FEIMAGE))
+#define SP_FEIMAGE(obj) (dynamic_cast<SPFeImage*>((SPObject*)obj))
+#define SP_IS_FEIMAGE(obj) (dynamic_cast<const SPFeImage*>((SPObject*)obj) != NULL)
+
+class SPFeImage : public SPFilterPrimitive {
+public:
+ SPFeImage();
+ virtual ~SPFeImage();
-struct SPFeImage : public SPFilterPrimitive {
gchar *href;
/* preserveAspectRatio */
@@ -37,13 +38,19 @@ struct SPFeImage : public SPFilterPrimitive {
Inkscape::URIReference* SVGElemRef;
sigc::connection _image_modified_connection;
sigc::connection _href_modified_connection;
-};
-struct SPFeImageClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void set(unsigned int key, const gchar* value);
-GType sp_feImage_get_type();
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FEIMAGE_H_SEEN */
diff --git a/src/filters/merge.cpp b/src/filters/merge.cpp
index 7346a0892..882ab36dd 100644
--- a/src/filters/merge.cpp
+++ b/src/filters/merge.cpp
@@ -24,34 +24,20 @@
#include "display/nr-filter.h"
#include "display/nr-filter-merge.h"
-/* FeMerge base class */
-static void sp_feMerge_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feMerge_release(SPObject *object);
-static void sp_feMerge_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feMerge_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feMerge_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_feMerge_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
-
-G_DEFINE_TYPE(SPFeMerge, sp_feMerge, SP_TYPE_FILTER_PRIMITIVE);
-
-static void
-sp_feMerge_class_init(SPFeMergeClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
-
- sp_object_class->build = sp_feMerge_build;
- sp_object_class->release = sp_feMerge_release;
- sp_object_class->write = sp_feMerge_write;
- sp_object_class->set = sp_feMerge_set;
- sp_object_class->update = sp_feMerge_update;
-
- sp_primitive_class->build_renderer = sp_feMerge_build_renderer;
+#include "sp-factory.h"
+
+namespace {
+ SPObject* createMerge() {
+ return new SPFeMerge();
+ }
+
+ bool mergeRegistered = SPFactory::instance().registerObject("svg:feMerge", createMerge);
+}
+
+SPFeMerge::SPFeMerge() : SPFilterPrimitive() {
}
-static void
-sp_feMerge_init(SPFeMerge */*feMerge*/)
-{
+SPFeMerge::~SPFeMerge() {
}
/**
@@ -59,102 +45,77 @@ sp_feMerge_init(SPFeMerge */*feMerge*/)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feMerge_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_feMerge_parent_class)->build) {
- ((SPObjectClass *) sp_feMerge_parent_class)->build(object, document, repr);
- }
-
- /*LOAD ATTRIBUTES FROM REPR HERE*/
+void SPFeMerge::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feMerge_release(SPObject *object)
-{
- if (((SPObjectClass *) sp_feMerge_parent_class)->release)
- ((SPObjectClass *) sp_feMerge_parent_class)->release(object);
+void SPFeMerge::release() {
+ SPFilterPrimitive::release();
}
/**
* Sets a specific value in the SPFeMerge.
*/
-static void
-sp_feMerge_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeMerge *feMerge = SP_FEMERGE(object);
- (void)feMerge;
-
+void SPFeMerge::set(unsigned int key, gchar const *value) {
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
default:
- if (((SPObjectClass *) sp_feMerge_parent_class)->set)
- ((SPObjectClass *) sp_feMerge_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
-
}
/**
* Receives update notifications.
*/
-static void
-sp_feMerge_update(SPObject *object, SPCtx *ctx, guint flags)
-{
+void SPFeMerge::update(SPCtx *ctx, guint flags) {
if (flags & SP_OBJECT_MODIFIED_FLAG) {
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
- if (((SPObjectClass *) sp_feMerge_parent_class)->update) {
- ((SPObjectClass *) sp_feMerge_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feMerge_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
+Inkscape::XML::Node* SPFeMerge::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it. And child nodes, too! */
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if (((SPObjectClass *) sp_feMerge_parent_class)->write) {
- ((SPObjectClass *) sp_feMerge_parent_class)->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
-static void sp_feMerge_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeMerge::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeMerge *sp_merge = SP_FEMERGE(primitive);
- (void)sp_merge;
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_MERGE);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterMerge *nr_merge = dynamic_cast<Inkscape::Filters::FilterMerge*>(nr_primitive);
g_assert(nr_merge != NULL);
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ sp_filter_primitive_renderer_common(this, nr_primitive);
- SPObject *input = primitive->children;
+ SPObject *input = this->children;
int in_nr = 0;
+
while (input) {
if (SP_IS_FEMERGENODE(input)) {
SPFeMergeNode *node = SP_FEMERGENODE(input);
nr_merge->set_input(in_nr, node->input);
in_nr++;
}
+
input = input->next;
}
}
diff --git a/src/filters/merge.h b/src/filters/merge.h
index 40a9bb848..68257c38e 100644
--- a/src/filters/merge.h
+++ b/src/filters/merge.h
@@ -12,22 +12,26 @@
#include "sp-filter-primitive.h"
-#define SP_TYPE_FEMERGE (sp_feMerge_get_type())
-#define SP_FEMERGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEMERGE, SPFeMerge))
-#define SP_FEMERGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FEMERGE, SPFeMergeClass))
-#define SP_IS_FEMERGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEMERGE))
-#define SP_IS_FEMERGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FEMERGE))
-
-struct SPFeMerge : public SPFilterPrimitive {
-
-};
+#define SP_FEMERGE(obj) (dynamic_cast<SPFeMerge*>((SPObject*)obj))
+#define SP_IS_FEMERGE(obj) (dynamic_cast<const SPFeMerge*>((SPObject*)obj) != NULL)
-struct SPFeMergeClass {
- SPFilterPrimitiveClass parent_class;
-};
+class SPFeMerge : public SPFilterPrimitive {
+public:
+ SPFeMerge();
+ virtual ~SPFeMerge();
+
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
-GType sp_feMerge_get_type();
+ virtual void set(unsigned int key, const gchar* value);
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FEMERGE_H_SEEN */
diff --git a/src/filters/mergenode.cpp b/src/filters/mergenode.cpp
index fa193ad77..1b06db706 100644
--- a/src/filters/mergenode.cpp
+++ b/src/filters/mergenode.cpp
@@ -23,30 +23,21 @@
#include "filters/merge.h"
#include "display/nr-filter-types.h"
-static void sp_feMergeNode_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feMergeNode_release(SPObject *object);
-static void sp_feMergeNode_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feMergeNode_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feMergeNode_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-
-G_DEFINE_TYPE(SPFeMergeNode, sp_feMergeNode, SP_TYPE_OBJECT);
-
-static void
-sp_feMergeNode_class_init(SPFeMergeNodeClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
-
- sp_object_class->build = sp_feMergeNode_build;
- sp_object_class->release = sp_feMergeNode_release;
- sp_object_class->write = sp_feMergeNode_write;
- sp_object_class->set = sp_feMergeNode_set;
- sp_object_class->update = sp_feMergeNode_update;
+#include "sp-factory.h"
+
+namespace {
+ SPObject* createMergeNode() {
+ return new SPFeMergeNode();
+ }
+
+ bool mergeNodeRegistered = SPFactory::instance().registerObject("svg:feMergeNode", createMergeNode);
}
-static void
-sp_feMergeNode_init(SPFeMergeNode *feMergeNode)
-{
- feMergeNode->input = Inkscape::Filters::NR_FILTER_SLOT_NOT_SET;
+SPFeMergeNode::SPFeMergeNode()
+ : SPObject(), input(Inkscape::Filters::NR_FILTER_SLOT_NOT_SET) {
+}
+
+SPFeMergeNode::~SPFeMergeNode() {
}
/**
@@ -54,85 +45,61 @@ sp_feMergeNode_init(SPFeMergeNode *feMergeNode)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feMergeNode_build(SPObject *object, SPDocument */*document*/, Inkscape::XML::Node */*repr*/)
-{
- object->readAttr( "in" );
+void SPFeMergeNode::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ this->readAttr( "in" );
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feMergeNode_release(SPObject *object)
-{
- /* deal with our children and our selves here */
-
- if (((SPObjectClass *) sp_feMergeNode_parent_class)->release)
- ((SPObjectClass *) sp_feMergeNode_parent_class)->release(object);
+void SPFeMergeNode::release() {
+ SPObject::release();
}
/**
* Sets a specific value in the SPFeMergeNode.
*/
-static void
-sp_feMergeNode_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeMergeNode *feMergeNode = SP_FEMERGENODE(object);
- SPFeMerge *parent = SP_FEMERGE(object->parent);
+void SPFeMergeNode::set(unsigned int key, gchar const *value) {
+ SPFeMerge *parent = SP_FEMERGE(this->parent);
if (key == SP_ATTR_IN) {
int input = sp_filter_primitive_read_in(parent, value);
- if (input != feMergeNode->input) {
- feMergeNode->input = input;
- object->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ if (input != this->input) {
+ this->input = input;
+ this->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
}
/* See if any parents need this value. */
- if (((SPObjectClass *) sp_feMergeNode_parent_class)->set) {
- ((SPObjectClass *) sp_feMergeNode_parent_class)->set(object, key, value);
- }
+ SPObject::set(key, value);
}
/**
* Receives update notifications.
*/
-static void
-sp_feMergeNode_update(SPObject *object, SPCtx *ctx, guint flags)
-{
- //SPFeMergeNode *feMergeNode = SP_FEMERGENODE(object);
-
+void SPFeMergeNode::update(SPCtx *ctx, guint flags) {
if (flags & SP_OBJECT_MODIFIED_FLAG) {
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
- if (((SPObjectClass *) sp_feMergeNode_parent_class)->update) {
- ((SPObjectClass *) sp_feMergeNode_parent_class)->update(object, ctx, flags);
- }
+ SPObject::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feMergeNode_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
- //SPFeMergeNode *feMergeNode = SP_FEMERGENODE(object);
-
- // Inkscape-only object, not copied during an "plain SVG" dump:
+Inkscape::XML::Node* SPFeMergeNode::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
+ // Inkscape-only this, not copied during an "plain SVG" dump:
if (flags & SP_OBJECT_WRITE_EXT) {
if (repr) {
// is this sane?
//repr->mergeFrom(object->getRepr(), "id");
} else {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
}
- if (((SPObjectClass *) sp_feMergeNode_parent_class)->write) {
- ((SPObjectClass *) sp_feMergeNode_parent_class)->write(object, doc, repr, flags);
- }
+ SPObject::write(doc, repr, flags);
return repr;
}
diff --git a/src/filters/mergenode.h b/src/filters/mergenode.h
index edb35faec..408b3bbb8 100644
--- a/src/filters/mergenode.h
+++ b/src/filters/mergenode.h
@@ -17,20 +17,26 @@
#include "sp-object.h"
-#define SP_TYPE_FEMERGENODE (sp_feMergeNode_get_type())
-#define SP_FEMERGENODE(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_FEMERGENODE, SPFeMergeNode))
-#define SP_IS_FEMERGENODE(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_FEMERGENODE))
+#define SP_FEMERGENODE(obj) (dynamic_cast<SPFeMergeNode*>((SPObject*)obj))
+#define SP_IS_FEMERGENODE(obj) (dynamic_cast<const SPFeMergeNode*>((SPObject*)obj) != NULL)
+
+class SPFeMergeNode : public SPObject {
+public:
+ SPFeMergeNode();
+ virtual ~SPFeMergeNode();
-struct SPFeMergeNode : public SPObject {
int input;
-};
-struct SPFeMergeNodeClass {
- SPObjectClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
-GType sp_feMergeNode_get_type();
+ virtual void set(unsigned int key, const gchar* value);
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+};
#endif /* !SP_FEMERGENODE_H_SEEN */
diff --git a/src/filters/morphology.cpp b/src/filters/morphology.cpp
index 886a10311..d3611b081 100644
--- a/src/filters/morphology.cpp
+++ b/src/filters/morphology.cpp
@@ -26,35 +26,24 @@
#include "display/nr-filter.h"
#include "display/nr-filter-morphology.h"
-/* FeMorphology base class */
-static void sp_feMorphology_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feMorphology_release(SPObject *object);
-static void sp_feMorphology_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feMorphology_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feMorphology_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_feMorphology_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
-
-G_DEFINE_TYPE(SPFeMorphology, sp_feMorphology, SP_TYPE_FILTER_PRIMITIVE);
-
-static void
-sp_feMorphology_class_init(SPFeMorphologyClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
-
- sp_object_class->build = sp_feMorphology_build;
- sp_object_class->release = sp_feMorphology_release;
- sp_object_class->write = sp_feMorphology_write;
- sp_object_class->set = sp_feMorphology_set;
- sp_object_class->update = sp_feMorphology_update;
- sp_primitive_class->build_renderer = sp_feMorphology_build_renderer;
+#include "sp-factory.h"
+
+namespace {
+ SPObject* createMorphology() {
+ return new SPFeMorphology();
+ }
+
+ bool morphologyRegistered = SPFactory::instance().registerObject("svg:feMorphology", createMorphology);
}
-static void
-sp_feMorphology_init(SPFeMorphology *feMorphology)
-{
+SPFeMorphology::SPFeMorphology() : SPFilterPrimitive() {
+ this->Operator = Inkscape::Filters::MORPHOLOGY_OPERATOR_ERODE;
+
//Setting default values:
- feMorphology->radius.set("0");
+ this->radius.set("0");
+}
+
+SPFeMorphology::~SPFeMorphology() {
}
/**
@@ -62,70 +51,70 @@ sp_feMorphology_init(SPFeMorphology *feMorphology)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feMorphology_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_feMorphology_parent_class)->build) {
- ((SPObjectClass *) sp_feMorphology_parent_class)->build(object, document, repr);
- }
+void SPFeMorphology::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
- /*LOAD ATTRIBUTES FROM REPR HERE*/
- object->readAttr( "operator" );
- object->readAttr( "radius" );
+ /*LOAD ATTRIBUTES FROM REPR HERE*/
+ this->readAttr( "operator" );
+ this->readAttr( "radius" );
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feMorphology_release(SPObject *object)
-{
- if (((SPObjectClass *) sp_feMorphology_parent_class)->release)
- ((SPObjectClass *) sp_feMorphology_parent_class)->release(object);
+void SPFeMorphology::release() {
+ SPFilterPrimitive::release();
}
static Inkscape::Filters::FilterMorphologyOperator sp_feMorphology_read_operator(gchar const *value){
- if (!value) return Inkscape::Filters::MORPHOLOGY_OPERATOR_ERODE; //erode is default
+ if (!value) {
+ return Inkscape::Filters::MORPHOLOGY_OPERATOR_ERODE; //erode is default
+ }
+
switch(value[0]){
case 'e':
- if (strncmp(value, "erode", 5) == 0) return Inkscape::Filters::MORPHOLOGY_OPERATOR_ERODE;
+ if (strncmp(value, "erode", 5) == 0) {
+ return Inkscape::Filters::MORPHOLOGY_OPERATOR_ERODE;
+ }
break;
case 'd':
- if (strncmp(value, "dilate", 6) == 0) return Inkscape::Filters::MORPHOLOGY_OPERATOR_DILATE;
+ if (strncmp(value, "dilate", 6) == 0) {
+ return Inkscape::Filters::MORPHOLOGY_OPERATOR_DILATE;
+ }
break;
}
+
return Inkscape::Filters::MORPHOLOGY_OPERATOR_ERODE; //erode is default
}
/**
* Sets a specific value in the SPFeMorphology.
*/
-static void
-sp_feMorphology_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeMorphology *feMorphology = SP_FEMORPHOLOGY(object);
- (void)feMorphology;
-
+void SPFeMorphology::set(unsigned int key, gchar const *value) {
Inkscape::Filters::FilterMorphologyOperator read_operator;
+
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
case SP_ATTR_OPERATOR:
read_operator = sp_feMorphology_read_operator(value);
- if (read_operator != feMorphology->Operator){
- feMorphology->Operator = read_operator;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_operator != this->Operator){
+ this->Operator = read_operator;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_RADIUS:
- feMorphology->radius.set(value);
+ this->radius.set(value);
+
//From SVG spec: If <y-radius> is not provided, it defaults to <x-radius>.
- if (feMorphology->radius.optNumIsSet() == false)
- feMorphology->radius.setOptNumber(feMorphology->radius.getNumber());
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ if (this->radius.optNumIsSet() == false) {
+ this->radius.setOptNumber(this->radius.getNumber());
+ }
+
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
default:
- if (((SPObjectClass *) sp_feMorphology_parent_class)->set)
- ((SPObjectClass *) sp_feMorphology_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
@@ -134,9 +123,7 @@ sp_feMorphology_set(SPObject *object, unsigned int key, gchar const *value)
/**
* Receives update notifications.
*/
-static void
-sp_feMorphology_update(SPObject *object, SPCtx *ctx, guint flags)
-{
+void SPFeMorphology::update(SPCtx *ctx, guint flags) {
if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
@@ -144,46 +131,38 @@ sp_feMorphology_update(SPObject *object, SPCtx *ctx, guint flags)
}
- if (((SPObjectClass *) sp_feMorphology_parent_class)->update) {
- ((SPObjectClass *) sp_feMorphology_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feMorphology_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
- /* TODO: Don't just clone, but create a new repr node and write all
+Inkscape::XML::Node* SPFeMorphology::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
+ /* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if (((SPObjectClass *) sp_feMorphology_parent_class)->write) {
- ((SPObjectClass *) sp_feMorphology_parent_class)->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
-static void sp_feMorphology_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeMorphology::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeMorphology *sp_morphology = SP_FEMORPHOLOGY(primitive);
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_MORPHOLOGY);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterMorphology *nr_morphology = dynamic_cast<Inkscape::Filters::FilterMorphology*>(nr_primitive);
g_assert(nr_morphology != NULL);
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ sp_filter_primitive_renderer_common(this, nr_primitive);
- nr_morphology->set_operator(sp_morphology->Operator);
- nr_morphology->set_xradius( sp_morphology->radius.getNumber() );
- nr_morphology->set_yradius( sp_morphology->radius.getOptNumber() );
+ nr_morphology->set_operator(this->Operator);
+ nr_morphology->set_xradius( this->radius.getNumber() );
+ nr_morphology->set_yradius( this->radius.getOptNumber() );
}
/*
diff --git a/src/filters/morphology.h b/src/filters/morphology.h
index 9084d1b94..f84a7271e 100644
--- a/src/filters/morphology.h
+++ b/src/filters/morphology.h
@@ -16,23 +16,29 @@
#include "number-opt-number.h"
#include "display/nr-filter-morphology.h"
-#define SP_TYPE_FEMORPHOLOGY (sp_feMorphology_get_type())
-#define SP_FEMORPHOLOGY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEMORPHOLOGY, SPFeMorphology))
-#define SP_FEMORPHOLOGY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FEMORPHOLOGY, SPFeMorphologyClass))
-#define SP_IS_FEMORPHOLOGY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEMORPHOLOGY))
-#define SP_IS_FEMORPHOLOGY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FEMORPHOLOGY))
+#define SP_FEMORPHOLOGY(obj) (dynamic_cast<SPFeMorphology*>((SPObject*)obj))
+#define SP_IS_FEMORPHOLOGY(obj) (dynamic_cast<const SPFeMorphology*>((SPObject*)obj) != NULL)
+
+class SPFeMorphology : public SPFilterPrimitive {
+public:
+ SPFeMorphology();
+ virtual ~SPFeMorphology();
-struct SPFeMorphology : public SPFilterPrimitive {
Inkscape::Filters::FilterMorphologyOperator Operator;
NumberOptNumber radius;
-};
-struct SPFeMorphologyClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
-GType sp_feMorphology_get_type();
+ virtual void set(unsigned int key, const gchar* value);
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FEMORPHOLOGY_H_SEEN */
diff --git a/src/filters/offset.cpp b/src/filters/offset.cpp
index 2851f4f7d..234a1a964 100644
--- a/src/filters/offset.cpp
+++ b/src/filters/offset.cpp
@@ -25,36 +25,22 @@
#include "display/nr-filter.h"
#include "display/nr-filter-offset.h"
-/* FeOffset base class */
-static void sp_feOffset_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feOffset_release(SPObject *object);
-static void sp_feOffset_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feOffset_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feOffset_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_feOffset_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
-
-G_DEFINE_TYPE(SPFeOffset, sp_feOffset, SP_TYPE_FILTER_PRIMITIVE);
-
-static void
-sp_feOffset_class_init(SPFeOffsetClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
-
- sp_object_class->build = sp_feOffset_build;
- sp_object_class->release = sp_feOffset_release;
- sp_object_class->write = sp_feOffset_write;
- sp_object_class->set = sp_feOffset_set;
- sp_object_class->update = sp_feOffset_update;
-
- sp_primitive_class->build_renderer = sp_feOffset_build_renderer;
+#include "sp-factory.h"
+
+namespace {
+ SPObject* createOffset() {
+ return new SPFeOffset();
+ }
+
+ bool offsetRegistered = SPFactory::instance().registerObject("svg:feOffset", createOffset);
+}
+
+SPFeOffset::SPFeOffset() : SPFilterPrimitive() {
+ this->dx = 0;
+ this->dy = 0;
}
-static void
-sp_feOffset_init(SPFeOffset *feOffset)
-{
- feOffset->dx = 0;
- feOffset->dy = 0;
+SPFeOffset::~SPFeOffset() {
}
/**
@@ -62,111 +48,91 @@ sp_feOffset_init(SPFeOffset *feOffset)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feOffset_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_feOffset_parent_class)->build) {
- ((SPObjectClass *) sp_feOffset_parent_class)->build(object, document, repr);
- }
+void SPFeOffset::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
- object->readAttr( "dx" );
- object->readAttr( "dy" );
+ this->readAttr( "dx" );
+ this->readAttr( "dy" );
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feOffset_release(SPObject *object)
-{
- if (((SPObjectClass *) sp_feOffset_parent_class)->release)
- ((SPObjectClass *) sp_feOffset_parent_class)->release(object);
+void SPFeOffset::release() {
+ SPFilterPrimitive::release();
}
/**
* Sets a specific value in the SPFeOffset.
*/
-static void
-sp_feOffset_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeOffset *feOffset = SP_FEOFFSET(object);
-
+void SPFeOffset::set(unsigned int key, gchar const *value) {
double read_num;
+
switch(key) {
case SP_ATTR_DX:
read_num = value ? helperfns_read_number(value) : 0;
- if (read_num != feOffset->dx) {
- feOffset->dx = read_num;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_num != this->dx) {
+ this->dx = read_num;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_DY:
read_num = value ? helperfns_read_number(value) : 0;
- if (read_num != feOffset->dy) {
- feOffset->dy = read_num;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_num != this->dy) {
+ this->dy = read_num;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
/*DEAL WITH SETTING ATTRIBUTES HERE*/
default:
- if (((SPObjectClass *) sp_feOffset_parent_class)->set)
- ((SPObjectClass *) sp_feOffset_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
-
}
/**
* Receives update notifications.
*/
-static void
-sp_feOffset_update(SPObject *object, SPCtx *ctx, guint flags)
-{
+void SPFeOffset::update(SPCtx *ctx, guint flags) {
if (flags & SP_OBJECT_MODIFIED_FLAG) {
- object->readAttr( "dx" );
- object->readAttr( "dy" );
+ this->readAttr( "dx" );
+ this->readAttr( "dy" );
}
- if (((SPObjectClass *) sp_feOffset_parent_class)->update) {
- ((SPObjectClass *) sp_feOffset_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feOffset_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
+Inkscape::XML::Node* SPFeOffset::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if (((SPObjectClass *) sp_feOffset_parent_class)->write) {
- ((SPObjectClass *) sp_feOffset_parent_class)->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
-static void sp_feOffset_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeOffset::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeOffset *sp_offset = SP_FEOFFSET(primitive);
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_OFFSET);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterOffset *nr_offset = dynamic_cast<Inkscape::Filters::FilterOffset*>(nr_primitive);
g_assert(nr_offset != NULL);
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ sp_filter_primitive_renderer_common(this, nr_primitive);
- nr_offset->set_dx(sp_offset->dx);
- nr_offset->set_dy(sp_offset->dy);
+ nr_offset->set_dx(this->dx);
+ nr_offset->set_dy(this->dy);
}
diff --git a/src/filters/offset.h b/src/filters/offset.h
index 08954a8e4..0d26f6f90 100644
--- a/src/filters/offset.h
+++ b/src/filters/offset.h
@@ -14,22 +14,28 @@
#include "sp-filter-primitive.h"
-#define SP_TYPE_FEOFFSET (sp_feOffset_get_type())
-#define SP_FEOFFSET(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEOFFSET, SPFeOffset))
-#define SP_FEOFFSET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FEOFFSET, SPFeOffsetClass))
-#define SP_IS_FEOFFSET(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEOFFSET))
-#define SP_IS_FEOFFSET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FEOFFSET))
+#define SP_FEOFFSET(obj) (dynamic_cast<SPFeOffset*>((SPObject*)obj))
+#define SP_IS_FEOFFSET(obj) (dynamic_cast<const SPFeOffset*>((SPObject*)obj) != NULL)
+
+class SPFeOffset : public SPFilterPrimitive {
+public:
+ SPFeOffset();
+ virtual ~SPFeOffset();
-struct SPFeOffset : public SPFilterPrimitive {
double dx, dy;
-};
-struct SPFeOffsetClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
-GType sp_feOffset_get_type();
+ virtual void set(unsigned int key, const gchar* value);
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FEOFFSET_H_SEEN */
diff --git a/src/filters/pointlight.cpp b/src/filters/pointlight.cpp
index a512172d1..1c7532b4e 100644
--- a/src/filters/pointlight.cpp
+++ b/src/filters/pointlight.cpp
@@ -29,71 +29,48 @@
#define SP_MACROS_SILENT
#include "macros.h"
-/* FePointLight class */
-static void sp_fepointlight_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_fepointlight_release(SPObject *object);
-static void sp_fepointlight_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_fepointlight_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_fepointlight_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-
-G_DEFINE_TYPE(SPFePointLight, sp_fepointlight, SP_TYPE_OBJECT);
-
-static void
-sp_fepointlight_class_init(SPFePointLightClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
-
- sp_object_class->build = sp_fepointlight_build;
- sp_object_class->release = sp_fepointlight_release;
- sp_object_class->write = sp_fepointlight_write;
- sp_object_class->set = sp_fepointlight_set;
- sp_object_class->update = sp_fepointlight_update;
+#include "sp-factory.h"
+
+namespace {
+ SPObject* createPointLight() {
+ return new SPFePointLight();
+ }
+
+ bool pointLightRegistered = SPFactory::instance().registerObject("svg:fePointLight", createPointLight);
}
-static void
-sp_fepointlight_init(SPFePointLight *fepointlight)
-{
- fepointlight->x = 0;
- fepointlight->y = 0;
- fepointlight->z = 0;
+SPFePointLight::SPFePointLight()
+ : SPObject(), x(0), x_set(FALSE), y(0), y_set(FALSE), z(0), z_set(FALSE) {
+}
- fepointlight->x_set = FALSE;
- fepointlight->y_set = FALSE;
- fepointlight->z_set = FALSE;
+SPFePointLight::~SPFePointLight() {
}
+
/**
* Reads the Inkscape::XML::Node, and initializes SPPointLight variables. For this to get called,
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_fepointlight_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_fepointlight_parent_class)->build) {
- ((SPObjectClass *) sp_fepointlight_parent_class)->build(object, document, repr);
- }
+void SPFePointLight::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPObject::build(document, repr);
//Read values of key attributes from XML nodes into object.
- object->readAttr( "x" );
- object->readAttr( "y" );
- object->readAttr( "z" );
+ this->readAttr( "x" );
+ this->readAttr( "y" );
+ this->readAttr( "z" );
//is this necessary?
- document->addResource("fepointlight", object);
+ document->addResource("fepointlight", this);
}
/**
* Drops any allocated memory.
*/
-static void
-sp_fepointlight_release(SPObject *object)
-{
- //SPFePointLight *fepointlight = SP_FEPOINTLIGHT(object);
-
- if ( object->document ) {
+void SPFePointLight::release() {
+ if ( this->document ) {
// Unregister ourselves
- object->document->removeResource("fepointlight", object);
+ this->document->removeResource("fepointlight", this);
}
//TODO: release resources here
@@ -102,71 +79,79 @@ sp_fepointlight_release(SPObject *object)
/**
* Sets a specific value in the SPFePointLight.
*/
-static void
-sp_fepointlight_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFePointLight *fepointlight = SP_FEPOINTLIGHT(object);
+void SPFePointLight::set(unsigned int key, gchar const *value) {
gchar *end_ptr;
+
switch (key) {
case SP_ATTR_X:
end_ptr = NULL;
+
if (value) {
- fepointlight->x = g_ascii_strtod(value, &end_ptr);
+ this->x = g_ascii_strtod(value, &end_ptr);
+
if (end_ptr) {
- fepointlight->x_set = TRUE;
+ this->x_set = TRUE;
}
}
+
if (!value || !end_ptr) {
- fepointlight->x = 0;
- fepointlight->x_set = FALSE;
+ this->x = 0;
+ this->x_set = FALSE;
}
- if (object->parent &&
- (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
- SP_IS_FESPECULARLIGHTING(object->parent))) {
- object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->parent &&
+ (SP_IS_FEDIFFUSELIGHTING(this->parent) ||
+ SP_IS_FESPECULARLIGHTING(this->parent))) {
+ this->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_Y:
end_ptr = NULL;
+
if (value) {
- fepointlight->y = g_ascii_strtod(value, &end_ptr);
+ this->y = g_ascii_strtod(value, &end_ptr);
+
if (end_ptr) {
- fepointlight->y_set = TRUE;
+ this->y_set = TRUE;
}
}
+
if (!value || !end_ptr) {
- fepointlight->y = 0;
- fepointlight->y_set = FALSE;
+ this->y = 0;
+ this->y_set = FALSE;
}
- if (object->parent &&
- (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
- SP_IS_FESPECULARLIGHTING(object->parent))) {
- object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->parent &&
+ (SP_IS_FEDIFFUSELIGHTING(this->parent) ||
+ SP_IS_FESPECULARLIGHTING(this->parent))) {
+ this->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_Z:
end_ptr = NULL;
+
if (value) {
- fepointlight->z = g_ascii_strtod(value, &end_ptr);
+ this->z = g_ascii_strtod(value, &end_ptr);
+
if (end_ptr) {
- fepointlight->z_set = TRUE;
+ this->z_set = TRUE;
}
}
+
if (!value || !end_ptr) {
- fepointlight->z = 0;
- fepointlight->z_set = FALSE;
+ this->z = 0;
+ this->z_set = FALSE;
}
- if (object->parent &&
- (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
- SP_IS_FESPECULARLIGHTING(object->parent))) {
- object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->parent &&
+ (SP_IS_FEDIFFUSELIGHTING(this->parent) ||
+ SP_IS_FESPECULARLIGHTING(this->parent))) {
+ this->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
default:
// See if any parents need this value.
- if (((SPObjectClass *) sp_fepointlight_parent_class)->set) {
- ((SPObjectClass *) sp_fepointlight_parent_class)->set(object, key, value);
- }
+ SPObject::set(key, value);
break;
}
}
@@ -174,46 +159,33 @@ sp_fepointlight_set(SPObject *object, unsigned int key, gchar const *value)
/**
* * Receives update notifications.
* */
-static void
-sp_fepointlight_update(SPObject *object, SPCtx *ctx, guint flags)
-{
- SPFePointLight *fePointLight = SP_FEPOINTLIGHT(object);
- (void)fePointLight;
-
+void SPFePointLight::update(SPCtx *ctx, guint flags) {
if (flags & SP_OBJECT_MODIFIED_FLAG) {
/* do something to trigger redisplay, updates? */
- object->readAttr( "x" );
- object->readAttr( "y" );
- object->readAttr( "z" );
+ this->readAttr( "x" );
+ this->readAttr( "y" );
+ this->readAttr( "z" );
}
- if (((SPObjectClass *) sp_fepointlight_parent_class)->update) {
- ((SPObjectClass *) sp_fepointlight_parent_class)->update(object, ctx, flags);
- }
+ SPObject::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_fepointlight_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
- SPFePointLight *fepointlight = SP_FEPOINTLIGHT(object);
-
+Inkscape::XML::Node* SPFePointLight::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if (fepointlight->x_set)
- sp_repr_set_css_double(repr, "x", fepointlight->x);
- if (fepointlight->y_set)
- sp_repr_set_css_double(repr, "y", fepointlight->y);
- if (fepointlight->z_set)
- sp_repr_set_css_double(repr, "z", fepointlight->z);
+ if (this->x_set)
+ sp_repr_set_css_double(repr, "x", this->x);
+ if (this->y_set)
+ sp_repr_set_css_double(repr, "y", this->y);
+ if (this->z_set)
+ sp_repr_set_css_double(repr, "z", this->z);
- if (((SPObjectClass *) sp_fepointlight_parent_class)->write) {
- ((SPObjectClass *) sp_fepointlight_parent_class)->write(object, doc, repr, flags);
- }
+ SPObject::write(doc, repr, flags);
return repr;
}
diff --git a/src/filters/pointlight.h b/src/filters/pointlight.h
index 3ec5d5791..3819d8ff5 100644
--- a/src/filters/pointlight.h
+++ b/src/filters/pointlight.h
@@ -17,13 +17,13 @@
#include "sp-object.h"
-#define SP_TYPE_FEPOINTLIGHT (sp_fepointlight_get_type())
-#define SP_FEPOINTLIGHT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEPOINTLIGHT, SPFePointLight))
-#define SP_FEPOINTLIGHT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FEPOINTLIGHT, SPFePointLightClass))
-#define SP_IS_FEPOINTLIGHT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEPOINTLIGHT))
-#define SP_IS_FEPOINTLIGHT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FEPOINTLIGHT))
+#define SP_FEPOINTLIGHT(obj) (dynamic_cast<SPFePointLight*>((SPObject*)obj))
+#define SP_IS_FEPOINTLIGHT(obj) (dynamic_cast<const SPFePointLight*>((SPObject*)obj) != NULL)
-struct SPFePointLight : public SPObject {
+class SPFePointLight : public SPObject {
+public:
+ SPFePointLight();
+ virtual ~SPFePointLight();
/** x coordinate of the light source */
gfloat x;
@@ -35,15 +35,17 @@ struct SPFePointLight : public SPObject {
gfloat z;
guint z_set : 1;
- //other fields
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void set(unsigned int key, const gchar* value);
+
+ virtual void update(SPCtx* ctx, unsigned int flags);
-struct SPFePointLightClass {
- SPObjectClass parent_class;
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
};
-GType
-sp_fepointlight_get_type();
#endif /* !SP_FEPOINTLIGHT_H_SEEN */
/*
diff --git a/src/filters/specularlighting.cpp b/src/filters/specularlighting.cpp
index a7a19e11d..6cdd5d9ba 100644
--- a/src/filters/specularlighting.cpp
+++ b/src/filters/specularlighting.cpp
@@ -34,59 +34,35 @@
#include "display/nr-filter-specularlighting.h"
/* FeSpecularLighting base class */
-static void sp_feSpecularLighting_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feSpecularLighting_release(SPObject *object);
-static void sp_feSpecularLighting_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feSpecularLighting_update(SPObject *object, SPCtx *ctx, guint flags);
-//we assume that svg:feSpecularLighting can have any number of children
-//only the first one is considered as the light source of the filter
-//TODO is that right?
-//if not modify child_added and remove_child to raise errors
-static void sp_feSpecularLighting_child_added(SPObject *object,
- Inkscape::XML::Node *child,
- Inkscape::XML::Node *ref);
-static void sp_feSpecularLighting_remove_child(SPObject *object, Inkscape::XML::Node *child);
-static void sp_feSpecularLighting_order_changed(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref);
-static Inkscape::XML::Node *sp_feSpecularLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_feSpecularLighting_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
static void sp_feSpecularLighting_children_modified(SPFeSpecularLighting *sp_specularlighting);
-G_DEFINE_TYPE(SPFeSpecularLighting, sp_feSpecularLighting, SP_TYPE_FILTER_PRIMITIVE);
+#include "sp-factory.h"
-static void
-sp_feSpecularLighting_class_init(SPFeSpecularLightingClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
+namespace {
+ SPObject* createSpecularLighting() {
+ return new SPFeSpecularLighting();
+ }
- sp_object_class->build = sp_feSpecularLighting_build;
- sp_object_class->release = sp_feSpecularLighting_release;
- sp_object_class->write = sp_feSpecularLighting_write;
- sp_object_class->set = sp_feSpecularLighting_set;
- sp_object_class->update = sp_feSpecularLighting_update;
- sp_object_class->child_added = sp_feSpecularLighting_child_added;
- sp_object_class->remove_child = sp_feSpecularLighting_remove_child;
- sp_object_class->order_changed = sp_feSpecularLighting_order_changed;
-
- sp_primitive_class->build_renderer = sp_feSpecularLighting_build_renderer;
+ bool specularLightingRegistered = SPFactory::instance().registerObject("svg:feSpecularLighting", createSpecularLighting);
}
-static void
-sp_feSpecularLighting_init(SPFeSpecularLighting *feSpecularLighting)
-{
- feSpecularLighting->surfaceScale = 1;
- feSpecularLighting->specularConstant = 1;
- feSpecularLighting->specularExponent = 1;
- feSpecularLighting->lighting_color = 0xffffffff;
- feSpecularLighting->icc = NULL;
+SPFeSpecularLighting::SPFeSpecularLighting() : SPFilterPrimitive() {
+ this->surfaceScale = 1;
+ this->specularConstant = 1;
+ this->specularExponent = 1;
+ this->lighting_color = 0xffffffff;
+ this->icc = NULL;
//TODO kernelUnit
- feSpecularLighting->renderer = NULL;
+ this->renderer = NULL;
- feSpecularLighting->surfaceScale_set = FALSE;
- feSpecularLighting->specularConstant_set = FALSE;
- feSpecularLighting->specularExponent_set = FALSE;
- feSpecularLighting->lighting_color_set = FALSE;
+ this->surfaceScale_set = FALSE;
+ this->specularConstant_set = FALSE;
+ this->specularExponent_set = FALSE;
+ this->lighting_color_set = FALSE;
+}
+
+SPFeSpecularLighting::~SPFeSpecularLighting() {
}
/**
@@ -94,196 +70,181 @@ sp_feSpecularLighting_init(SPFeSpecularLighting *feSpecularLighting)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feSpecularLighting_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_feSpecularLighting_parent_class)->build) {
- ((SPObjectClass *) sp_feSpecularLighting_parent_class)->build(object, document, repr);
- }
-
- /*LOAD ATTRIBUTES FROM REPR HERE*/
- object->readAttr( "surfaceScale" );
- object->readAttr( "specularConstant" );
- object->readAttr( "specularExponent" );
- object->readAttr( "kernelUnitLength" );
- object->readAttr( "lighting-color" );
-
+void SPFeSpecularLighting::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
+
+ /*LOAD ATTRIBUTES FROM REPR HERE*/
+ this->readAttr( "surfaceScale" );
+ this->readAttr( "specularConstant" );
+ this->readAttr( "specularExponent" );
+ this->readAttr( "kernelUnitLength" );
+ this->readAttr( "lighting-color" );
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feSpecularLighting_release(SPObject *object)
-{
- if (((SPObjectClass *) sp_feSpecularLighting_parent_class)->release)
- ((SPObjectClass *) sp_feSpecularLighting_parent_class)->release(object);
+void SPFeSpecularLighting::release() {
+ SPFilterPrimitive::release();
}
/**
* Sets a specific value in the SPFeSpecularLighting.
*/
-static void
-sp_feSpecularLighting_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeSpecularLighting *feSpecularLighting = SP_FESPECULARLIGHTING(object);
+void SPFeSpecularLighting::set(unsigned int key, gchar const *value) {
gchar const *cend_ptr = NULL;
gchar *end_ptr = NULL;
+
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
//TODO test forbidden values
case SP_ATTR_SURFACESCALE:
end_ptr = NULL;
if (value) {
- feSpecularLighting->surfaceScale = g_ascii_strtod(value, &end_ptr);
+ this->surfaceScale = g_ascii_strtod(value, &end_ptr);
if (end_ptr) {
- feSpecularLighting->surfaceScale_set = TRUE;
+ this->surfaceScale_set = TRUE;
} else {
- g_warning("feSpecularLighting: surfaceScale should be a number ... defaulting to 1");
+ g_warning("this: surfaceScale should be a number ... defaulting to 1");
}
}
//if the attribute is not set or has an unreadable value
if (!value || !end_ptr) {
- feSpecularLighting->surfaceScale = 1;
- feSpecularLighting->surfaceScale_set = FALSE;
+ this->surfaceScale = 1;
+ this->surfaceScale_set = FALSE;
}
- if (feSpecularLighting->renderer) {
- feSpecularLighting->renderer->surfaceScale = feSpecularLighting->surfaceScale;
+ if (this->renderer) {
+ this->renderer->surfaceScale = this->surfaceScale;
}
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_SPECULARCONSTANT:
end_ptr = NULL;
if (value) {
- feSpecularLighting->specularConstant = g_ascii_strtod(value, &end_ptr);
- if (end_ptr && feSpecularLighting->specularConstant >= 0) {
- feSpecularLighting->specularConstant_set = TRUE;
+ this->specularConstant = g_ascii_strtod(value, &end_ptr);
+ if (end_ptr && this->specularConstant >= 0) {
+ this->specularConstant_set = TRUE;
} else {
end_ptr = NULL;
- g_warning("feSpecularLighting: specularConstant should be a positive number ... defaulting to 1");
+ g_warning("this: specularConstant should be a positive number ... defaulting to 1");
}
}
if (!value || !end_ptr) {
- feSpecularLighting->specularConstant = 1;
- feSpecularLighting->specularConstant_set = FALSE;
+ this->specularConstant = 1;
+ this->specularConstant_set = FALSE;
}
- if (feSpecularLighting->renderer) {
- feSpecularLighting->renderer->specularConstant = feSpecularLighting->specularConstant;
+ if (this->renderer) {
+ this->renderer->specularConstant = this->specularConstant;
}
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_SPECULAREXPONENT:
end_ptr = NULL;
if (value) {
- feSpecularLighting->specularExponent = g_ascii_strtod(value, &end_ptr);
- if (feSpecularLighting->specularExponent >= 1 && feSpecularLighting->specularExponent <= 128) {
- feSpecularLighting->specularExponent_set = TRUE;
+ this->specularExponent = g_ascii_strtod(value, &end_ptr);
+ if (this->specularExponent >= 1 && this->specularExponent <= 128) {
+ this->specularExponent_set = TRUE;
} else {
end_ptr = NULL;
- g_warning("feSpecularLighting: specularExponent should be a number in range [1, 128] ... defaulting to 1");
+ g_warning("this: specularExponent should be a number in range [1, 128] ... defaulting to 1");
}
}
if (!value || !end_ptr) {
- feSpecularLighting->specularExponent = 1;
- feSpecularLighting->specularExponent_set = FALSE;
+ this->specularExponent = 1;
+ this->specularExponent_set = FALSE;
}
- if (feSpecularLighting->renderer) {
- feSpecularLighting->renderer->specularExponent = feSpecularLighting->specularExponent;
+ if (this->renderer) {
+ this->renderer->specularExponent = this->specularExponent;
}
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_KERNELUNITLENGTH:
//TODO kernelUnit
- //feSpecularLighting->kernelUnitLength.set(value);
+ //this->kernelUnitLength.set(value);
/*TODOif (feSpecularLighting->renderer) {
feSpecularLighting->renderer->surfaceScale = feSpecularLighting->renderer;
}
*/
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_PROP_LIGHTING_COLOR:
cend_ptr = NULL;
- feSpecularLighting->lighting_color = sp_svg_read_color(value, &cend_ptr, 0xffffffff);
+ this->lighting_color = sp_svg_read_color(value, &cend_ptr, 0xffffffff);
//if a value was read
if (cend_ptr) {
while (g_ascii_isspace(*cend_ptr)) {
++cend_ptr;
}
if (strneq(cend_ptr, "icc-color(", 10)) {
- if (!feSpecularLighting->icc) feSpecularLighting->icc = new SVGICCColor();
- if ( ! sp_svg_read_icc_color( cend_ptr, feSpecularLighting->icc ) ) {
- delete feSpecularLighting->icc;
- feSpecularLighting->icc = NULL;
+ if (!this->icc) this->icc = new SVGICCColor();
+ if ( ! sp_svg_read_icc_color( cend_ptr, this->icc ) ) {
+ delete this->icc;
+ this->icc = NULL;
}
}
- feSpecularLighting->lighting_color_set = TRUE;
+ this->lighting_color_set = TRUE;
} else {
//lighting_color already contains the default value
- feSpecularLighting->lighting_color_set = FALSE;
+ this->lighting_color_set = FALSE;
}
- if (feSpecularLighting->renderer) {
- feSpecularLighting->renderer->lighting_color = feSpecularLighting->lighting_color;
+ if (this->renderer) {
+ this->renderer->lighting_color = this->lighting_color;
}
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
default:
- if (((SPObjectClass *) sp_feSpecularLighting_parent_class)->set)
- ((SPObjectClass *) sp_feSpecularLighting_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
-
}
/**
* Receives update notifications.
*/
-static void
-sp_feSpecularLighting_update(SPObject *object, SPCtx *ctx, guint flags)
-{
+void SPFeSpecularLighting::update(SPCtx *ctx, guint flags) {
if (flags & (SP_OBJECT_MODIFIED_FLAG)) {
- object->readAttr( "surfaceScale" );
- object->readAttr( "specularConstant" );
- object->readAttr( "specularExponent" );
- object->readAttr( "kernelUnitLength" );
- object->readAttr( "lighting-color" );
+ this->readAttr( "surfaceScale" );
+ this->readAttr( "specularConstant" );
+ this->readAttr( "specularExponent" );
+ this->readAttr( "kernelUnitLength" );
+ this->readAttr( "lighting-color" );
}
- if (((SPObjectClass *) sp_feSpecularLighting_parent_class)->update) {
- ((SPObjectClass *) sp_feSpecularLighting_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feSpecularLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
- SPFeSpecularLighting *fespecularlighting = SP_FESPECULARLIGHTING(object);
-
+Inkscape::XML::Node* SPFeSpecularLighting::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values _and children_ into it */
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
//repr = doc->createElement("svg:feSpecularLighting");
}
- if (fespecularlighting->surfaceScale_set)
- sp_repr_set_css_double(repr, "surfaceScale", fespecularlighting->surfaceScale);
- if (fespecularlighting->specularConstant_set)
- sp_repr_set_css_double(repr, "specularConstant", fespecularlighting->specularConstant);
- if (fespecularlighting->specularExponent_set)
- sp_repr_set_css_double(repr, "specularExponent", fespecularlighting->specularExponent);
- /*TODO kernelUnits */
- if (fespecularlighting->lighting_color_set) {
+ if (this->surfaceScale_set) {
+ sp_repr_set_css_double(repr, "surfaceScale", this->surfaceScale);
+ }
+
+ if (this->specularConstant_set) {
+ sp_repr_set_css_double(repr, "specularConstant", this->specularConstant);
+ }
+
+ if (this->specularExponent_set) {
+ sp_repr_set_css_double(repr, "specularExponent", this->specularExponent);
+ }
+
+ /*TODO kernelUnits */
+ if (this->lighting_color_set) {
gchar c[64];
- sp_svg_write_color(c, sizeof(c), fespecularlighting->lighting_color);
+ sp_svg_write_color(c, sizeof(c), this->lighting_color);
repr->setAttribute("lighting-color", c);
}
- if (((SPObjectClass *) sp_feSpecularLighting_parent_class)->write) {
- ((SPObjectClass *) sp_feSpecularLighting_parent_class)->write(object, doc, repr, flags);
- }
+
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
@@ -291,97 +252,85 @@ sp_feSpecularLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inks
/**
* Callback for child_added event.
*/
-static void
-sp_feSpecularLighting_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref)
-{
- SPFeSpecularLighting *f = SP_FESPECULARLIGHTING(object);
+void SPFeSpecularLighting::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) {
+ SPFilterPrimitive::child_added(child, ref);
- if (((SPObjectClass *) sp_feSpecularLighting_parent_class)->child_added)
- (* ((SPObjectClass *) sp_feSpecularLighting_parent_class)->child_added)(object, child, ref);
-
- sp_feSpecularLighting_children_modified(f);
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ sp_feSpecularLighting_children_modified(this);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
-
/**
* Callback for remove_child event.
*/
-static void
-sp_feSpecularLighting_remove_child(SPObject *object, Inkscape::XML::Node *child)
-{
- SPFeSpecularLighting *f = SP_FESPECULARLIGHTING(object);
-
- if (((SPObjectClass *) sp_feSpecularLighting_parent_class)->remove_child)
- (* ((SPObjectClass *) sp_feSpecularLighting_parent_class)->remove_child)(object, child);
+void SPFeSpecularLighting::remove_child(Inkscape::XML::Node *child) {
+ SPFilterPrimitive::remove_child(child);
- sp_feSpecularLighting_children_modified(f);
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ sp_feSpecularLighting_children_modified(this);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
-static void
-sp_feSpecularLighting_order_changed (SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref)
-{
- SPFeSpecularLighting *f = SP_FESPECULARLIGHTING(object);
- if (((SPObjectClass *) (sp_feSpecularLighting_parent_class))->order_changed)
- (* ((SPObjectClass *) (sp_feSpecularLighting_parent_class))->order_changed) (object, child, old_ref, new_ref);
+void SPFeSpecularLighting::order_changed(Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref) {
+ SPFilterPrimitive::order_changed(child, old_ref, new_ref);
- sp_feSpecularLighting_children_modified(f);
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ sp_feSpecularLighting_children_modified(this);
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
-static void sp_feSpecularLighting_children_modified(SPFeSpecularLighting *sp_specularlighting)
-{
- if (sp_specularlighting->renderer) {
+static void sp_feSpecularLighting_children_modified(SPFeSpecularLighting *sp_specularlighting) {
+ if (sp_specularlighting->renderer) {
sp_specularlighting->renderer->light_type = Inkscape::Filters::NO_LIGHT;
+
if (SP_IS_FEDISTANTLIGHT(sp_specularlighting->children)) {
sp_specularlighting->renderer->light_type = Inkscape::Filters::DISTANT_LIGHT;
sp_specularlighting->renderer->light.distant = SP_FEDISTANTLIGHT(sp_specularlighting->children);
}
+
if (SP_IS_FEPOINTLIGHT(sp_specularlighting->children)) {
sp_specularlighting->renderer->light_type = Inkscape::Filters::POINT_LIGHT;
sp_specularlighting->renderer->light.point = SP_FEPOINTLIGHT(sp_specularlighting->children);
}
+
if (SP_IS_FESPOTLIGHT(sp_specularlighting->children)) {
sp_specularlighting->renderer->light_type = Inkscape::Filters::SPOT_LIGHT;
sp_specularlighting->renderer->light.spot = SP_FESPOTLIGHT(sp_specularlighting->children);
}
- }
+ }
}
-static void sp_feSpecularLighting_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeSpecularLighting::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeSpecularLighting *sp_specularlighting = SP_FESPECULARLIGHTING(primitive);
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_SPECULARLIGHTING);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterSpecularLighting *nr_specularlighting = dynamic_cast<Inkscape::Filters::FilterSpecularLighting*>(nr_primitive);
g_assert(nr_specularlighting != NULL);
- sp_specularlighting->renderer = nr_specularlighting;
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ this->renderer = nr_specularlighting;
+ sp_filter_primitive_renderer_common(this, nr_primitive);
- nr_specularlighting->specularConstant = sp_specularlighting->specularConstant;
- nr_specularlighting->specularExponent = sp_specularlighting->specularExponent;
- nr_specularlighting->surfaceScale = sp_specularlighting->surfaceScale;
- nr_specularlighting->lighting_color = sp_specularlighting->lighting_color;
- nr_specularlighting->set_icc(sp_specularlighting->icc);
+ nr_specularlighting->specularConstant = this->specularConstant;
+ nr_specularlighting->specularExponent = this->specularExponent;
+ nr_specularlighting->surfaceScale = this->surfaceScale;
+ nr_specularlighting->lighting_color = this->lighting_color;
+ nr_specularlighting->set_icc(this->icc);
//We assume there is at most one child
nr_specularlighting->light_type = Inkscape::Filters::NO_LIGHT;
- if (SP_IS_FEDISTANTLIGHT(primitive->children)) {
+
+ if (SP_IS_FEDISTANTLIGHT(this->children)) {
nr_specularlighting->light_type = Inkscape::Filters::DISTANT_LIGHT;
- nr_specularlighting->light.distant = SP_FEDISTANTLIGHT(primitive->children);
+ nr_specularlighting->light.distant = SP_FEDISTANTLIGHT(this->children);
}
- if (SP_IS_FEPOINTLIGHT(primitive->children)) {
+
+ if (SP_IS_FEPOINTLIGHT(this->children)) {
nr_specularlighting->light_type = Inkscape::Filters::POINT_LIGHT;
- nr_specularlighting->light.point = SP_FEPOINTLIGHT(primitive->children);
+ nr_specularlighting->light.point = SP_FEPOINTLIGHT(this->children);
}
- if (SP_IS_FESPOTLIGHT(primitive->children)) {
+
+ if (SP_IS_FESPOTLIGHT(this->children)) {
nr_specularlighting->light_type = Inkscape::Filters::SPOT_LIGHT;
- nr_specularlighting->light.spot = SP_FESPOTLIGHT(primitive->children);
+ nr_specularlighting->light.spot = SP_FESPOTLIGHT(this->children);
}
//nr_offset->set_dx(sp_offset->dx);
diff --git a/src/filters/specularlighting.h b/src/filters/specularlighting.h
index 4b31eb4c4..1de32ec58 100644
--- a/src/filters/specularlighting.h
+++ b/src/filters/specularlighting.h
@@ -17,11 +17,8 @@
#include "sp-filter-primitive.h"
#include "number-opt-number.h"
-#define SP_TYPE_FESPECULARLIGHTING (sp_feSpecularLighting_get_type())
-#define SP_FESPECULARLIGHTING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FESPECULARLIGHTING, SPFeSpecularLighting))
-#define SP_FESPECULARLIGHTING_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FESPECULARLIGHTING, SPFeSpecularLightingClass))
-#define SP_IS_FESPECULARLIGHTING(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FESPECULARLIGHTING))
-#define SP_IS_FESPECULARLIGHTING_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FESPECULARLIGHTING))
+#define SP_FESPECULARLIGHTING(obj) (dynamic_cast<SPFeSpecularLighting*>((SPObject*)obj))
+#define SP_IS_FESPECULARLIGHTING(obj) (dynamic_cast<const SPFeSpecularLighting*>((SPObject*)obj) != NULL)
struct SVGICCColor;
@@ -31,7 +28,11 @@ class FilterSpecularLighting;
}
}
-struct SPFeSpecularLighting : public SPFilterPrimitive {
+class SPFeSpecularLighting : public SPFilterPrimitive {
+public:
+ SPFeSpecularLighting();
+ virtual ~SPFeSpecularLighting();
+
gfloat surfaceScale;
guint surfaceScale_set : 1;
gfloat specularConstant;
@@ -44,14 +45,24 @@ struct SPFeSpecularLighting : public SPFilterPrimitive {
SVGICCColor *icc;
Inkscape::Filters::FilterSpecularLighting *renderer;
-};
-struct SPFeSpecularLightingClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
+ virtual void remove_child(Inkscape::XML::Node* child);
-GType sp_feSpecularLighting_get_type();
+ virtual void order_changed(Inkscape::XML::Node* child, Inkscape::XML::Node* old_repr, Inkscape::XML::Node* new_repr);
+ virtual void set(unsigned int key, const gchar* value);
+
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FESPECULARLIGHTING_H_SEEN */
diff --git a/src/filters/spotlight.cpp b/src/filters/spotlight.cpp
index 181e39990..c0344067c 100644
--- a/src/filters/spotlight.cpp
+++ b/src/filters/spotlight.cpp
@@ -29,86 +29,57 @@
#define SP_MACROS_SILENT
#include "macros.h"
-/* FeSpotLight class */
-static void sp_fespotlight_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_fespotlight_release(SPObject *object);
-static void sp_fespotlight_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_fespotlight_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_fespotlight_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
+#include "sp-factory.h"
-G_DEFINE_TYPE(SPFeSpotLight, sp_fespotlight, SP_TYPE_OBJECT);
+namespace {
+ SPObject* createSpotLight() {
+ return new SPFeSpotLight();
+ }
-static void
-sp_fespotlight_class_init(SPFeSpotLightClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
-
- sp_object_class->build = sp_fespotlight_build;
- sp_object_class->release = sp_fespotlight_release;
- sp_object_class->write = sp_fespotlight_write;
- sp_object_class->set = sp_fespotlight_set;
- sp_object_class->update = sp_fespotlight_update;
+ bool spotLightRegistered = SPFactory::instance().registerObject("svg:feSpotLight", createSpotLight);
}
-static void
-sp_fespotlight_init(SPFeSpotLight *fespotlight)
+SPFeSpotLight::SPFeSpotLight()
+ : SPObject(), x(0), x_set(FALSE), y(0), y_set(FALSE), z(0), z_set(FALSE), pointsAtX(0), pointsAtX_set(FALSE),
+ pointsAtY(0), pointsAtY_set(FALSE), pointsAtZ(0), pointsAtZ_set(FALSE),
+ specularExponent(1), specularExponent_set(FALSE), limitingConeAngle(90),
+ limitingConeAngle_set(FALSE)
{
- fespotlight->x = 0;
- fespotlight->y = 0;
- fespotlight->z = 0;
- fespotlight->pointsAtX = 0;
- fespotlight->pointsAtY = 0;
- fespotlight->pointsAtZ = 0;
- fespotlight->specularExponent = 1;
- fespotlight->limitingConeAngle = 90;
+}
- fespotlight->x_set = FALSE;
- fespotlight->y_set = FALSE;
- fespotlight->z_set = FALSE;
- fespotlight->pointsAtX_set = FALSE;
- fespotlight->pointsAtY_set = FALSE;
- fespotlight->pointsAtZ_set = FALSE;
- fespotlight->specularExponent_set = FALSE;
- fespotlight->limitingConeAngle_set = FALSE;
+SPFeSpotLight::~SPFeSpotLight() {
}
+
/**
* Reads the Inkscape::XML::Node, and initializes SPPointLight variables. For this to get called,
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_fespotlight_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_fespotlight_parent_class)->build) {
- ((SPObjectClass *) sp_fespotlight_parent_class)->build(object, document, repr);
- }
+void SPFeSpotLight::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPObject::build(document, repr);
//Read values of key attributes from XML nodes into object.
- object->readAttr( "x" );
- object->readAttr( "y" );
- object->readAttr( "z" );
- object->readAttr( "pointsAtX" );
- object->readAttr( "pointsAtY" );
- object->readAttr( "pointsAtZ" );
- object->readAttr( "specularExponent" );
- object->readAttr( "limitingConeAngle" );
+ this->readAttr( "x" );
+ this->readAttr( "y" );
+ this->readAttr( "z" );
+ this->readAttr( "pointsAtX" );
+ this->readAttr( "pointsAtY" );
+ this->readAttr( "pointsAtZ" );
+ this->readAttr( "specularExponent" );
+ this->readAttr( "limitingConeAngle" );
//is this necessary?
- document->addResource("fespotlight", object);
+ document->addResource("fespotlight", this);
}
/**
* Drops any allocated memory.
*/
-static void
-sp_fespotlight_release(SPObject *object)
-{
- //SPFeSpotLight *fespotlight = SP_FESPOTLIGHT(object);
-
- if ( object->document ) {
+void SPFeSpotLight::release() {
+ if ( this->document ) {
// Unregister ourselves
- object->document->removeResource("fespotlight", object);
+ this->document->removeResource("fespotlight", this);
}
//TODO: release resources here
@@ -117,154 +88,189 @@ sp_fespotlight_release(SPObject *object)
/**
* Sets a specific value in the SPFeSpotLight.
*/
-static void
-sp_fespotlight_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeSpotLight *fespotlight = SP_FESPOTLIGHT(object);
+void SPFeSpotLight::set(unsigned int key, gchar const *value) {
gchar *end_ptr;
switch (key) {
case SP_ATTR_X:
end_ptr = NULL;
+
if (value) {
- fespotlight->x = g_ascii_strtod(value, &end_ptr);
- if (end_ptr)
- fespotlight->x_set = TRUE;
+ this->x = g_ascii_strtod(value, &end_ptr);
+
+ if (end_ptr) {
+ this->x_set = TRUE;
+ }
}
+
if(!value || !end_ptr) {
- fespotlight->x = 0;
- fespotlight->x_set = FALSE;
+ this->x = 0;
+ this->x_set = FALSE;
}
- if (object->parent &&
- (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
- SP_IS_FESPECULARLIGHTING(object->parent))) {
- object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->parent &&
+ (SP_IS_FEDIFFUSELIGHTING(this->parent) ||
+ SP_IS_FESPECULARLIGHTING(this->parent))) {
+ this->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_Y:
end_ptr = NULL;
+
if (value) {
- fespotlight->y = g_ascii_strtod(value, &end_ptr);
- if (end_ptr)
- fespotlight->y_set = TRUE;
+ this->y = g_ascii_strtod(value, &end_ptr);
+
+ if (end_ptr) {
+ this->y_set = TRUE;
+ }
}
+
if(!value || !end_ptr) {
- fespotlight->y = 0;
- fespotlight->y_set = FALSE;
+ this->y = 0;
+ this->y_set = FALSE;
}
- if (object->parent &&
- (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
- SP_IS_FESPECULARLIGHTING(object->parent))) {
- object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->parent &&
+ (SP_IS_FEDIFFUSELIGHTING(this->parent) ||
+ SP_IS_FESPECULARLIGHTING(this->parent))) {
+ this->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_Z:
end_ptr = NULL;
+
if (value) {
- fespotlight->z = g_ascii_strtod(value, &end_ptr);
- if (end_ptr)
- fespotlight->z_set = TRUE;
+ this->z = g_ascii_strtod(value, &end_ptr);
+
+ if (end_ptr) {
+ this->z_set = TRUE;
+ }
}
+
if(!value || !end_ptr) {
- fespotlight->z = 0;
- fespotlight->z_set = FALSE;
+ this->z = 0;
+ this->z_set = FALSE;
}
- if (object->parent &&
- (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
- SP_IS_FESPECULARLIGHTING(object->parent))) {
- object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->parent &&
+ (SP_IS_FEDIFFUSELIGHTING(this->parent) ||
+ SP_IS_FESPECULARLIGHTING(this->parent))) {
+ this->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_POINTSATX:
end_ptr = NULL;
+
if (value) {
- fespotlight->pointsAtX = g_ascii_strtod(value, &end_ptr);
- if (end_ptr)
- fespotlight->pointsAtX_set = TRUE;
+ this->pointsAtX = g_ascii_strtod(value, &end_ptr);
+
+ if (end_ptr) {
+ this->pointsAtX_set = TRUE;
+ }
}
+
if(!value || !end_ptr) {
- fespotlight->pointsAtX = 0;
- fespotlight->pointsAtX_set = FALSE;
+ this->pointsAtX = 0;
+ this->pointsAtX_set = FALSE;
}
- if (object->parent &&
- (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
- SP_IS_FESPECULARLIGHTING(object->parent))) {
- object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->parent &&
+ (SP_IS_FEDIFFUSELIGHTING(this->parent) ||
+ SP_IS_FESPECULARLIGHTING(this->parent))) {
+ this->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_POINTSATY:
end_ptr = NULL;
+
if (value) {
- fespotlight->pointsAtY = g_ascii_strtod(value, &end_ptr);
- if (end_ptr)
- fespotlight->pointsAtY_set = TRUE;
+ this->pointsAtY = g_ascii_strtod(value, &end_ptr);
+
+ if (end_ptr) {
+ this->pointsAtY_set = TRUE;
+ }
}
+
if(!value || !end_ptr) {
- fespotlight->pointsAtY = 0;
- fespotlight->pointsAtY_set = FALSE;
+ this->pointsAtY = 0;
+ this->pointsAtY_set = FALSE;
}
- if (object->parent &&
- (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
- SP_IS_FESPECULARLIGHTING(object->parent))) {
- object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->parent &&
+ (SP_IS_FEDIFFUSELIGHTING(this->parent) ||
+ SP_IS_FESPECULARLIGHTING(this->parent))) {
+ this->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_POINTSATZ:
end_ptr = NULL;
+
if (value) {
- fespotlight->pointsAtZ = g_ascii_strtod(value, &end_ptr);
- if (end_ptr)
- fespotlight->pointsAtZ_set = TRUE;
+ this->pointsAtZ = g_ascii_strtod(value, &end_ptr);
+
+ if (end_ptr) {
+ this->pointsAtZ_set = TRUE;
+ }
}
+
if(!value || !end_ptr) {
- fespotlight->pointsAtZ = 0;
- fespotlight->pointsAtZ_set = FALSE;
+ this->pointsAtZ = 0;
+ this->pointsAtZ_set = FALSE;
}
- if (object->parent &&
- (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
- SP_IS_FESPECULARLIGHTING(object->parent))) {
- object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->parent &&
+ (SP_IS_FEDIFFUSELIGHTING(this->parent) ||
+ SP_IS_FESPECULARLIGHTING(this->parent))) {
+ this->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_SPECULAREXPONENT:
end_ptr = NULL;
+
if (value) {
- fespotlight->specularExponent = g_ascii_strtod(value, &end_ptr);
- if (end_ptr)
- fespotlight->specularExponent_set = TRUE;
+ this->specularExponent = g_ascii_strtod(value, &end_ptr);
+
+ if (end_ptr) {
+ this->specularExponent_set = TRUE;
+ }
}
+
if(!value || !end_ptr) {
- fespotlight->specularExponent = 1;
- fespotlight->specularExponent_set = FALSE;
+ this->specularExponent = 1;
+ this->specularExponent_set = FALSE;
}
- if (object->parent &&
- (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
- SP_IS_FESPECULARLIGHTING(object->parent))) {
- object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->parent &&
+ (SP_IS_FEDIFFUSELIGHTING(this->parent) ||
+ SP_IS_FESPECULARLIGHTING(this->parent))) {
+ this->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_LIMITINGCONEANGLE:
end_ptr = NULL;
+
if (value) {
- fespotlight->limitingConeAngle = g_ascii_strtod(value, &end_ptr);
- if (end_ptr)
- fespotlight->limitingConeAngle_set = TRUE;
+ this->limitingConeAngle = g_ascii_strtod(value, &end_ptr);
+
+ if (end_ptr) {
+ this->limitingConeAngle_set = TRUE;
+ }
}
+
if(!value || !end_ptr) {
- fespotlight->limitingConeAngle = 90;
- fespotlight->limitingConeAngle_set = FALSE;
+ this->limitingConeAngle = 90;
+ this->limitingConeAngle_set = FALSE;
}
- if (object->parent &&
- (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
- SP_IS_FESPECULARLIGHTING(object->parent))) {
- object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (this->parent &&
+ (SP_IS_FEDIFFUSELIGHTING(this->parent) ||
+ SP_IS_FESPECULARLIGHTING(this->parent))) {
+ this->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
default:
// See if any parents need this value.
- if (((SPObjectClass *) sp_fespotlight_parent_class)->set) {
- ((SPObjectClass *) sp_fespotlight_parent_class)->set(object, key, value);
- }
+ SPObject::set(key, value);
break;
}
}
@@ -272,61 +278,48 @@ sp_fespotlight_set(SPObject *object, unsigned int key, gchar const *value)
/**
* * Receives update notifications.
* */
-static void
-sp_fespotlight_update(SPObject *object, SPCtx *ctx, guint flags)
-{
- SPFeSpotLight *feSpotLight = SP_FESPOTLIGHT(object);
- (void)feSpotLight;
-
+void SPFeSpotLight::update(SPCtx *ctx, guint flags) {
if (flags & SP_OBJECT_MODIFIED_FLAG) {
/* do something to trigger redisplay, updates? */
- object->readAttr( "x" );
- object->readAttr( "y" );
- object->readAttr( "z" );
- object->readAttr( "pointsAtX" );
- object->readAttr( "pointsAtY" );
- object->readAttr( "pointsAtZ" );
- object->readAttr( "specularExponent" );
- object->readAttr( "limitingConeAngle" );
+ this->readAttr( "x" );
+ this->readAttr( "y" );
+ this->readAttr( "z" );
+ this->readAttr( "pointsAtX" );
+ this->readAttr( "pointsAtY" );
+ this->readAttr( "pointsAtZ" );
+ this->readAttr( "specularExponent" );
+ this->readAttr( "limitingConeAngle" );
}
- if (((SPObjectClass *) sp_fespotlight_parent_class)->update) {
- ((SPObjectClass *) sp_fespotlight_parent_class)->update(object, ctx, flags);
- }
+ SPObject::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_fespotlight_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
- SPFeSpotLight *fespotlight = SP_FESPOTLIGHT(object);
-
+Inkscape::XML::Node* SPFeSpotLight::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if (fespotlight->x_set)
- sp_repr_set_css_double(repr, "x", fespotlight->x);
- if (fespotlight->y_set)
- sp_repr_set_css_double(repr, "y", fespotlight->y);
- if (fespotlight->z_set)
- sp_repr_set_css_double(repr, "z", fespotlight->z);
- if (fespotlight->pointsAtX_set)
- sp_repr_set_css_double(repr, "pointsAtX", fespotlight->pointsAtX);
- if (fespotlight->pointsAtY_set)
- sp_repr_set_css_double(repr, "pointsAtY", fespotlight->pointsAtY);
- if (fespotlight->pointsAtZ_set)
- sp_repr_set_css_double(repr, "pointsAtZ", fespotlight->pointsAtZ);
- if (fespotlight->specularExponent_set)
- sp_repr_set_css_double(repr, "specularExponent", fespotlight->specularExponent);
- if (fespotlight->limitingConeAngle_set)
- sp_repr_set_css_double(repr, "limitingConeAngle", fespotlight->limitingConeAngle);
+ if (this->x_set)
+ sp_repr_set_css_double(repr, "x", this->x);
+ if (this->y_set)
+ sp_repr_set_css_double(repr, "y", this->y);
+ if (this->z_set)
+ sp_repr_set_css_double(repr, "z", this->z);
+ if (this->pointsAtX_set)
+ sp_repr_set_css_double(repr, "pointsAtX", this->pointsAtX);
+ if (this->pointsAtY_set)
+ sp_repr_set_css_double(repr, "pointsAtY", this->pointsAtY);
+ if (this->pointsAtZ_set)
+ sp_repr_set_css_double(repr, "pointsAtZ", this->pointsAtZ);
+ if (this->specularExponent_set)
+ sp_repr_set_css_double(repr, "specularExponent", this->specularExponent);
+ if (this->limitingConeAngle_set)
+ sp_repr_set_css_double(repr, "limitingConeAngle", this->limitingConeAngle);
- if (((SPObjectClass *) sp_fespotlight_parent_class)->write) {
- ((SPObjectClass *) sp_fespotlight_parent_class)->write(object, doc, repr, flags);
- }
+ SPObject::write(doc, repr, flags);
return repr;
}
diff --git a/src/filters/spotlight.h b/src/filters/spotlight.h
index 1750ca95b..8caf12858 100644
--- a/src/filters/spotlight.h
+++ b/src/filters/spotlight.h
@@ -17,13 +17,13 @@
#include "sp-object.h"
-#define SP_TYPE_FESPOTLIGHT (sp_fespotlight_get_type())
-#define SP_FESPOTLIGHT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FESPOTLIGHT, SPFeSpotLight))
-#define SP_FESPOTLIGHT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FESPOTLIGHT, SPFeSpotLightClass))
-#define SP_IS_FESPOTLIGHT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FESPOTLIGHT))
-#define SP_IS_FESPOTLIGHT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FESPOTLIGHT))
+#define SP_FESPOTLIGHT(obj) (dynamic_cast<SPFeSpotLight*>((SPObject*)obj))
+#define SP_IS_FESPOTLIGHT(obj) (dynamic_cast<const SPFeSpotLight*>((SPObject*)obj) != NULL)
-struct SPFeSpotLight : public SPObject {
+class SPFeSpotLight : public SPObject {
+public:
+ SPFeSpotLight();
+ virtual ~SPFeSpotLight();
/** x coordinate of the light source */
gfloat x;
@@ -50,14 +50,18 @@ struct SPFeSpotLight : public SPObject {
gfloat limitingConeAngle;
guint limitingConeAngle_set : 1;
//other fields
-};
-struct SPFeSpotLightClass {
- SPObjectClass parent_class;
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void set(unsigned int key, const gchar* value);
+
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
};
-GType
-sp_fespotlight_get_type();
#endif /* !SP_FESPOTLIGHT_H_SEEN */
/*
diff --git a/src/filters/tile.cpp b/src/filters/tile.cpp
index d2725f50c..19e96f47d 100644
--- a/src/filters/tile.cpp
+++ b/src/filters/tile.cpp
@@ -22,33 +22,20 @@
#include "display/nr-filter.h"
#include "display/nr-filter-tile.h"
-/* FeTile base class */
-static void sp_feTile_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feTile_release(SPObject *object);
-static void sp_feTile_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feTile_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feTile_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_feTile_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
-
-G_DEFINE_TYPE(SPFeTile, sp_feTile, SP_TYPE_FILTER_PRIMITIVE);
-
-static void
-sp_feTile_class_init(SPFeTileClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
-
- sp_object_class->build = sp_feTile_build;
- sp_object_class->release = sp_feTile_release;
- sp_object_class->write = sp_feTile_write;
- sp_object_class->set = sp_feTile_set;
- sp_object_class->update = sp_feTile_update;
- sp_primitive_class->build_renderer = sp_feTile_build_renderer;
+#include "sp-factory.h"
+
+namespace {
+ SPObject* createTile() {
+ return new SPFeTile();
+ }
+
+ bool tileRegistered = SPFactory::instance().registerObject("svg:feTile", createTile);
+}
+
+SPFeTile::SPFeTile() : SPFilterPrimitive() {
}
-static void
-sp_feTile_init(SPFeTile */*feTile*/)
-{
+SPFeTile::~SPFeTile() {
}
/**
@@ -56,51 +43,33 @@ sp_feTile_init(SPFeTile */*feTile*/)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feTile_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_feTile_parent_class)->build) {
- ((SPObjectClass *) sp_feTile_parent_class)->build(object, document, repr);
- }
-
- /*LOAD ATTRIBUTES FROM REPR HERE*/
+void SPFeTile::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feTile_release(SPObject *object)
-{
- if (((SPObjectClass *) sp_feTile_parent_class)->release)
- ((SPObjectClass *) sp_feTile_parent_class)->release(object);
+void SPFeTile::release() {
+ SPFilterPrimitive::release();
}
/**
* Sets a specific value in the SPFeTile.
*/
-static void
-sp_feTile_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeTile *feTile = SP_FETILE(object);
- (void)feTile;
-
+void SPFeTile::set(unsigned int key, gchar const *value) {
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
default:
- if (((SPObjectClass *) sp_feTile_parent_class)->set)
- ((SPObjectClass *) sp_feTile_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
-
}
/**
* Receives update notifications.
*/
-static void
-sp_feTile_update(SPObject *object, SPCtx *ctx, guint flags)
-{
+void SPFeTile::update(SPCtx *ctx, guint flags) {
if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
@@ -108,43 +77,34 @@ sp_feTile_update(SPObject *object, SPCtx *ctx, guint flags)
}
- if (((SPObjectClass *) sp_feTile_parent_class)->update) {
- ((SPObjectClass *) sp_feTile_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feTile_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
+Inkscape::XML::Node* SPFeTile::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if (((SPObjectClass *) sp_feTile_parent_class)->write) {
- ((SPObjectClass *) sp_feTile_parent_class)->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
return repr;
}
-static void sp_feTile_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeTile::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeTile *sp_tile = SP_FETILE(primitive);
- (void)sp_tile;
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_TILE);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterTile *nr_tile = dynamic_cast<Inkscape::Filters::FilterTile*>(nr_primitive);
g_assert(nr_tile != NULL);
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ sp_filter_primitive_renderer_common(this, nr_primitive);
}
/*
diff --git a/src/filters/tile.h b/src/filters/tile.h
index 48a552fc8..cc1a006dd 100644
--- a/src/filters/tile.h
+++ b/src/filters/tile.h
@@ -14,22 +14,27 @@
#include "sp-filter-primitive.h"
-#define SP_TYPE_FETILE (sp_feTile_get_type())
-#define SP_FETILE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FETILE, SPFeTile))
-#define SP_FETILE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FETILE, SPFeTileClass))
-#define SP_IS_FETILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FETILE))
-#define SP_IS_FETILE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FETILE))
+#define SP_FETILE(obj) (dynamic_cast<SPFeTile*>((SPObject*)obj))
+#define SP_IS_FETILE(obj) (dynamic_cast<const SPFeTile*>((SPObject*)obj) != NULL)
/* FeTile base class */
-struct SPFeTile : public SPFilterPrimitive {
-
-};
+class SPFeTile : public SPFilterPrimitive {
+public:
+ SPFeTile();
+ virtual ~SPFeTile();
-struct SPFeTileClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+
+ virtual void set(unsigned int key, const gchar* value);
-GType sp_feTile_get_type();
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FETILE_H_SEEN */
diff --git a/src/filters/turbulence.cpp b/src/filters/turbulence.cpp
index c4d4ca4ae..d33667a8c 100644
--- a/src/filters/turbulence.cpp
+++ b/src/filters/turbulence.cpp
@@ -28,35 +28,26 @@
#include "display/nr-filter.h"
#include "display/nr-filter-turbulence.h"
-/* FeTurbulence base class */
-static void sp_feTurbulence_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
-static void sp_feTurbulence_release(SPObject *object);
-static void sp_feTurbulence_set(SPObject *object, unsigned int key, gchar const *value);
-static void sp_feTurbulence_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feTurbulence_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static void sp_feTurbulence_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter);
-
-G_DEFINE_TYPE(SPFeTurbulence, sp_feTurbulence, SP_TYPE_FILTER_PRIMITIVE);
-
-static void
-sp_feTurbulence_class_init(SPFeTurbulenceClass *klass)
-{
- SPObjectClass *sp_object_class = (SPObjectClass *)klass;
- SPFilterPrimitiveClass * sp_primitive_class = (SPFilterPrimitiveClass *)klass;
-
- sp_object_class->build = sp_feTurbulence_build;
- sp_object_class->release = sp_feTurbulence_release;
- sp_object_class->write = sp_feTurbulence_write;
- sp_object_class->set = sp_feTurbulence_set;
- sp_object_class->update = sp_feTurbulence_update;
-
- sp_primitive_class->build_renderer = sp_feTurbulence_build_renderer;
+#include "sp-factory.h"
+
+namespace {
+ SPObject* createTurbulence() {
+ return new SPFeTurbulence();
+ }
+
+ bool turbulenceRegistered = SPFactory::instance().registerObject("svg:feTurbulence", createTurbulence);
+}
+
+SPFeTurbulence::SPFeTurbulence() : SPFilterPrimitive() {
+ this->stitchTiles = 0;
+ this->seed = 0;
+ this->numOctaves = 0;
+ this->type = Inkscape::Filters::TURBULENCE_FRACTALNOISE;
+
+ this->updated=false;
}
-static void
-sp_feTurbulence_init(SPFeTurbulence *feTurbulence)
-{
- feTurbulence->updated=false;
+SPFeTurbulence::~SPFeTurbulence() {
}
/**
@@ -64,66 +55,70 @@ sp_feTurbulence_init(SPFeTurbulence *feTurbulence)
* our name must be associated with a repr via "sp_object_type_register". Best done through
* sp-object-repr.cpp's repr_name_entries array.
*/
-static void
-sp_feTurbulence_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
-{
- if (((SPObjectClass *) sp_feTurbulence_parent_class)->build) {
- ((SPObjectClass *) sp_feTurbulence_parent_class)->build(object, document, repr);
- }
-
- /*LOAD ATTRIBUTES FROM REPR HERE*/
- object->readAttr( "baseFrequency" );
- object->readAttr( "numOctaves" );
- object->readAttr( "seed" );
- object->readAttr( "stitchTiles" );
- object->readAttr( "type" );
+void SPFeTurbulence::build(SPDocument *document, Inkscape::XML::Node *repr) {
+ SPFilterPrimitive::build(document, repr);
+
+ /*LOAD ATTRIBUTES FROM REPR HERE*/
+ this->readAttr( "baseFrequency" );
+ this->readAttr( "numOctaves" );
+ this->readAttr( "seed" );
+ this->readAttr( "stitchTiles" );
+ this->readAttr( "type" );
}
/**
* Drops any allocated memory.
*/
-static void
-sp_feTurbulence_release(SPObject *object)
-{
- if (((SPObjectClass *) sp_feTurbulence_parent_class)->release)
- ((SPObjectClass *) sp_feTurbulence_parent_class)->release(object);
+void SPFeTurbulence::release() {
+ SPFilterPrimitive::release();
}
static bool sp_feTurbulence_read_stitchTiles(gchar const *value){
- if (!value) return false; // 'noStitch' is default
+ if (!value) {
+ return false; // 'noStitch' is default
+ }
+
switch(value[0]){
case 's':
- if (strncmp(value, "stitch", 6) == 0) return true;
+ if (strncmp(value, "stitch", 6) == 0) {
+ return true;
+ }
break;
case 'n':
- if (strncmp(value, "noStitch", 8) == 0) return false;
+ if (strncmp(value, "noStitch", 8) == 0) {
+ return false;
+ }
break;
}
+
return false; // 'noStitch' is default
}
static Inkscape::Filters::FilterTurbulenceType sp_feTurbulence_read_type(gchar const *value){
- if (!value) return Inkscape::Filters::TURBULENCE_TURBULENCE; // 'turbulence' is default
+ if (!value) {
+ return Inkscape::Filters::TURBULENCE_TURBULENCE; // 'turbulence' is default
+ }
+
switch(value[0]){
case 'f':
- if (strncmp(value, "fractalNoise", 12) == 0) return Inkscape::Filters::TURBULENCE_FRACTALNOISE;
+ if (strncmp(value, "fractalNoise", 12) == 0) {
+ return Inkscape::Filters::TURBULENCE_FRACTALNOISE;
+ }
break;
case 't':
- if (strncmp(value, "turbulence", 10) == 0) return Inkscape::Filters::TURBULENCE_TURBULENCE;
+ if (strncmp(value, "turbulence", 10) == 0) {
+ return Inkscape::Filters::TURBULENCE_TURBULENCE;
+ }
break;
}
+
return Inkscape::Filters::TURBULENCE_TURBULENCE; // 'turbulence' is default
}
/**
* Sets a specific value in the SPFeTurbulence.
*/
-static void
-sp_feTurbulence_set(SPObject *object, unsigned int key, gchar const *value)
-{
- SPFeTurbulence *feTurbulence = SP_FETURBULENCE(object);
- (void)feTurbulence;
-
+void SPFeTurbulence::set(unsigned int key, gchar const *value) {
int read_int;
double read_num;
bool read_bool;
@@ -131,61 +126,66 @@ sp_feTurbulence_set(SPObject *object, unsigned int key, gchar const *value)
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
-
case SP_ATTR_BASEFREQUENCY:
- feTurbulence->baseFrequency.set(value);
- //From SVG spec: If two <number>s are provided, the first number represents a base frequency in the X direction and the second value represents a base frequency in the Y direction. If one number is provided, then that value is used for both X and Y.
- if (feTurbulence->baseFrequency.optNumIsSet() == false)
- feTurbulence->baseFrequency.setOptNumber(feTurbulence->baseFrequency.getNumber());
- feTurbulence->updated = false;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ this->baseFrequency.set(value);
+
+ // From SVG spec: If two <number>s are provided, the first number represents
+ // a base frequency in the X direction and the second value represents a base
+ // frequency in the Y direction. If one number is provided, then that value is
+ // used for both X and Y.
+ if (this->baseFrequency.optNumIsSet() == false) {
+ this->baseFrequency.setOptNumber(this->baseFrequency.getNumber());
+ }
+
+ this->updated = false;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_NUMOCTAVES:
read_int = value ? (int)floor(helperfns_read_number(value)) : 1;
- if (read_int != feTurbulence->numOctaves){
- feTurbulence->numOctaves = read_int;
- feTurbulence->updated = false;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_int != this->numOctaves){
+ this->numOctaves = read_int;
+ this->updated = false;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_SEED:
read_num = value ? helperfns_read_number(value) : 0;
- if (read_num != feTurbulence->seed){
- feTurbulence->seed = read_num;
- feTurbulence->updated = false;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_num != this->seed){
+ this->seed = read_num;
+ this->updated = false;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_STITCHTILES:
read_bool = sp_feTurbulence_read_stitchTiles(value);
- if (read_bool != feTurbulence->stitchTiles){
- feTurbulence->stitchTiles = read_bool;
- feTurbulence->updated = false;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_bool != this->stitchTiles){
+ this->stitchTiles = read_bool;
+ this->updated = false;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
case SP_ATTR_TYPE:
read_type = sp_feTurbulence_read_type(value);
- if (read_type != feTurbulence->type){
- feTurbulence->type = read_type;
- feTurbulence->updated = false;
- object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+
+ if (read_type != this->type){
+ this->type = read_type;
+ this->updated = false;
+ this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
break;
default:
- if (((SPObjectClass *) sp_feTurbulence_parent_class)->set)
- ((SPObjectClass *) sp_feTurbulence_parent_class)->set(object, key, value);
+ SPFilterPrimitive::set(key, value);
break;
}
-
}
/**
* Receives update notifications.
*/
-static void
-sp_feTurbulence_update(SPObject *object, SPCtx *ctx, guint flags)
-{
+void SPFeTurbulence::update(SPCtx *ctx, guint flags) {
if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
@@ -193,26 +193,20 @@ sp_feTurbulence_update(SPObject *object, SPCtx *ctx, guint flags)
}
- if (((SPObjectClass *) sp_feTurbulence_parent_class)->update) {
- ((SPObjectClass *) sp_feTurbulence_parent_class)->update(object, ctx, flags);
- }
+ SPFilterPrimitive::update(ctx, flags);
}
/**
* Writes its settings to an incoming repr object, if any.
*/
-static Inkscape::XML::Node *
-sp_feTurbulence_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
-{
+Inkscape::XML::Node* SPFeTurbulence::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = object->getRepr()->duplicate(doc);
+ repr = this->getRepr()->duplicate(doc);
}
- if (((SPObjectClass *) sp_feTurbulence_parent_class)->write) {
- ((SPObjectClass *) sp_feTurbulence_parent_class)->write(object, doc, repr, flags);
- }
+ SPFilterPrimitive::write(doc, repr, flags);
/* turbulence doesn't take input */
repr->setAttribute("in", 0);
@@ -220,26 +214,24 @@ sp_feTurbulence_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::
return repr;
}
-static void sp_feTurbulence_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) {
- g_assert(primitive != NULL);
+void SPFeTurbulence::build_renderer(Inkscape::Filters::Filter* filter) {
+ g_assert(this != NULL);
g_assert(filter != NULL);
- SPFeTurbulence *sp_turbulence = SP_FETURBULENCE(primitive);
-
int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_TURBULENCE);
Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
Inkscape::Filters::FilterTurbulence *nr_turbulence = dynamic_cast<Inkscape::Filters::FilterTurbulence*>(nr_primitive);
g_assert(nr_turbulence != NULL);
- sp_filter_primitive_renderer_common(primitive, nr_primitive);
+ sp_filter_primitive_renderer_common(this, nr_primitive);
- nr_turbulence->set_baseFrequency(0, sp_turbulence->baseFrequency.getNumber());
- nr_turbulence->set_baseFrequency(1, sp_turbulence->baseFrequency.getOptNumber());
- nr_turbulence->set_numOctaves(sp_turbulence->numOctaves);
- nr_turbulence->set_seed(sp_turbulence->seed);
- nr_turbulence->set_stitchTiles(sp_turbulence->stitchTiles);
- nr_turbulence->set_type(sp_turbulence->type);
- nr_turbulence->set_updated(sp_turbulence->updated);
+ nr_turbulence->set_baseFrequency(0, this->baseFrequency.getNumber());
+ nr_turbulence->set_baseFrequency(1, this->baseFrequency.getOptNumber());
+ nr_turbulence->set_numOctaves(this->numOctaves);
+ nr_turbulence->set_seed(this->seed);
+ nr_turbulence->set_stitchTiles(this->stitchTiles);
+ nr_turbulence->set_type(this->type);
+ nr_turbulence->set_updated(this->updated);
}
/*
diff --git a/src/filters/turbulence.h b/src/filters/turbulence.h
index bad8315c1..89e6d4a19 100644
--- a/src/filters/turbulence.h
+++ b/src/filters/turbulence.h
@@ -17,15 +17,16 @@
#include "number-opt-number.h"
#include "display/nr-filter-turbulence.h"
-#define SP_TYPE_FETURBULENCE (sp_feTurbulence_get_type())
-#define SP_FETURBULENCE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FETURBULENCE, SPFeTurbulence))
-#define SP_FETURBULENCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FETURBULENCE, SPFeTurbulenceClass))
-#define SP_IS_FETURBULENCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FETURBULENCE))
-#define SP_IS_FETURBULENCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FETURBULENCE))
+#define SP_FETURBULENCE(obj) (dynamic_cast<SPFeTurbulence*>((SPObject*)obj))
+#define SP_IS_FETURBULENCE(obj) (dynamic_cast<const SPFeTurbulence*>((SPObject*)obj) != NULL)
/* FeTurbulence base class */
-struct SPFeTurbulence : public SPFilterPrimitive {
+class SPFeTurbulence : public SPFilterPrimitive {
+public:
+ SPFeTurbulence();
+ virtual ~SPFeTurbulence();
+
/** TURBULENCE ATTRIBUTES HERE */
NumberOptNumber baseFrequency;
int numOctaves;
@@ -34,14 +35,19 @@ struct SPFeTurbulence : public SPFilterPrimitive {
Inkscape::Filters::FilterTurbulenceType type;
SVGLength x, y, height, width;
bool updated;
-};
-struct SPFeTurbulenceClass {
- SPFilterPrimitiveClass parent_class;
-};
+protected:
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
-GType sp_feTurbulence_get_type();
+ virtual void set(unsigned int key, const gchar* value);
+ virtual void update(SPCtx* ctx, unsigned int flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ virtual void build_renderer(Inkscape::Filters::Filter* filter);
+};
#endif /* !SP_FETURBULENCE_H_SEEN */