diff options
| author | Krzysztof Kosi??ski <tweenk.pl@gmail.com> | 2013-09-19 02:05:00 +0000 |
|---|---|---|
| committer | Krzysztof KosiĆski <tweenk.pl@gmail.com> | 2013-09-19 02:05:00 +0000 |
| commit | f6e99d7d1b76dd7a7933f55ba095bdcb534f81b3 (patch) | |
| tree | cbee5d1eec2e1afe8c3f8033d528cab4504c3c49 /src/filters | |
| parent | Encapsulate the shared memory hack for Cairo and GdkPixbuf in a class (diff) | |
| parent | Added gpl notice (diff) | |
| download | inkscape-f6e99d7d1b76dd7a7933f55ba095bdcb534f81b3.tar.gz inkscape-f6e99d7d1b76dd7a7933f55ba095bdcb534f81b3.zip | |
Merge C++ification of the SP tree by Markus Engel
(bzr r12532)
Diffstat (limited to 'src/filters')
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 */ |
