diff options
| author | Markus Engel <markus.engel@tum.de> | 2013-03-29 23:46:23 +0000 |
|---|---|---|
| committer | Markus Engel <markus.engel@tum.de> | 2013-03-29 23:46:23 +0000 |
| commit | cbee151d9455d50fc58b1c5b82383dcd85ec7278 (patch) | |
| tree | cbf3941db66091d35d6079135c40f9eb5941a37f /src | |
| parent | Added "virtual pads" for (diff) | |
| download | inkscape-cbee151d9455d50fc58b1c5b82383dcd85ec7278.tar.gz inkscape-cbee151d9455d50fc58b1c5b82383dcd85ec7278.zip | |
Added "virtual pads" to
- SPFilterPrimitive and all subclasses
All subclasses of SPObject now have got virtual pads.
(bzr r11608.1.52)
Diffstat (limited to 'src')
34 files changed, 3595 insertions, 437 deletions
diff --git a/src/filters/blend.cpp b/src/filters/blend.cpp index 968cba001..a48c8bc52 100644 --- a/src/filters/blend.cpp +++ b/src/filters/blend.cpp @@ -82,9 +82,20 @@ sp_feBlend_class_init(SPFeBlendClass *klass) sp_primitive_class->build_renderer = sp_feBlend_build_renderer; } +CFeBlend::CFeBlend(SPFeBlend* blend) : CFilterPrimitive(blend) { + this->spfeblend = blend; +} + +CFeBlend::~CFeBlend() { +} + static void sp_feBlend_init(SPFeBlend *feBlend) { + feBlend->cfeblend = new CFeBlend(feBlend); + feBlend->cfilterprimitive = feBlend->cfeblend; + feBlend->cobject = feBlend->cfeblend; + feBlend->in2 = Inkscape::Filters::NR_FILTER_SLOT_NOT_SET; } @@ -93,15 +104,39 @@ 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) -{ +//static void +//sp_feBlend_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ +// SPFeBlend *blend = SP_FEBLEND(object); +// +//// if (((SPObjectClass *) feBlend_parent_class)->build) { +//// ((SPObjectClass *) feBlend_parent_class)->build(object, document, repr); +//// } +// +// /*LOAD ATTRIBUTES FROM REPR HERE*/ +// object->readAttr( "mode" ); +// object->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) +// { +// 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)); +// } +//} + +void CFeBlend::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + SPFeBlend* object = this->spfeblend; + SPFeBlend *blend = SP_FEBLEND(object); // if (((SPObjectClass *) feBlend_parent_class)->build) { // ((SPObjectClass *) feBlend_parent_class)->build(object, document, repr); // } - // CPPIFY: todo + CFilterPrimitive::onBuild(document, repr); /*LOAD ATTRIBUTES FROM REPR HERE*/ object->readAttr( "mode" ); @@ -124,8 +159,13 @@ sp_feBlend_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *re static void sp_feBlend_release(SPObject *object) { - if (((SPObjectClass *) feBlend_parent_class)->release) - ((SPObjectClass *) feBlend_parent_class)->release(object); +// if (((SPObjectClass *) feBlend_parent_class)->release) +// ((SPObjectClass *) feBlend_parent_class)->release(object); + ((SPFeBlend*)object)->cfeblend->onRelease(); +} + +void CFeBlend::onRelease() { + CFilterPrimitive::onRelease(); } static Inkscape::Filters::FilterBlendMode sp_feBlend_readmode(gchar const *value) @@ -165,6 +205,39 @@ static Inkscape::Filters::FilterBlendMode sp_feBlend_readmode(gchar const *value static void sp_feBlend_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeBlend *feBlend = SP_FEBLEND(object); +// (void)feBlend; +// +// 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); +// } +// 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); +// } +// break; +// default: +// if (((SPObjectClass *) feBlend_parent_class)->set) +// ((SPObjectClass *) feBlend_parent_class)->set(object, key, value); +// break; +// } + + ((SPFeBlend*)object)->cfeblend->onSet(key, value); +} + +void CFeBlend::onSet(unsigned int key, gchar const *value) { + SPFeBlend* object = this->spfeblend; + SPFeBlend *feBlend = SP_FEBLEND(object); (void)feBlend; @@ -187,11 +260,11 @@ sp_feBlend_set(SPObject *object, unsigned int key, gchar const *value) } break; default: - if (((SPObjectClass *) feBlend_parent_class)->set) - ((SPObjectClass *) feBlend_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feBlend_parent_class)->set) +// ((SPObjectClass *) feBlend_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } - } /** @@ -200,6 +273,34 @@ sp_feBlend_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feBlend_update(SPObject *object, SPCtx *ctx, guint flags) { +// SPFeBlend *blend = SP_FEBLEND(object); +// +// if (flags & SP_OBJECT_MODIFIED_FLAG) { +// object->readAttr( "mode" ); +// object->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) +// { +// SPFilter *parent = SP_FILTER(object->parent); +// blend->in2 = sp_filter_primitive_name_previous_out(blend); +// +// //XML Tree being used directly here while it shouldn't be. +// object->getRepr()->setAttribute("in2", sp_filter_name_for_image(parent, blend->in2)); +// } +// +// if (((SPObjectClass *) feBlend_parent_class)->update) { +// ((SPObjectClass *) feBlend_parent_class)->update(object, ctx, flags); +// } + ((SPFeBlend*)object)->cfeblend->onUpdate(ctx, flags); +} + +void CFeBlend::onUpdate(SPCtx *ctx, guint flags) { + SPFeBlend* object = this->spfeblend; + SPFeBlend *blend = SP_FEBLEND(object); if (flags & SP_OBJECT_MODIFIED_FLAG) { @@ -219,9 +320,10 @@ sp_feBlend_update(SPObject *object, SPCtx *ctx, guint flags) object->getRepr()->setAttribute("in2", sp_filter_name_for_image(parent, blend->in2)); } - if (((SPObjectClass *) feBlend_parent_class)->update) { - ((SPObjectClass *) feBlend_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feBlend_parent_class)->update) { +// ((SPObjectClass *) feBlend_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -230,6 +332,55 @@ 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) { +// SPFeBlend *blend = SP_FEBLEND(object); +// SPFilter *parent = SP_FILTER(object->parent); +// +// if (!repr) { +// repr = doc->createElement("svg:feBlend"); +// } +// +// gchar const *out_name = sp_filter_name_for_image(parent, blend->in2); +// if (out_name) { +// repr->setAttribute("in2", out_name); +// } else { +// SPObject *i = parent->children; +// while (i && i->next != object) 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) { +// case Inkscape::Filters::BLEND_NORMAL: +// mode = "normal"; break; +// case Inkscape::Filters::BLEND_MULTIPLY: +// mode = "multiply"; break; +// case Inkscape::Filters::BLEND_SCREEN: +// mode = "screen"; break; +// case Inkscape::Filters::BLEND_DARKEN: +// mode = "darken"; break; +// case Inkscape::Filters::BLEND_LIGHTEN: +// mode = "lighten"; break; +// default: +// mode = 0; +// } +// repr->setAttribute("mode", mode); +// +// if (((SPObjectClass *) feBlend_parent_class)->write) { +// ((SPObjectClass *) feBlend_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeBlend*)object)->cfeblend->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeBlend::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeBlend* object = this->spfeblend; + SPFeBlend *blend = SP_FEBLEND(object); SPFilter *parent = SP_FILTER(object->parent); @@ -268,14 +419,35 @@ sp_feBlend_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML:: } repr->setAttribute("mode", mode); - if (((SPObjectClass *) feBlend_parent_class)->write) { - ((SPObjectClass *) feBlend_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feBlend_parent_class)->write) { +// ((SPObjectClass *) feBlend_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } static void sp_feBlend_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); +// +// nr_blend->set_mode(sp_blend->blend_mode); +// nr_blend->set_input(1, sp_blend->in2); + ((SPFeBlend*)primitive)->cfeblend->onBuildRenderer(filter); +} + +void CFeBlend::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeBlend* primitive = this->spfeblend; + g_assert(primitive != NULL); g_assert(filter != NULL); diff --git a/src/filters/blend.h b/src/filters/blend.h index e7fc410e7..a423e27f9 100644 --- a/src/filters/blend.h +++ b/src/filters/blend.h @@ -24,7 +24,12 @@ class SPFeBlendClass; -struct SPFeBlend : public SPFilterPrimitive { +class CFeBlend; + +class SPFeBlend : public SPFilterPrimitive { +public: + CFeBlend* cfeblend; + Inkscape::Filters::FilterBlendMode blend_mode; int in2; }; @@ -33,6 +38,27 @@ struct SPFeBlendClass { SPFilterPrimitiveClass parent_class; }; +class CFeBlend : public CFilterPrimitive { +public: + CFeBlend(SPFeBlend* blend); + virtual ~CFeBlend(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeBlend* spfeblend; +}; + + GType sp_feBlend_get_type(); diff --git a/src/filters/colormatrix.cpp b/src/filters/colormatrix.cpp index 1563beb57..593811651 100644 --- a/src/filters/colormatrix.cpp +++ b/src/filters/colormatrix.cpp @@ -80,9 +80,19 @@ sp_feColorMatrix_class_init(SPFeColorMatrixClass *klass) sp_primitive_class->build_renderer = sp_feColorMatrix_build_renderer; } +CFeColorMatrix::CFeColorMatrix(SPFeColorMatrix* matrix) : CFilterPrimitive(matrix) { + this->spfecolormatrix = matrix; +} + +CFeColorMatrix::~CFeColorMatrix() { +} + static void -sp_feColorMatrix_init(SPFeColorMatrix */*feColorMatrix*/) +sp_feColorMatrix_init(SPFeColorMatrix *feColorMatrix) { + feColorMatrix->cfecolormatrix = new CFeColorMatrix(feColorMatrix); + feColorMatrix->cfilterprimitive = feColorMatrix->cfecolormatrix; + feColorMatrix->cobject = feColorMatrix->cfecolormatrix; } /** @@ -90,17 +100,29 @@ sp_feColorMatrix_init(SPFeColorMatrix */*feColorMatrix*/) * 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 *) feColorMatrix_parent_class)->build) { -// ((SPObjectClass *) feColorMatrix_parent_class)->build(object, document, repr); -// } - // CPPIFY: todo - - /*LOAD ATTRIBUTES FROM REPR HERE*/ - object->readAttr( "type" ); - object->readAttr( "values" ); +//static void +//sp_feColorMatrix_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ +//// if (((SPObjectClass *) feColorMatrix_parent_class)->build) { +//// ((SPObjectClass *) feColorMatrix_parent_class)->build(object, document, repr); +//// } +// +// /*LOAD ATTRIBUTES FROM REPR HERE*/ +// object->readAttr( "type" ); +// object->readAttr( "values" ); +//} + +void CFeColorMatrix::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + // if (((SPObjectClass *) feColorMatrix_parent_class)->build) { + // ((SPObjectClass *) feColorMatrix_parent_class)->build(object, document, repr); + // } + CFilterPrimitive::onBuild(document, repr); + + SPFeColorMatrix* object = this->spfecolormatrix; + + /*LOAD ATTRIBUTES FROM REPR HERE*/ + object->readAttr( "type" ); + object->readAttr( "values" ); } /** @@ -109,8 +131,13 @@ sp_feColorMatrix_build(SPObject *object, SPDocument *document, Inkscape::XML::No static void sp_feColorMatrix_release(SPObject *object) { - if (((SPObjectClass *) feColorMatrix_parent_class)->release) - ((SPObjectClass *) feColorMatrix_parent_class)->release(object); +// if (((SPObjectClass *) feColorMatrix_parent_class)->release) +// ((SPObjectClass *) feColorMatrix_parent_class)->release(object); + ((SPFeColorMatrix*)object)->cfecolormatrix->onRelease(); +} + +void CFeColorMatrix::onRelease() { + CFilterPrimitive::onRelease(); } static Inkscape::Filters::FilterColorMatrixType sp_feColorMatrix_read_type(gchar const *value){ @@ -138,6 +165,37 @@ static Inkscape::Filters::FilterColorMatrixType sp_feColorMatrix_read_type(gchar static void sp_feColorMatrix_set(SPObject *object, unsigned int key, gchar const *str) { +// SPFeColorMatrix *feColorMatrix = SP_FECOLORMATRIX(object); +// (void)feColorMatrix; +// +// 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); +// } +// 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); +// } +// break; +// default: +// if (((SPObjectClass *) feColorMatrix_parent_class)->set) +// ((SPObjectClass *) feColorMatrix_parent_class)->set(object, key, str); +// break; +// } + ((SPFeColorMatrix*)object)->cfecolormatrix->onSet(key, str); +} + +void CFeColorMatrix::onSet(unsigned int key, gchar const *str) { + SPFeColorMatrix* object = this->spfecolormatrix; + SPFeColorMatrix *feColorMatrix = SP_FECOLORMATRIX(object); (void)feColorMatrix; @@ -159,8 +217,9 @@ sp_feColorMatrix_set(SPObject *object, unsigned int key, gchar const *str) } break; default: - if (((SPObjectClass *) feColorMatrix_parent_class)->set) - ((SPObjectClass *) feColorMatrix_parent_class)->set(object, key, str); +// if (((SPObjectClass *) feColorMatrix_parent_class)->set) +// ((SPObjectClass *) feColorMatrix_parent_class)->set(object, key, str); + CFilterPrimitive::onSet(key, str); break; } } @@ -171,16 +230,33 @@ sp_feColorMatrix_set(SPObject *object, unsigned int key, gchar const *str) static void sp_feColorMatrix_update(SPObject *object, SPCtx *ctx, guint flags) { - if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | +// if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | +// SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) { +// +// /* do something to trigger redisplay, updates? */ +// +// } +// +// if (((SPObjectClass *) feColorMatrix_parent_class)->update) { +// ((SPObjectClass *) feColorMatrix_parent_class)->update(object, ctx, flags); +// } + ((SPFeColorMatrix*)object)->cfecolormatrix->onUpdate(ctx, flags); +} + +void CFeColorMatrix::onUpdate(SPCtx *ctx, guint flags) { + SPFeColorMatrix* object = this->spfecolormatrix; + + if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) { /* do something to trigger redisplay, updates? */ } - if (((SPObjectClass *) feColorMatrix_parent_class)->update) { - ((SPObjectClass *) feColorMatrix_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feColorMatrix_parent_class)->update) { +// ((SPObjectClass *) feColorMatrix_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -189,20 +265,58 @@ 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) { +// /* 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); +// } +// +// if (((SPObjectClass *) feColorMatrix_parent_class)->write) { +// ((SPObjectClass *) feColorMatrix_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeColorMatrix*)object)->cfecolormatrix->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeColorMatrix::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeColorMatrix* object = this->spfecolormatrix; + /* 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); } - if (((SPObjectClass *) feColorMatrix_parent_class)->write) { - ((SPObjectClass *) feColorMatrix_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feColorMatrix_parent_class)->write) { +// ((SPObjectClass *) feColorMatrix_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } static void sp_feColorMatrix_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); + ((SPFeColorMatrix*)primitive)->cfecolormatrix->onBuildRenderer(filter); +} + +void CFeColorMatrix::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeColorMatrix* primitive = this->spfecolormatrix; + g_assert(primitive != NULL); g_assert(filter != NULL); diff --git a/src/filters/colormatrix.h b/src/filters/colormatrix.h index 8eb750ac1..8a0a50fc1 100644 --- a/src/filters/colormatrix.h +++ b/src/filters/colormatrix.h @@ -23,7 +23,12 @@ class SPFeColorMatrixClass; -struct SPFeColorMatrix : public SPFilterPrimitive { +class CFeColorMatrix; + +class SPFeColorMatrix : public SPFilterPrimitive { +public: + CFeColorMatrix* cfecolormatrix; + Inkscape::Filters::FilterColorMatrixType type; gdouble value; std::vector<gdouble> values; @@ -33,6 +38,26 @@ struct SPFeColorMatrixClass { SPFilterPrimitiveClass parent_class; }; +class CFeColorMatrix : public CFilterPrimitive { +public: + CFeColorMatrix(SPFeColorMatrix* matrix); + virtual ~CFeColorMatrix(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeColorMatrix* spfecolormatrix; +}; + GType sp_feColorMatrix_get_type(); #endif /* !SP_FECOLORMATRIX_H_SEEN */ diff --git a/src/filters/componenttransfer.cpp b/src/filters/componenttransfer.cpp index 650aa99ff..9060d7838 100644 --- a/src/filters/componenttransfer.cpp +++ b/src/filters/componenttransfer.cpp @@ -81,27 +81,50 @@ sp_feComponentTransfer_class_init(SPFeComponentTransferClass *klass) sp_primitive_class->build_renderer = sp_feComponentTransfer_build_renderer; } +CFeComponentTransfer::CFeComponentTransfer(SPFeComponentTransfer* tr) : CFilterPrimitive(tr) { + this->spfecomponenttransfer = tr; +} + +CFeComponentTransfer::~CFeComponentTransfer() { +} + static void -sp_feComponentTransfer_init(SPFeComponentTransfer */*feComponentTransfer*/) -{} +sp_feComponentTransfer_init(SPFeComponentTransfer *feComponentTransfer) +{ + feComponentTransfer->cfecomponenttransfer = new CFeComponentTransfer(feComponentTransfer); + feComponentTransfer->cfilterprimitive = feComponentTransfer->cfecomponenttransfer; + feComponentTransfer->cobject = feComponentTransfer->cfecomponenttransfer; +} /** * 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 *) feComponentTransfer_parent_class)->build) { -// ((SPObjectClass *) feComponentTransfer_parent_class)->build(object, document, repr); -// } - // CPPIFY: todo - - /*LOAD ATTRIBUTES FROM REPR HERE*/ - - //do we need this? - document->addResource("feComponentTransfer", object); +//static void +//sp_feComponentTransfer_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ +//// if (((SPObjectClass *) feComponentTransfer_parent_class)->build) { +//// ((SPObjectClass *) feComponentTransfer_parent_class)->build(object, document, repr); +//// } +// +// /*LOAD ATTRIBUTES FROM REPR HERE*/ +// +// //do we need this? +// document->addResource("feComponentTransfer", object); +//} + +void CFeComponentTransfer::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + // if (((SPObjectClass *) feComponentTransfer_parent_class)->build) { + // ((SPObjectClass *) feComponentTransfer_parent_class)->build(object, document, repr); + // } + CFilterPrimitive::onBuild(document, repr); + + /*LOAD ATTRIBUTES FROM REPR HERE*/ + SPFeComponentTransfer* object = this->spfecomponenttransfer; + + //do we need this? + document->addResource("feComponentTransfer", object); } static void sp_feComponentTransfer_children_modified(SPFeComponentTransfer *sp_componenttransfer) @@ -143,26 +166,53 @@ static void sp_feComponentTransfer_children_modified(SPFeComponentTransfer *sp_c static void sp_feComponentTransfer_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { +// SPFeComponentTransfer *f = SP_FECOMPONENTTRANSFER(object); +// +// if (((SPObjectClass *) feComponentTransfer_parent_class)->child_added) +// (* ((SPObjectClass *) feComponentTransfer_parent_class)->child_added)(object, child, ref); +// +// sp_feComponentTransfer_children_modified(f); +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + ((SPFeComponentTransfer*)object)->cfecomponenttransfer->onChildAdded(child, ref); +} + +void CFeComponentTransfer::onChildAdded(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { + SPFeComponentTransfer* object = this->spfecomponenttransfer; + SPFeComponentTransfer *f = SP_FECOMPONENTTRANSFER(object); - if (((SPObjectClass *) feComponentTransfer_parent_class)->child_added) - (* ((SPObjectClass *) feComponentTransfer_parent_class)->child_added)(object, child, ref); +// if (((SPObjectClass *) feComponentTransfer_parent_class)->child_added) +// (* ((SPObjectClass *) feComponentTransfer_parent_class)->child_added)(object, child, ref); + CFilterPrimitive::onChildAdded(child, ref); sp_feComponentTransfer_children_modified(f); object->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 *) feComponentTransfer_parent_class)->remove_child) +// (* ((SPObjectClass *) feComponentTransfer_parent_class)->remove_child)(object, child); +// +// sp_feComponentTransfer_children_modified(f); +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + ((SPFeComponentTransfer*)object)->cfecomponenttransfer->onRemoveChild(child); +} + +void CFeComponentTransfer::onRemoveChild(Inkscape::XML::Node *child) { + SPFeComponentTransfer* object = this->spfecomponenttransfer; + SPFeComponentTransfer *f = SP_FECOMPONENTTRANSFER(object); - if (((SPObjectClass *) feComponentTransfer_parent_class)->remove_child) - (* ((SPObjectClass *) feComponentTransfer_parent_class)->remove_child)(object, child); +// if (((SPObjectClass *) feComponentTransfer_parent_class)->remove_child) +// (* ((SPObjectClass *) feComponentTransfer_parent_class)->remove_child)(object, child); + CFilterPrimitive::onRemoveChild(child); sp_feComponentTransfer_children_modified(f); object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -174,8 +224,13 @@ sp_feComponentTransfer_remove_child(SPObject *object, Inkscape::XML::Node *child static void sp_feComponentTransfer_release(SPObject *object) { - if (((SPObjectClass *) feComponentTransfer_parent_class)->release) - ((SPObjectClass *) feComponentTransfer_parent_class)->release(object); +// if (((SPObjectClass *) feComponentTransfer_parent_class)->release) +// ((SPObjectClass *) feComponentTransfer_parent_class)->release(object); + ((SPFeComponentTransfer*)object)->cfecomponenttransfer->onRelease(); +} + +void CFeComponentTransfer::onRelease() { + CFilterPrimitive::onRelease(); } /** @@ -184,14 +239,31 @@ sp_feComponentTransfer_release(SPObject *object) static void sp_feComponentTransfer_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeComponentTransfer *feComponentTransfer = SP_FECOMPONENTTRANSFER(object); +// (void)feComponentTransfer; +// +// switch(key) { +// /*DEAL WITH SETTING ATTRIBUTES HERE*/ +// default: +// if (((SPObjectClass *) feComponentTransfer_parent_class)->set) +// ((SPObjectClass *) feComponentTransfer_parent_class)->set(object, key, value); +// break; +// } + ((SPFeComponentTransfer*)object)->cfecomponenttransfer->onSet(key, value); +} + +void CFeComponentTransfer::onSet(unsigned int key, gchar const *value) { + SPFeComponentTransfer* object = this->spfecomponenttransfer; + SPFeComponentTransfer *feComponentTransfer = SP_FECOMPONENTTRANSFER(object); (void)feComponentTransfer; switch(key) { /*DEAL WITH SETTING ATTRIBUTES HERE*/ default: - if (((SPObjectClass *) feComponentTransfer_parent_class)->set) - ((SPObjectClass *) feComponentTransfer_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feComponentTransfer_parent_class)->set) +// ((SPObjectClass *) feComponentTransfer_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } } @@ -202,6 +274,22 @@ sp_feComponentTransfer_set(SPObject *object, unsigned int key, gchar const *valu static void sp_feComponentTransfer_update(SPObject *object, 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 *) feComponentTransfer_parent_class)->update) { +// ((SPObjectClass *) feComponentTransfer_parent_class)->update(object, ctx, flags); +// } + ((SPFeComponentTransfer*)object)->cfecomponenttransfer->onUpdate(ctx, flags); +} + +void CFeComponentTransfer::onUpdate(SPCtx *ctx, guint flags) { + SPFeComponentTransfer* object = this->spfecomponenttransfer; + if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) { @@ -209,9 +297,10 @@ sp_feComponentTransfer_update(SPObject *object, SPCtx *ctx, guint flags) } - if (((SPObjectClass *) feComponentTransfer_parent_class)->update) { - ((SPObjectClass *) feComponentTransfer_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feComponentTransfer_parent_class)->update) { +// ((SPObjectClass *) feComponentTransfer_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -220,20 +309,59 @@ sp_feComponentTransfer_update(SPObject *object, SPCtx *ctx, guint flags) static Inkscape::XML::Node * sp_feComponentTransfer_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 +// * relevant values into it */ +// if (!repr) { +// repr = object->getRepr()->duplicate(doc); +// } +// +// if (((SPObjectClass *) feComponentTransfer_parent_class)->write) { +// ((SPObjectClass *) feComponentTransfer_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeComponentTransfer*)object)->cfecomponenttransfer->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeComponentTransfer::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeComponentTransfer* object = this->spfecomponenttransfer; + /* 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); } - if (((SPObjectClass *) feComponentTransfer_parent_class)->write) { - ((SPObjectClass *) feComponentTransfer_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feComponentTransfer_parent_class)->write) { +// ((SPObjectClass *) feComponentTransfer_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } static void sp_feComponentTransfer_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); +// +// +// sp_feComponentTransfer_children_modified(sp_componenttransfer); //do we need it?! + ((SPFeComponentTransfer*)primitive)->cfecomponenttransfer->onBuildRenderer(filter); +} + +void CFeComponentTransfer::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeComponentTransfer* primitive = this->spfecomponenttransfer; + g_assert(primitive != NULL); g_assert(filter != NULL); diff --git a/src/filters/componenttransfer.h b/src/filters/componenttransfer.h index 2df64009f..2e2b8bb40 100644 --- a/src/filters/componenttransfer.h +++ b/src/filters/componenttransfer.h @@ -26,7 +26,12 @@ class FilterComponentTransfer; class SPFeComponentTransferClass; -struct SPFeComponentTransfer : public SPFilterPrimitive { +class CFeComponentTransfer; + +class SPFeComponentTransfer : public SPFilterPrimitive { +public: + CFeComponentTransfer* cfecomponenttransfer; + Inkscape::Filters::FilterComponentTransfer *renderer; }; @@ -34,6 +39,30 @@ struct SPFeComponentTransferClass { SPFilterPrimitiveClass parent_class; }; +class CFeComponentTransfer : public CFilterPrimitive { +public: + CFeComponentTransfer(SPFeComponentTransfer* tr); + virtual ~CFeComponentTransfer(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onChildAdded(Inkscape::XML::Node* child, Inkscape::XML::Node* ref); + virtual void onRemoveChild(Inkscape::XML::Node* child); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeComponentTransfer* spfecomponenttransfer; +}; + + GType sp_feComponentTransfer_get_type(); diff --git a/src/filters/composite.cpp b/src/filters/composite.cpp index 1548fe57e..6bcb57a5b 100644 --- a/src/filters/composite.cpp +++ b/src/filters/composite.cpp @@ -77,9 +77,20 @@ sp_feComposite_class_init(SPFeCompositeClass *klass) sp_primitive_class->build_renderer = sp_feComposite_build_renderer; } +CFeComposite::CFeComposite(SPFeComposite* comp) : CFilterPrimitive(comp) { + this->spfecomposite = comp; +} + +CFeComposite::~CFeComposite() { +} + static void sp_feComposite_init(SPFeComposite *feComposite) { + feComposite->cfecomposite = new CFeComposite(feComposite); + feComposite->cfilterprimitive = feComposite->cfecomposite; + feComposite->cobject = feComposite->cfecomposite; + feComposite->composite_operator = COMPOSITE_DEFAULT; feComposite->k1 = 0; feComposite->k2 = 0; @@ -93,34 +104,63 @@ 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 *) feComposite_parent_class)->build) { -// ((SPObjectClass *) feComposite_parent_class)->build(object, document, repr); +//static void +//sp_feComposite_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ +//// if (((SPObjectClass *) feComposite_parent_class)->build) { +//// ((SPObjectClass *) 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" ); // } - // CPPIFY: todo - - 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)); - } +// 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 CFeComposite::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + SPFeComposite* object = this->spfecomposite; + + // if (((SPObjectClass *) feComposite_parent_class)->build) { + // ((SPObjectClass *) feComposite_parent_class)->build(object, document, repr); + // } + CFilterPrimitive::onBuild(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)); + } } /** @@ -129,8 +169,13 @@ sp_feComposite_build(SPObject *object, SPDocument *document, Inkscape::XML::Node static void sp_feComposite_release(SPObject *object) { - if (((SPObjectClass *) feComposite_parent_class)->release) - ((SPObjectClass *) feComposite_parent_class)->release(object); +// if (((SPObjectClass *) feComposite_parent_class)->release) +// ((SPObjectClass *) feComposite_parent_class)->release(object); + ((SPFeComposite*)object)->cfecomposite->onRelease(); +} + +void CFeComposite::onRelease() { + CFilterPrimitive::onRelease(); } static FeCompositeOperator @@ -152,6 +197,78 @@ sp_feComposite_read_operator(gchar const *value) { static void sp_feComposite_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeComposite *feComposite = SP_FECOMPOSITE(object); +// (void)feComposite; +// +// 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); +// } +// 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); +// } +// 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); +// } +// 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); +// } +// 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); +// } +// 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); +// } +// break; +// +// default: +// if (((SPObjectClass *) feComposite_parent_class)->set) +// ((SPObjectClass *) feComposite_parent_class)->set(object, key, value); +// break; +// } + + ((SPFeComposite*)object)->cfecomposite->onSet(key, value); +} + +void CFeComposite::onSet(unsigned int key, gchar const *value) { + SPFeComposite* object = this->spfecomposite; + SPFeComposite *feComposite = SP_FECOMPOSITE(object); (void)feComposite; @@ -213,11 +330,11 @@ sp_feComposite_set(SPObject *object, unsigned int key, gchar const *value) break; default: - if (((SPObjectClass *) feComposite_parent_class)->set) - ((SPObjectClass *) feComposite_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feComposite_parent_class)->set) +// ((SPObjectClass *) feComposite_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } - } /** @@ -226,6 +343,36 @@ sp_feComposite_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feComposite_update(SPObject *object, SPCtx *ctx, guint flags) { +// SPFeComposite *comp = SP_FECOMPOSITE(object); +// +// if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | +// SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) { +// +// /* do something to trigger redisplay, updates? */ +// +// } +// +// /* 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); +// +// //XML Tree being used directly here while it shouldn't be. +// object->getRepr()->setAttribute("in2", sp_filter_name_for_image(parent, comp->in2)); +// } +// +// if (((SPObjectClass *) feComposite_parent_class)->update) { +// ((SPObjectClass *) feComposite_parent_class)->update(object, ctx, flags); +// } + ((SPFeComposite*)object)->cfecomposite->onUpdate(ctx, flags); +} + +void CFeComposite::onUpdate(SPCtx *ctx, guint flags) { + SPFeComposite* object = this->spfecomposite; + SPFeComposite *comp = SP_FECOMPOSITE(object); if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | @@ -247,9 +394,10 @@ sp_feComposite_update(SPObject *object, SPCtx *ctx, guint flags) object->getRepr()->setAttribute("in2", sp_filter_name_for_image(parent, comp->in2)); } - if (((SPObjectClass *) feComposite_parent_class)->update) { - ((SPObjectClass *) feComposite_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feComposite_parent_class)->update) { +// ((SPObjectClass *) feComposite_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -258,6 +406,69 @@ 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) { +// SPFeComposite *comp = SP_FECOMPOSITE(object); +// SPFilter *parent = SP_FILTER(object->parent); +// +// if (!repr) { +// repr = doc->createElement("svg:feComposite"); +// } +// +// gchar const *out_name = sp_filter_name_for_image(parent, comp->in2); +// if (out_name) { +// repr->setAttribute("in2", out_name); +// } else { +// SPObject *i = parent->children; +// while (i && i->next != object) 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) { +// case COMPOSITE_OVER: +// comp_op = "over"; break; +// case COMPOSITE_IN: +// comp_op = "in"; break; +// case COMPOSITE_OUT: +// comp_op = "out"; break; +// case COMPOSITE_ATOP: +// comp_op = "atop"; break; +// case COMPOSITE_XOR: +// comp_op = "xor"; break; +// case COMPOSITE_ARITHMETIC: +// comp_op = "arithmetic"; break; +// 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); +// } else { +// repr->setAttribute("k1", 0); +// repr->setAttribute("k2", 0); +// repr->setAttribute("k3", 0); +// repr->setAttribute("k4", 0); +// } +// +// if (((SPObjectClass *) feComposite_parent_class)->write) { +// ((SPObjectClass *) feComposite_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeComposite*)object)->cfecomposite->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeComposite::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeComposite* object = this->spfecomposite; + SPFeComposite *comp = SP_FECOMPOSITE(object); SPFilter *parent = SP_FILTER(object->parent); @@ -310,14 +521,39 @@ sp_feComposite_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::X repr->setAttribute("k4", 0); } - if (((SPObjectClass *) feComposite_parent_class)->write) { - ((SPObjectClass *) feComposite_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feComposite_parent_class)->write) { +// ((SPObjectClass *) feComposite_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } static void sp_feComposite_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); +// +// 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); +// } + ((SPFeComposite*)primitive)->cfecomposite->onBuildRenderer(filter); +} + +void CFeComposite::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeComposite* primitive = this->spfecomposite; + g_assert(primitive != NULL); g_assert(filter != NULL); @@ -338,7 +574,6 @@ static void sp_feComposite_build_renderer(SPFilterPrimitive *primitive, Inkscape } } - /* Local Variables: mode:c++ diff --git a/src/filters/composite.h b/src/filters/composite.h index 3eb62716f..5bf46aee1 100644 --- a/src/filters/composite.h +++ b/src/filters/composite.h @@ -34,7 +34,12 @@ enum FeCompositeOperator { class SPFeCompositeClass; -struct SPFeComposite : public SPFilterPrimitive { +class CFeComposite; + +class SPFeComposite : public SPFilterPrimitive { +public: + CFeComposite* cfecomposite; + FeCompositeOperator composite_operator; double k1, k2, k3, k4; int in2; @@ -44,6 +49,26 @@ struct SPFeCompositeClass { SPFilterPrimitiveClass parent_class; }; +class CFeComposite : public CFilterPrimitive { +public: + CFeComposite(SPFeComposite* comp); + virtual ~CFeComposite(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeComposite* spfecomposite; +}; + GType sp_feComposite_get_type(); #endif /* !SP_FECOMPOSITE_H_SEEN */ diff --git a/src/filters/convolvematrix.cpp b/src/filters/convolvematrix.cpp index f1c1dfced..1f6980a6a 100644 --- a/src/filters/convolvematrix.cpp +++ b/src/filters/convolvematrix.cpp @@ -80,9 +80,20 @@ sp_feConvolveMatrix_class_init(SPFeConvolveMatrixClass *klass) sp_primitive_class->build_renderer = sp_feConvolveMatrix_build_renderer; } +CFeConvolveMatrix::CFeConvolveMatrix(SPFeConvolveMatrix* matrix) : CFilterPrimitive(matrix) { + this->spfeconvolvematrix = matrix; +} + +CFeConvolveMatrix::~CFeConvolveMatrix() { +} + static void sp_feConvolveMatrix_init(SPFeConvolveMatrix *feConvolveMatrix) { + feConvolveMatrix->cfeconvolvematrix = new CFeConvolveMatrix(feConvolveMatrix); + feConvolveMatrix->cfilterprimitive = feConvolveMatrix->cfeconvolvematrix; + feConvolveMatrix->cobject = feConvolveMatrix->cfeconvolvematrix; + //Setting default values: feConvolveMatrix->order.set("3 3"); feConvolveMatrix->targetX = 1; @@ -101,24 +112,44 @@ 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 *) feConvolveMatrix_parent_class)->build) { -// ((SPObjectClass *) feConvolveMatrix_parent_class)->build(object, document, repr); -// } - // CPPIFY: todo - - /*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" ); +//static void +//sp_feConvolveMatrix_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ +//// if (((SPObjectClass *) feConvolveMatrix_parent_class)->build) { +//// ((SPObjectClass *) feConvolveMatrix_parent_class)->build(object, document, repr); +//// } +// // CPPIFY: todo +// +// /*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" ); +//} + +void CFeConvolveMatrix::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + // if (((SPObjectClass *) feConvolveMatrix_parent_class)->build) { + // ((SPObjectClass *) feConvolveMatrix_parent_class)->build(object, document, repr); + // } + CFilterPrimitive::onBuild(document, repr); + + SPFeConvolveMatrix* object = this->spfeconvolvematrix; + + /*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" ); } /** @@ -127,8 +158,13 @@ sp_feConvolveMatrix_build(SPObject *object, SPDocument *document, Inkscape::XML: static void sp_feConvolveMatrix_release(SPObject *object) { - if (((SPObjectClass *) feConvolveMatrix_parent_class)->release) - ((SPObjectClass *) feConvolveMatrix_parent_class)->release(object); +// if (((SPObjectClass *) feConvolveMatrix_parent_class)->release) +// ((SPObjectClass *) feConvolveMatrix_parent_class)->release(object); + ((SPFeConvolveMatrix*)object)->cfeconvolvematrix->onRelease(); +} + +void CFeConvolveMatrix::onRelease() { + CFilterPrimitive::onRelease(); } static Inkscape::Filters::FilterConvolveMatrixEdgeMode sp_feConvolveMatrix_read_edgeMode(gchar const *value){ @@ -153,6 +189,130 @@ static Inkscape::Filters::FilterConvolveMatrixEdgeMode sp_feConvolveMatrix_read_ static void sp_feConvolveMatrix_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeConvolveMatrix *feConvolveMatrix = SP_FECONVOLVEMATRIX(object); +// (void)feConvolveMatrix; +// double read_num; +// int read_int; +// bool read_bool; +// Inkscape::Filters::FilterConvolveMatrixEdgeMode read_mode; +// +// switch(key) { +// /*DEAL WITH SETTING ATTRIBUTES HERE*/ +// case SP_ATTR_ORDER: +// feConvolveMatrix->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); +// 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; +// } +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); +// } else { +// g_warning("For feConvolveMatrix you MUST pass a kernelMatrix parameter!"); +// } +// break; +// 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 (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); +// } +// } else if (!feConvolveMatrix->divisorIsSet || feConvolveMatrix->divisor!=read_num) { +// feConvolveMatrix->divisorIsSet = true; +// feConvolveMatrix->divisor = read_num; +// object->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); +// } +// break; +// case SP_ATTR_TARGETX: +// if (value) { +// read_int = (int) helperfns_read_number(value); +// if (read_int < 0 || read_int > feConvolveMatrix->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); +// } +// feConvolveMatrix->targetXIsSet = true; +// if (read_int != feConvolveMatrix->targetX){ +// feConvolveMatrix->targetX = read_int; +// object->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()){ +// 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); +// } +// feConvolveMatrix->targetYIsSet = true; +// if (read_int != feConvolveMatrix->targetY){ +// feConvolveMatrix->targetY = read_int; +// object->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); +// } +// break; +// case SP_ATTR_KERNELUNITLENGTH: +// feConvolveMatrix->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); +// 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); +// } +// break; +// default: +// if (((SPObjectClass *) feConvolveMatrix_parent_class)->set) +// ((SPObjectClass *) feConvolveMatrix_parent_class)->set(object, key, value); +// break; +// } + + ((SPFeConvolveMatrix*)object)->cfeconvolvematrix->onSet(key, value); +} + +void CFeConvolveMatrix::onSet(unsigned int key, gchar const *value) { + SPFeConvolveMatrix* object = this->spfeconvolvematrix; + SPFeConvolveMatrix *feConvolveMatrix = SP_FECONVOLVEMATRIX(object); (void)feConvolveMatrix; double read_num; @@ -266,8 +426,9 @@ sp_feConvolveMatrix_set(SPObject *object, unsigned int key, gchar const *value) } break; default: - if (((SPObjectClass *) feConvolveMatrix_parent_class)->set) - ((SPObjectClass *) feConvolveMatrix_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feConvolveMatrix_parent_class)->set) +// ((SPObjectClass *) feConvolveMatrix_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } @@ -279,6 +440,22 @@ sp_feConvolveMatrix_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feConvolveMatrix_update(SPObject *object, 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 *) feConvolveMatrix_parent_class)->update) { +// ((SPObjectClass *) feConvolveMatrix_parent_class)->update(object, ctx, flags); +// } + ((SPFeConvolveMatrix*)object)->cfeconvolvematrix->onUpdate(ctx, flags); +} + +void CFeConvolveMatrix::onUpdate(SPCtx *ctx, guint flags) { + SPFeConvolveMatrix* object = this->spfeconvolvematrix; + if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) { @@ -286,9 +463,10 @@ sp_feConvolveMatrix_update(SPObject *object, SPCtx *ctx, guint flags) } - if (((SPObjectClass *) feConvolveMatrix_parent_class)->update) { - ((SPObjectClass *) feConvolveMatrix_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feConvolveMatrix_parent_class)->update) { +// ((SPObjectClass *) feConvolveMatrix_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -297,6 +475,24 @@ 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) { +// /* 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); +// } +// +// +// if (((SPObjectClass *) feConvolveMatrix_parent_class)->write) { +// ((SPObjectClass *) feConvolveMatrix_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeConvolveMatrix*)object)->cfeconvolvematrix->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeConvolveMatrix::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeConvolveMatrix* object = this->spfeconvolvematrix; + /* TODO: Don't just clone, but create a new repr node and write all * relevant values into it */ if (!repr) { @@ -304,14 +500,41 @@ sp_feConvolveMatrix_write(SPObject *object, Inkscape::XML::Document *doc, Inksca } - if (((SPObjectClass *) feConvolveMatrix_parent_class)->write) { - ((SPObjectClass *) feConvolveMatrix_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feConvolveMatrix_parent_class)->write) { +// ((SPObjectClass *) feConvolveMatrix_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } static void sp_feConvolveMatrix_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); + ((SPFeConvolveMatrix*)primitive)->cfeconvolvematrix->onBuildRenderer(filter); +} + +void CFeConvolveMatrix::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeConvolveMatrix* primitive = this->spfeconvolvematrix; + g_assert(primitive != NULL); g_assert(filter != NULL); @@ -332,7 +555,6 @@ static void sp_feConvolveMatrix_build_renderer(SPFilterPrimitive *primitive, Ink nr_convolve->set_divisor(sp_convolve->divisor); nr_convolve->set_bias(sp_convolve->bias); nr_convolve->set_preserveAlpha(sp_convolve->preserveAlpha); - } /* Local Variables: diff --git a/src/filters/convolvematrix.h b/src/filters/convolvematrix.h index 4c5261e05..ad15ed4a5 100644 --- a/src/filters/convolvematrix.h +++ b/src/filters/convolvematrix.h @@ -26,7 +26,12 @@ class SPFeConvolveMatrixClass; -struct SPFeConvolveMatrix : public SPFilterPrimitive { +class CFeConvolveMatrix; + +class SPFeConvolveMatrix : public SPFilterPrimitive { +public: + CFeConvolveMatrix* cfeconvolvematrix; + NumberOptNumber order; std::vector<gdouble> kernelMatrix; double divisor, bias; @@ -45,6 +50,26 @@ struct SPFeConvolveMatrixClass { SPFilterPrimitiveClass parent_class; }; +class CFeConvolveMatrix : public CFilterPrimitive { +public: + CFeConvolveMatrix(SPFeConvolveMatrix* matrix); + virtual ~CFeConvolveMatrix(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeConvolveMatrix* spfeconvolvematrix; +}; + GType sp_feConvolveMatrix_get_type(); #endif /* !SP_FECONVOLVEMATRIX_H_SEEN */ diff --git a/src/filters/diffuselighting.cpp b/src/filters/diffuselighting.cpp index b0c091ebb..1512c1cc5 100644 --- a/src/filters/diffuselighting.cpp +++ b/src/filters/diffuselighting.cpp @@ -94,9 +94,20 @@ sp_feDiffuseLighting_class_init(SPFeDiffuseLightingClass *klass) sp_primitive_class->build_renderer = sp_feDiffuseLighting_build_renderer; } +CFeDiffuseLighting::CFeDiffuseLighting(SPFeDiffuseLighting* dl) : CFilterPrimitive(dl) { + this->spfediffuselighting = dl; +} + +CFeDiffuseLighting::~CFeDiffuseLighting() { +} + static void sp_feDiffuseLighting_init(SPFeDiffuseLighting *feDiffuseLighting) { + feDiffuseLighting->cfediffuselighting = new CFeDiffuseLighting(feDiffuseLighting); + feDiffuseLighting->cfilterprimitive = feDiffuseLighting->cfediffuselighting; + feDiffuseLighting->cobject = feDiffuseLighting->cfediffuselighting; + feDiffuseLighting->surfaceScale = 1; feDiffuseLighting->diffuseConstant = 1; feDiffuseLighting->lighting_color = 0xffffffff; @@ -113,20 +124,34 @@ 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 *) feDiffuseLighting_parent_class)->build) { -// ((SPObjectClass *) feDiffuseLighting_parent_class)->build(object, document, repr); -// } - // CPPIFY: todo - - /*LOAD ATTRIBUTES FROM REPR HERE*/ - object->readAttr( "surfaceScale" ); - object->readAttr( "diffuseConstant" ); - object->readAttr( "kernelUnitLength" ); - object->readAttr( "lighting-color" ); - +//static void +//sp_feDiffuseLighting_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ +//// if (((SPObjectClass *) feDiffuseLighting_parent_class)->build) { +//// ((SPObjectClass *) 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 CFeDiffuseLighting::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + // if (((SPObjectClass *) feDiffuseLighting_parent_class)->build) { + // ((SPObjectClass *) feDiffuseLighting_parent_class)->build(object, document, repr); + // } + CFilterPrimitive::onBuild(document, repr); + + SPFeDiffuseLighting* object = this->spfediffuselighting; + + /*LOAD ATTRIBUTES FROM REPR HERE*/ + object->readAttr( "surfaceScale" ); + object->readAttr( "diffuseConstant" ); + object->readAttr( "kernelUnitLength" ); + object->readAttr( "lighting-color" ); } /** @@ -135,8 +160,13 @@ sp_feDiffuseLighting_build(SPObject *object, SPDocument *document, Inkscape::XML static void sp_feDiffuseLighting_release(SPObject *object) { - if (((SPObjectClass *) feDiffuseLighting_parent_class)->release) - ((SPObjectClass *) feDiffuseLighting_parent_class)->release(object); +// if (((SPObjectClass *) feDiffuseLighting_parent_class)->release) +// ((SPObjectClass *) feDiffuseLighting_parent_class)->release(object); + ((SPFeDiffuseLighting*)object)->cfediffuselighting->onRelease(); +} + +void CFeDiffuseLighting::onRelease() { + CFilterPrimitive::onRelease(); } /** @@ -145,6 +175,86 @@ sp_feDiffuseLighting_release(SPObject *object) static void sp_feDiffuseLighting_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeDiffuseLighting *feDiffuseLighting = SP_FEDIFFUSELIGHTING(object); +// 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) { +// feDiffuseLighting->surfaceScale = g_ascii_strtod(value, &end_ptr); +// if (end_ptr) { +// feDiffuseLighting->surfaceScale_set = TRUE; +// } +// } +// if (!value || !end_ptr) { +// feDiffuseLighting->surfaceScale = 1; +// feDiffuseLighting->surfaceScale_set = FALSE; +// } +// if (feDiffuseLighting->renderer) { +// feDiffuseLighting->renderer->surfaceScale = feDiffuseLighting->surfaceScale; +// } +// object->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; +// } else { +// end_ptr = NULL; +// g_warning("feDiffuseLighting: diffuseConstant should be a positive number ... defaulting to 1"); +// } +// } +// if (!value || !end_ptr) { +// feDiffuseLighting->diffuseConstant = 1; +// feDiffuseLighting->diffuseConstant_set = FALSE; +// } +// if (feDiffuseLighting->renderer) { +// feDiffuseLighting->renderer->diffuseConstant = feDiffuseLighting->diffuseConstant; +// } +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); +// break; +// case SP_ATTR_KERNELUNITLENGTH: +// //TODO kernelUnit +// //feDiffuseLighting->kernelUnitLength.set(value); +// /*TODOif (feDiffuseLighting->renderer) { +// feDiffuseLighting->renderer->surfaceScale = feDiffuseLighting->renderer; +// } +// */ +// object->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); +// //if a value was read +// if (cend_ptr) { +// feDiffuseLighting->lighting_color_set = TRUE; +// } else { +// //lighting_color already contains the default value +// feDiffuseLighting->lighting_color_set = FALSE; +// } +// if (feDiffuseLighting->renderer) { +// feDiffuseLighting->renderer->lighting_color = feDiffuseLighting->lighting_color; +// } +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); +// break; +// default: +// if (((SPObjectClass *) feDiffuseLighting_parent_class)->set) +// ((SPObjectClass *) feDiffuseLighting_parent_class)->set(object, key, value); +// break; +// } + ((SPFeDiffuseLighting*)object)->cfediffuselighting->onSet(key, value); + +} + +void CFeDiffuseLighting::onSet(unsigned int key, gchar const *value) { + SPFeDiffuseLighting* object = this->spfediffuselighting; + SPFeDiffuseLighting *feDiffuseLighting = SP_FEDIFFUSELIGHTING(object); gchar const *cend_ptr = NULL; gchar *end_ptr = NULL; @@ -214,11 +324,11 @@ sp_feDiffuseLighting_set(SPObject *object, unsigned int key, gchar const *value) object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); break; default: - if (((SPObjectClass *) feDiffuseLighting_parent_class)->set) - ((SPObjectClass *) feDiffuseLighting_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feDiffuseLighting_parent_class)->set) +// ((SPObjectClass *) feDiffuseLighting_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } - } /** @@ -227,6 +337,22 @@ sp_feDiffuseLighting_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feDiffuseLighting_update(SPObject *object, SPCtx *ctx, guint flags) { +// if (flags & (SP_OBJECT_MODIFIED_FLAG)) { +// object->readAttr( "surfaceScale" ); +// object->readAttr( "diffuseConstant" ); +// object->readAttr( "kernelUnit" ); +// object->readAttr( "lighting-color" ); +// } +// +// if (((SPObjectClass *) feDiffuseLighting_parent_class)->update) { +// ((SPObjectClass *) feDiffuseLighting_parent_class)->update(object, ctx, flags); +// } + ((SPFeDiffuseLighting*)object)->cfediffuselighting->onUpdate(ctx, flags); +} + +void CFeDiffuseLighting::onUpdate(SPCtx *ctx, guint flags) { + SPFeDiffuseLighting* object = this->spfediffuselighting; + if (flags & (SP_OBJECT_MODIFIED_FLAG)) { object->readAttr( "surfaceScale" ); object->readAttr( "diffuseConstant" ); @@ -234,9 +360,10 @@ sp_feDiffuseLighting_update(SPObject *object, SPCtx *ctx, guint flags) object->readAttr( "lighting-color" ); } - if (((SPObjectClass *) feDiffuseLighting_parent_class)->update) { - ((SPObjectClass *) feDiffuseLighting_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feDiffuseLighting_parent_class)->update) { +// ((SPObjectClass *) feDiffuseLighting_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -245,6 +372,42 @@ sp_feDiffuseLighting_update(SPObject *object, SPCtx *ctx, guint flags) static Inkscape::XML::Node * sp_feDiffuseLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { +// SPFeDiffuseLighting *fediffuselighting = SP_FEDIFFUSELIGHTING(object); +// +// /* 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 = doc->createElement("svg:feDiffuseLighting"); +// } +// +// if (fediffuselighting->surfaceScale_set) +// sp_repr_set_css_double(repr, "surfaceScale", fediffuselighting->surfaceScale); +// else +// repr->setAttribute("surfaceScale", NULL); +// if (fediffuselighting->diffuseConstant_set) +// sp_repr_set_css_double(repr, "diffuseConstant", fediffuselighting->diffuseConstant); +// else +// repr->setAttribute("diffuseConstant", NULL); +// /*TODO kernelUnits */ +// if (fediffuselighting->lighting_color_set) { +// gchar c[64]; +// sp_svg_write_color(c, sizeof(c), fediffuselighting->lighting_color); +// repr->setAttribute("lighting-color", c); +// } else +// repr->setAttribute("lighting-color", NULL); +// +// if (((SPObjectClass *) feDiffuseLighting_parent_class)->write) { +// ((SPObjectClass *) feDiffuseLighting_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeDiffuseLighting*)object)->cfediffuselighting->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeDiffuseLighting::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeDiffuseLighting* object = this->spfediffuselighting; + SPFeDiffuseLighting *fediffuselighting = SP_FEDIFFUSELIGHTING(object); /* TODO: Don't just clone, but create a new repr node and write all @@ -270,9 +433,10 @@ sp_feDiffuseLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inksc } else repr->setAttribute("lighting-color", NULL); - if (((SPObjectClass *) feDiffuseLighting_parent_class)->write) { - ((SPObjectClass *) feDiffuseLighting_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feDiffuseLighting_parent_class)->write) { +// ((SPObjectClass *) feDiffuseLighting_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } @@ -283,15 +447,28 @@ sp_feDiffuseLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inksc static void sp_feDiffuseLighting_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { +// SPFeDiffuseLighting *f = SP_FEDIFFUSELIGHTING(object); +// +// if (((SPObjectClass *) feDiffuseLighting_parent_class)->child_added) +// (* ((SPObjectClass *) feDiffuseLighting_parent_class)->child_added)(object, child, ref); +// +// sp_feDiffuseLighting_children_modified(f); +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + ((SPFeDiffuseLighting*)object)->cfediffuselighting->onChildAdded(child, ref); +} + +void CFeDiffuseLighting::onChildAdded(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { + SPFeDiffuseLighting* object = this->spfediffuselighting; + SPFeDiffuseLighting *f = SP_FEDIFFUSELIGHTING(object); - if (((SPObjectClass *) feDiffuseLighting_parent_class)->child_added) - (* ((SPObjectClass *) feDiffuseLighting_parent_class)->child_added)(object, child, ref); +// if (((SPObjectClass *) feDiffuseLighting_parent_class)->child_added) +// (* ((SPObjectClass *) feDiffuseLighting_parent_class)->child_added)(object, child, ref); + CFilterPrimitive::onChildAdded(child, ref); sp_feDiffuseLighting_children_modified(f); object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } - /** * Callback for remove_child event. @@ -299,21 +476,48 @@ sp_feDiffuseLighting_child_added(SPObject *object, Inkscape::XML::Node *child, I static void sp_feDiffuseLighting_remove_child(SPObject *object, Inkscape::XML::Node *child) { - SPFeDiffuseLighting *f = SP_FEDIFFUSELIGHTING(object); +// SPFeDiffuseLighting *f = SP_FEDIFFUSELIGHTING(object); +// +// if (((SPObjectClass *) feDiffuseLighting_parent_class)->remove_child) +// (* ((SPObjectClass *) feDiffuseLighting_parent_class)->remove_child)(object, child); +// +// sp_feDiffuseLighting_children_modified(f); +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + ((SPFeDiffuseLighting*)object)->cfediffuselighting->onRemoveChild(child); +} - if (((SPObjectClass *) feDiffuseLighting_parent_class)->remove_child) - (* ((SPObjectClass *) feDiffuseLighting_parent_class)->remove_child)(object, child); +void CFeDiffuseLighting::onRemoveChild(Inkscape::XML::Node *child) { + SPFeDiffuseLighting* object = this->spfediffuselighting; - sp_feDiffuseLighting_children_modified(f); - object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + SPFeDiffuseLighting *f = SP_FEDIFFUSELIGHTING(object); + +// if (((SPObjectClass *) feDiffuseLighting_parent_class)->remove_child) +// (* ((SPObjectClass *) feDiffuseLighting_parent_class)->remove_child)(object, child); + CFilterPrimitive::onRemoveChild(child); + + sp_feDiffuseLighting_children_modified(f); + object->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 *) (feDiffuseLighting_parent_class))->order_changed) +// (* ((SPObjectClass *) (feDiffuseLighting_parent_class))->order_changed) (object, child, old_ref, new_ref); +// +// sp_feDiffuseLighting_children_modified(f); +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + ((SPFeDiffuseLighting*)object)->cfediffuselighting->onOrderChanged(child, old_ref, new_ref); +} + +void CFeDiffuseLighting::onOrderChanged(Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref) { + SPFeDiffuseLighting* object = this->spfediffuselighting; + SPFeDiffuseLighting *f = SP_FEDIFFUSELIGHTING(object); - if (((SPObjectClass *) (feDiffuseLighting_parent_class))->order_changed) - (* ((SPObjectClass *) (feDiffuseLighting_parent_class))->order_changed) (object, child, old_ref, new_ref); +// if (((SPObjectClass *) (feDiffuseLighting_parent_class))->order_changed) +// (* ((SPObjectClass *) (feDiffuseLighting_parent_class))->order_changed) (object, child, old_ref, new_ref); + CFilterPrimitive::onOrderChanged(child, old_ref, new_ref); sp_feDiffuseLighting_children_modified(f); object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -339,6 +543,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); +// 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); +// +// nr_diffuselighting->diffuseConstant = sp_diffuselighting->diffuseConstant; +// nr_diffuselighting->surfaceScale = sp_diffuselighting->surfaceScale; +// nr_diffuselighting->lighting_color = sp_diffuselighting->lighting_color; +// //We assume there is at most one child +// nr_diffuselighting->light_type = Inkscape::Filters::NO_LIGHT; +// if (SP_IS_FEDISTANTLIGHT(primitive->children)) { +// nr_diffuselighting->light_type = Inkscape::Filters::DISTANT_LIGHT; +// nr_diffuselighting->light.distant = SP_FEDISTANTLIGHT(primitive->children); +// } +// if (SP_IS_FEPOINTLIGHT(primitive->children)) { +// nr_diffuselighting->light_type = Inkscape::Filters::POINT_LIGHT; +// nr_diffuselighting->light.point = SP_FEPOINTLIGHT(primitive->children); +// } +// if (SP_IS_FESPOTLIGHT(primitive->children)) { +// nr_diffuselighting->light_type = Inkscape::Filters::SPOT_LIGHT; +// nr_diffuselighting->light.spot = SP_FESPOTLIGHT(primitive->children); +// } +// +// //nr_offset->set_dx(sp_offset->dx); +// //nr_offset->set_dy(sp_offset->dy); + ((SPFeDiffuseLighting*)primitive)->cfediffuselighting->onBuildRenderer(filter); +} + +void CFeDiffuseLighting::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeDiffuseLighting* primitive = this->spfediffuselighting; + g_assert(primitive != NULL); g_assert(filter != NULL); @@ -374,7 +617,6 @@ static void sp_feDiffuseLighting_build_renderer(SPFilterPrimitive *primitive, In //nr_offset->set_dy(sp_offset->dy); } - /* Local Variables: mode:c++ diff --git a/src/filters/diffuselighting.h b/src/filters/diffuselighting.h index a23346622..fdc5b9f59 100644 --- a/src/filters/diffuselighting.h +++ b/src/filters/diffuselighting.h @@ -33,7 +33,12 @@ class FilterDiffuseLighting; class SPFeDiffuseLightingClass; -struct SPFeDiffuseLighting : public SPFilterPrimitive { +class CFeDiffuseLighting; + +class SPFeDiffuseLighting : public SPFilterPrimitive { +public: + CFeDiffuseLighting* cfediffuselighting; + gfloat surfaceScale; guint surfaceScale_set : 1; gfloat diffuseConstant; @@ -48,6 +53,31 @@ struct SPFeDiffuseLightingClass { SPFilterPrimitiveClass parent_class; }; +class CFeDiffuseLighting : public CFilterPrimitive { +public: + CFeDiffuseLighting(SPFeDiffuseLighting* dl); + virtual ~CFeDiffuseLighting(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onChildAdded(Inkscape::XML::Node* child, Inkscape::XML::Node* ref); + virtual void onRemoveChild(Inkscape::XML::Node* child); + + virtual void onOrderChanged(Inkscape::XML::Node* child, Inkscape::XML::Node* old_repr, Inkscape::XML::Node* new_repr); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeDiffuseLighting* spfediffuselighting; +}; + GType sp_feDiffuseLighting_get_type(); #endif /* !SP_FEDIFFUSELIGHTING_H_SEEN */ diff --git a/src/filters/displacementmap.cpp b/src/filters/displacementmap.cpp index fb2e64299..e9f859bf6 100644 --- a/src/filters/displacementmap.cpp +++ b/src/filters/displacementmap.cpp @@ -76,9 +76,20 @@ sp_feDisplacementMap_class_init(SPFeDisplacementMapClass *klass) sp_primitive_class->build_renderer = sp_feDisplacementMap_build_renderer; } +CFeDisplacementMap::CFeDisplacementMap(SPFeDisplacementMap* map) : CFilterPrimitive(map) { + this->spfedisplacementmap = map; +} + +CFeDisplacementMap::~CFeDisplacementMap() { +} + static void sp_feDisplacementMap_init(SPFeDisplacementMap *feDisplacementMap) { + feDisplacementMap->cfedisplacementmap = new CFeDisplacementMap(feDisplacementMap); + feDisplacementMap->cfilterprimitive = feDisplacementMap->cfedisplacementmap; + feDisplacementMap->cobject = feDisplacementMap->cfedisplacementmap; + feDisplacementMap->scale=0; feDisplacementMap->xChannelSelector = DISPLACEMENTMAP_CHANNEL_ALPHA; feDisplacementMap->yChannelSelector = DISPLACEMENTMAP_CHANNEL_ALPHA; @@ -90,30 +101,55 @@ 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 *) feDisplacementMap_parent_class)->build) { -// ((SPObjectClass *) feDisplacementMap_parent_class)->build(object, document, repr); +//static void +//sp_feDisplacementMap_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ +//// if (((SPObjectClass *) feDisplacementMap_parent_class)->build) { +//// ((SPObjectClass *) 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)); // } - // CPPIFY: todo - - /*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 CFeDisplacementMap::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + SPFeDisplacementMap* object = this->spfedisplacementmap; + + // if (((SPObjectClass *) feDisplacementMap_parent_class)->build) { + // ((SPObjectClass *) feDisplacementMap_parent_class)->build(object, document, repr); + // } + CFilterPrimitive::onBuild(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)); + } } /** @@ -122,8 +158,13 @@ sp_feDisplacementMap_build(SPObject *object, SPDocument *document, Inkscape::XML static void sp_feDisplacementMap_release(SPObject *object) { - if (((SPObjectClass *) feDisplacementMap_parent_class)->release) - ((SPObjectClass *) feDisplacementMap_parent_class)->release(object); +// if (((SPObjectClass *) feDisplacementMap_parent_class)->release) +// ((SPObjectClass *) feDisplacementMap_parent_class)->release(object); + ((SPFeDisplacementMap*)object)->cfedisplacementmap->onRelease(); +} + +void CFeDisplacementMap::onRelease() { + CFilterPrimitive::onRelease(); } static FilterDisplacementMapChannelSelector sp_feDisplacementMap_readChannelSelector(gchar const *value) @@ -156,6 +197,53 @@ static FilterDisplacementMapChannelSelector sp_feDisplacementMap_readChannelSele static void sp_feDisplacementMap_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeDisplacementMap *feDisplacementMap = SP_FEDISPLACEMENTMAP(object); +// (void)feDisplacementMap; +// 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); +// } +// 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); +// } +// 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); +// } +// 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); +// } +// break; +// default: +// if (((SPObjectClass *) feDisplacementMap_parent_class)->set) +// ((SPObjectClass *) feDisplacementMap_parent_class)->set(object, key, value); +// break; +// } + ((SPFeDisplacementMap*)object)->cfedisplacementmap->onSet(key, value); + +} + +void CFeDisplacementMap::onSet(unsigned int key, gchar const *value) { + SPFeDisplacementMap* object = this->spfedisplacementmap; + SPFeDisplacementMap *feDisplacementMap = SP_FEDISPLACEMENTMAP(object); (void)feDisplacementMap; int input; @@ -192,11 +280,11 @@ sp_feDisplacementMap_set(SPObject *object, unsigned int key, gchar const *value) } break; default: - if (((SPObjectClass *) feDisplacementMap_parent_class)->set) - ((SPObjectClass *) feDisplacementMap_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feDisplacementMap_parent_class)->set) +// ((SPObjectClass *) feDisplacementMap_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } - } /** @@ -205,6 +293,35 @@ sp_feDisplacementMap_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feDisplacementMap_update(SPObject *object, 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? */ +// +// } +// +// /* 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); +// +// //XML Tree being used directly here while it shouldn't be. +// object->getRepr()->setAttribute("in2", sp_filter_name_for_image(parent, disp->in2)); +// } +// +// if (((SPObjectClass *) feDisplacementMap_parent_class)->update) { +// ((SPObjectClass *) feDisplacementMap_parent_class)->update(object, ctx, flags); +// } + ((SPFeDisplacementMap*)object)->cfedisplacementmap->onUpdate(ctx, flags); +} + +void CFeDisplacementMap::onUpdate(SPCtx *ctx, guint flags) { + SPFeDisplacementMap* object = this->spfedisplacementmap; + if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) { @@ -225,9 +342,10 @@ sp_feDisplacementMap_update(SPObject *object, SPCtx *ctx, guint flags) object->getRepr()->setAttribute("in2", sp_filter_name_for_image(parent, disp->in2)); } - if (((SPObjectClass *) feDisplacementMap_parent_class)->update) { - ((SPObjectClass *) feDisplacementMap_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feDisplacementMap_parent_class)->update) { +// ((SPObjectClass *) feDisplacementMap_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } static char const * get_channelselector_name(FilterDisplacementMapChannelSelector selector) { @@ -251,6 +369,44 @@ static char const * get_channelselector_name(FilterDisplacementMapChannelSelecto 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); +// +// if (!repr) { +// repr = doc->createElement("svg:feDisplacementMap"); +// } +// +// gchar const *out_name = sp_filter_name_for_image(parent, disp->in2); +// if (out_name) { +// repr->setAttribute("in2", out_name); +// } else { +// SPObject *i = parent->children; +// while (i && i->next != object) 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); +// repr->setAttribute("xChannelSelector", +// get_channelselector_name(disp->xChannelSelector)); +// repr->setAttribute("yChannelSelector", +// get_channelselector_name(disp->yChannelSelector)); +// +// if (((SPObjectClass *) feDisplacementMap_parent_class)->write) { +// ((SPObjectClass *) feDisplacementMap_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeDisplacementMap*)object)->cfedisplacementmap->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeDisplacementMap::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeDisplacementMap* object = this->spfedisplacementmap; + SPFeDisplacementMap *disp = SP_FEDISPLACEMENTMAP(object); SPFilter *parent = SP_FILTER(object->parent); @@ -278,14 +434,37 @@ sp_feDisplacementMap_write(SPObject *object, Inkscape::XML::Document *doc, Inksc repr->setAttribute("yChannelSelector", get_channelselector_name(disp->yChannelSelector)); - if (((SPObjectClass *) feDisplacementMap_parent_class)->write) { - ((SPObjectClass *) feDisplacementMap_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feDisplacementMap_parent_class)->write) { +// ((SPObjectClass *) feDisplacementMap_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } static void sp_feDisplacementMap_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); +// +// 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); + ((SPFeDisplacementMap*)primitive)->cfedisplacementmap->onBuildRenderer(filter); +} + +void CFeDisplacementMap::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeDisplacementMap* primitive = this->spfedisplacementmap; + g_assert(primitive != NULL); g_assert(filter != NULL); @@ -304,7 +483,6 @@ static void sp_feDisplacementMap_build_renderer(SPFilterPrimitive *primitive, In nr_displacement_map->set_channel_selector(1, sp_displacement_map->yChannelSelector); } - /* Local Variables: mode:c++ diff --git a/src/filters/displacementmap.h b/src/filters/displacementmap.h index 6232f0937..2f365fd48 100644 --- a/src/filters/displacementmap.h +++ b/src/filters/displacementmap.h @@ -30,7 +30,12 @@ enum FilterDisplacementMapChannelSelector { class SPFeDisplacementMapClass; -struct SPFeDisplacementMap : public SPFilterPrimitive { +class CFeDisplacementMap; + +class SPFeDisplacementMap : public SPFilterPrimitive { +public: + CFeDisplacementMap* cfedisplacementmap; + int in2; double scale; FilterDisplacementMapChannelSelector xChannelSelector; @@ -41,6 +46,26 @@ struct SPFeDisplacementMapClass { SPFilterPrimitiveClass parent_class; }; +class CFeDisplacementMap : public CFilterPrimitive { +public: + CFeDisplacementMap(SPFeDisplacementMap* map); + virtual ~CFeDisplacementMap(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeDisplacementMap* spfedisplacementmap; +}; + GType sp_feDisplacementMap_get_type(); #endif /* !SP_FEDISPLACEMENTMAP_H_SEEN */ diff --git a/src/filters/flood.cpp b/src/filters/flood.cpp index 2f6bea315..13f797c7c 100644 --- a/src/filters/flood.cpp +++ b/src/filters/flood.cpp @@ -76,8 +76,19 @@ static void sp_feFlood_class_init(SPFeFloodClass *klass) sp_primitive_class->build_renderer = sp_feFlood_build_renderer; } +CFeFlood::CFeFlood(SPFeFlood* flood) : CFilterPrimitive(flood) { + this->spfeflood = flood; +} + +CFeFlood::~CFeFlood() { +} + static void sp_feFlood_init(SPFeFlood *feFlood) { + feFlood->cfeflood = new CFeFlood(feFlood); + feFlood->cfilterprimitive = feFlood->cfeflood; + feFlood->cobject = feFlood->cfeflood; + feFlood->opacity = 1; feFlood->icc = NULL; } @@ -87,17 +98,29 @@ 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 (((SPObjectClass *) feFlood_parent_class)->build) { -// ((SPObjectClass *) feFlood_parent_class)->build(object, document, repr); -// } - // CPPIFY: todo - - /*LOAD ATTRIBUTES FROM REPR HERE*/ - object->readAttr( "flood-opacity" ); - object->readAttr( "flood-color" ); +//static void +//sp_feFlood_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ +//// if (((SPObjectClass *) feFlood_parent_class)->build) { +//// ((SPObjectClass *) feFlood_parent_class)->build(object, document, repr); +//// } +// +// /*LOAD ATTRIBUTES FROM REPR HERE*/ +// object->readAttr( "flood-opacity" ); +// object->readAttr( "flood-color" ); +//} + +void CFeFlood::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + // if (((SPObjectClass *) feFlood_parent_class)->build) { + // ((SPObjectClass *) feFlood_parent_class)->build(object, document, repr); + // } + CFilterPrimitive::onBuild(document, repr); + + SPFeFlood* object = this->spfeflood; + + /*LOAD ATTRIBUTES FROM REPR HERE*/ + object->readAttr( "flood-opacity" ); + object->readAttr( "flood-color" ); } /** @@ -105,8 +128,13 @@ sp_feFlood_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *re */ static void sp_feFlood_release(SPObject *object) { - if (((SPObjectClass *) feFlood_parent_class)->release) - ((SPObjectClass *) feFlood_parent_class)->release(object); +// if (((SPObjectClass *) feFlood_parent_class)->release) +// ((SPObjectClass *) feFlood_parent_class)->release(object); + ((SPFeFlood*)object)->cfeflood->onRelease(); +} + +void CFeFlood::onRelease() { + CFilterPrimitive::onRelease(); } /** @@ -115,6 +143,73 @@ static void sp_feFlood_release(SPObject *object) static void sp_feFlood_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeFlood *feFlood = SP_FEFLOOD(object); +// (void)feFlood; +// gchar const *cend_ptr = NULL; +// gchar *end_ptr = NULL; +// guint32 read_color; +// double read_num; +// bool dirty = false; +// +// switch(key) { +// /*DEAL WITH SETTING ATTRIBUTES HERE*/ +// case SP_PROP_FLOOD_COLOR: +// cend_ptr = NULL; +// read_color = sp_svg_read_color(value, &cend_ptr, 0xffffffff); +// +// if (cend_ptr && read_color != feFlood->color){ +// feFlood->color = read_color; +// dirty=true; +// } +// +// if (cend_ptr){ +// 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; +// } +// dirty = true; +// } +// } +// if (dirty) +// object->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) +// { +// g_warning("Unable to convert \"%s\" to number", value); +// read_num = 1; +// } +// } +// } +// else { +// read_num = 1; +// } +// if (read_num != feFlood->opacity){ +// feFlood->opacity = read_num; +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); +// } +// break; +// default: +// if (((SPObjectClass *) feFlood_parent_class)->set) +// ((SPObjectClass *) feFlood_parent_class)->set(object, key, value); +// break; +// } + ((SPFeFlood*)object)->cfeflood->onSet(key, value); + +} + +void CFeFlood::onSet(unsigned int key, gchar const *value) { + SPFeFlood* object = this->spfeflood; + SPFeFlood *feFlood = SP_FEFLOOD(object); (void)feFlood; gchar const *cend_ptr = NULL; @@ -171,11 +266,11 @@ sp_feFlood_set(SPObject *object, unsigned int key, gchar const *value) } break; default: - if (((SPObjectClass *) feFlood_parent_class)->set) - ((SPObjectClass *) feFlood_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feFlood_parent_class)->set) +// ((SPObjectClass *) feFlood_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } - } /** @@ -184,6 +279,22 @@ sp_feFlood_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feFlood_update(SPObject *object, 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 *) feFlood_parent_class)->update) { +// ((SPObjectClass *) feFlood_parent_class)->update(object, ctx, flags); +// } + ((SPFeFlood*)object)->cfeflood->onUpdate(ctx, flags); +} + +void CFeFlood::onUpdate(SPCtx *ctx, guint flags) { + SPFeFlood* object = this->spfeflood; + if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) { @@ -191,9 +302,10 @@ sp_feFlood_update(SPObject *object, SPCtx *ctx, guint flags) } - if (((SPObjectClass *) feFlood_parent_class)->update) { - ((SPObjectClass *) feFlood_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feFlood_parent_class)->update) { +// ((SPObjectClass *) feFlood_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -202,20 +314,60 @@ 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) { +// /* 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); +// } +// +// if (((SPObjectClass *) feFlood_parent_class)->write) { +// ((SPObjectClass *) feFlood_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeFlood*)object)->cfeflood->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeFlood::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeFlood* object = this->spfeflood; + /* 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); } - if (((SPObjectClass *) feFlood_parent_class)->write) { - ((SPObjectClass *) feFlood_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feFlood_parent_class)->write) { +// ((SPObjectClass *) feFlood_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } static void sp_feFlood_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); +// +// nr_flood->set_opacity(sp_flood->opacity); +// nr_flood->set_color(sp_flood->color); +// nr_flood->set_icc(sp_flood->icc); + ((SPFeFlood*)primitive)->cfeflood->onBuildRenderer(filter); +} + +void CFeFlood::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeFlood* primitive = this->spfeflood; + g_assert(primitive != NULL); g_assert(filter != NULL); @@ -234,7 +386,6 @@ static void sp_feFlood_build_renderer(SPFilterPrimitive *primitive, Inkscape::Fi nr_flood->set_icc(sp_flood->icc); } - /* Local Variables: mode:c++ diff --git a/src/filters/flood.h b/src/filters/flood.h index 0083def70..7a2bd2916 100644 --- a/src/filters/flood.h +++ b/src/filters/flood.h @@ -23,7 +23,12 @@ class SPFeFloodClass; -struct SPFeFlood : public SPFilterPrimitive { +class CFeFlood; + +class SPFeFlood : public SPFilterPrimitive { +public: + CFeFlood* cfeflood; + guint32 color; SVGICCColor *icc; double opacity; @@ -33,6 +38,26 @@ struct SPFeFloodClass { SPFilterPrimitiveClass parent_class; }; +class CFeFlood : public CFilterPrimitive { +public: + CFeFlood(SPFeFlood* flood); + virtual ~CFeFlood(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeFlood* spfeflood; +}; + GType sp_feFlood_get_type(); diff --git a/src/filters/gaussian-blur.cpp b/src/filters/gaussian-blur.cpp index 1d20b2fee..872e34a76 100644 --- a/src/filters/gaussian-blur.cpp +++ b/src/filters/gaussian-blur.cpp @@ -82,9 +82,19 @@ sp_gaussianBlur_class_init(SPGaussianBlurClass *klass) sp_primitive_class->build_renderer = sp_gaussianBlur_build_renderer; } +CGaussianBlur::CGaussianBlur(SPGaussianBlur* gb) : CFilterPrimitive(gb) { + this->spgaussianblur = gb; +} + +CGaussianBlur::~CGaussianBlur() { +} + static void -sp_gaussianBlur_init(SPGaussianBlur */*gaussianBlur*/) +sp_gaussianBlur_init(SPGaussianBlur *gaussianBlur) { + gaussianBlur->cgaussianblur = new CGaussianBlur(gaussianBlur); + gaussianBlur->cfilterprimitive = gaussianBlur->cgaussianblur; + gaussianBlur->cobject = gaussianBlur->cgaussianblur; } /** @@ -92,16 +102,23 @@ 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) -{ +//static void +//sp_gaussianBlur_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ // if (((SPObjectClass *) gaussianBlur_parent_class)->build) { // ((SPObjectClass *) gaussianBlur_parent_class)->build(object, document, repr); // } - // CPPIFY: todo - object->readAttr( "stdDeviation" ); +// object->readAttr( "stdDeviation" ); + +//} + +void CGaussianBlur::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + CFilterPrimitive::onBuild(document, repr); + + SPGaussianBlur* object = this->spgaussianblur; + object->readAttr( "stdDeviation" ); } /** @@ -111,8 +128,13 @@ static void sp_gaussianBlur_release(SPObject *object) { - if (((SPObjectClass *) gaussianBlur_parent_class)->release) - ((SPObjectClass *) gaussianBlur_parent_class)->release(object); +// if (((SPObjectClass *) gaussianBlur_parent_class)->release) +// ((SPObjectClass *) gaussianBlur_parent_class)->release(object); + ((SPGaussianBlur*)object)->cgaussianblur->onRelease(); +} + +void CGaussianBlur::onRelease() { + CFilterPrimitive::onRelease(); } /** @@ -121,6 +143,25 @@ sp_gaussianBlur_release(SPObject *object) static void sp_gaussianBlur_set(SPObject *object, unsigned int key, gchar const *value) { +// SPGaussianBlur *gaussianBlur = SP_GAUSSIANBLUR(object); +// +// switch(key) { +// case SP_ATTR_STDDEVIATION: +// gaussianBlur->stdDeviation.set(value); +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); +// break; +// default: +// if (((SPObjectClass *) gaussianBlur_parent_class)->set) +// ((SPObjectClass *) gaussianBlur_parent_class)->set(object, key, value); +// break; +// } + + ((SPGaussianBlur*)object)->cgaussianblur->onSet(key, value); +} + +void CGaussianBlur::onSet(unsigned int key, gchar const *value) { + SPGaussianBlur* object = this->spgaussianblur; + SPGaussianBlur *gaussianBlur = SP_GAUSSIANBLUR(object); switch(key) { @@ -129,11 +170,11 @@ sp_gaussianBlur_set(SPObject *object, unsigned int key, gchar const *value) object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); break; default: - if (((SPObjectClass *) gaussianBlur_parent_class)->set) - ((SPObjectClass *) gaussianBlur_parent_class)->set(object, key, value); +// if (((SPObjectClass *) gaussianBlur_parent_class)->set) +// ((SPObjectClass *) gaussianBlur_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } - } /** @@ -142,13 +183,27 @@ sp_gaussianBlur_set(SPObject *object, unsigned int key, gchar const *value) static void sp_gaussianBlur_update(SPObject *object, SPCtx *ctx, guint flags) { +// if (flags & SP_OBJECT_MODIFIED_FLAG) { +// object->readAttr( "stdDeviation" ); +// } +// +// if (((SPObjectClass *) gaussianBlur_parent_class)->update) { +// ((SPObjectClass *) gaussianBlur_parent_class)->update(object, ctx, flags); +// } + ((SPGaussianBlur*)object)->cgaussianblur->onUpdate(ctx, flags); +} + +void CGaussianBlur::onUpdate(SPCtx *ctx, guint flags) { + SPGaussianBlur* object = this->spgaussianblur; + if (flags & SP_OBJECT_MODIFIED_FLAG) { object->readAttr( "stdDeviation" ); } - if (((SPObjectClass *) gaussianBlur_parent_class)->update) { - ((SPObjectClass *) gaussianBlur_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) gaussianBlur_parent_class)->update) { +// ((SPObjectClass *) gaussianBlur_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -157,20 +212,37 @@ 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) { +// /* 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); +// } +// +// if (((SPObjectClass *) gaussianBlur_parent_class)->write) { +// ((SPObjectClass *) gaussianBlur_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPGaussianBlur*)object)->cgaussianblur->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CGaussianBlur::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPGaussianBlur* object = this->spgaussianblur; + /* 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); } - if (((SPObjectClass *) gaussianBlur_parent_class)->write) { - ((SPObjectClass *) gaussianBlur_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) gaussianBlur_parent_class)->write) { +// ((SPObjectClass *) gaussianBlur_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } - void sp_gaussianBlur_setDeviation(SPGaussianBlur *blur, float num) { blur->stdDeviation.setNumber(num); @@ -182,6 +254,28 @@ void sp_gaussianBlur_setDeviation(SPGaussianBlur *blur, float num, float optnum } static void sp_gaussianBlur_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// SPGaussianBlur *sp_blur = SP_GAUSSIANBLUR(primitive); +// +// 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); +// +// gfloat num = sp_blur->stdDeviation.getNumber(); +// if (num >= 0.0) { +// gfloat optnum = sp_blur->stdDeviation.getOptNumber(); +// if(optnum >= 0.0) +// nr_blur->set_deviation((double) num, (double) optnum); +// else +// nr_blur->set_deviation((double) num); +// } + ((SPGaussianBlur*)primitive)->cgaussianblur->onBuildRenderer(filter); +} + +void CGaussianBlur::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPGaussianBlur* primitive = this->spgaussianblur; + SPGaussianBlur *sp_blur = SP_GAUSSIANBLUR(primitive); int handle = filter->add_primitive(Inkscape::Filters::NR_FILTER_GAUSSIANBLUR); diff --git a/src/filters/gaussian-blur.h b/src/filters/gaussian-blur.h index 417f8a6f4..876fb5671 100644 --- a/src/filters/gaussian-blur.h +++ b/src/filters/gaussian-blur.h @@ -24,7 +24,12 @@ /* GaussianBlur base class */ class SPGaussianBlurClass; -struct SPGaussianBlur : public SPFilterPrimitive { +class CGaussianBlur; + +class SPGaussianBlur : public SPFilterPrimitive { +public: + CGaussianBlur* cgaussianblur; + /** stdDeviation attribute */ NumberOptNumber stdDeviation; }; @@ -33,6 +38,26 @@ struct SPGaussianBlurClass { SPFilterPrimitiveClass parent_class; }; +class CGaussianBlur : public CFilterPrimitive { +public: + CGaussianBlur(SPGaussianBlur* gb); + virtual ~CGaussianBlur(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPGaussianBlur* spgaussianblur; +}; + 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 178fa9bc1..336c9c898 100644 --- a/src/filters/image.cpp +++ b/src/filters/image.cpp @@ -79,8 +79,19 @@ static void sp_feImage_class_init(SPFeImageClass *klass) sp_primitive_class->build_renderer = sp_feImage_build_renderer; } +CFeImage::CFeImage(SPFeImage* image) : CFilterPrimitive(image) { + this->spfeimage = image; +} + +CFeImage::~CFeImage() { +} + static void sp_feImage_init(SPFeImage *feImage) { + feImage->cfeimage = new CFeImage(feImage); + feImage->cfilterprimitive = feImage->cfeimage; + feImage->cobject = feImage->cfeimage; + feImage->aspect_align = SP_ASPECT_XMID_YMID; // Default feImage->aspect_clip = SP_ASPECT_MEET; // Default } @@ -90,8 +101,26 @@ 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) -{ +//static void sp_feImage_build(SPObject *object, 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; +// +//// if (((SPObjectClass *) feImage_parent_class)->build) { +//// ((SPObjectClass *) feImage_parent_class)->build(object, document, repr); +//// } +// // CPPIFY: todo +// +// /*LOAD ATTRIBUTES FROM REPR HERE*/ +// +// object->readAttr( "preserveAspectRatio" ); +// object->readAttr( "xlink:href" ); +//} + +void CFeImage::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + SPFeImage* object = this->spfeimage; + // Save document reference so we can load images with relative paths. SPFeImage *feImage = SP_FEIMAGE(object); feImage->document = document; @@ -99,13 +128,12 @@ static void sp_feImage_build(SPObject *object, SPDocument *document, Inkscape::X // if (((SPObjectClass *) feImage_parent_class)->build) { // ((SPObjectClass *) feImage_parent_class)->build(object, document, repr); // } - // CPPIFY: todo + CFilterPrimitive::onBuild(document, repr); /*LOAD ATTRIBUTES FROM REPR HERE*/ object->readAttr( "preserveAspectRatio" ); object->readAttr( "xlink:href" ); - } /** @@ -113,13 +141,27 @@ static void sp_feImage_build(SPObject *object, SPDocument *document, Inkscape::X */ 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; +// +// if (((SPObjectClass *) feImage_parent_class)->release) +// ((SPObjectClass *) feImage_parent_class)->release(object); + ((SPFeImage*)object)->cfeimage->onRelease(); +} + +void CFeImage::onRelease() { + SPFeImage* object = this->spfeimage; + SPFeImage *feImage = SP_FEIMAGE(object); feImage->_image_modified_connection.disconnect(); feImage->_href_modified_connection.disconnect(); if (feImage->SVGElemRef) delete feImage->SVGElemRef; - if (((SPObjectClass *) feImage_parent_class)->release) - ((SPObjectClass *) feImage_parent_class)->release(object); +// if (((SPObjectClass *) feImage_parent_class)->release) +// ((SPObjectClass *) feImage_parent_class)->release(object); + CFilterPrimitive::onRelease(); } static void sp_feImage_elem_modified(SPObject* /*href*/, guint /*flags*/, SPObject* obj) @@ -146,6 +188,118 @@ static void sp_feImage_href_modified(SPObject* /*old_elem*/, SPObject* new_elem, */ static void sp_feImage_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeImage *feImage = SP_FEIMAGE(object); +// (void)feImage; +// switch(key) { +// /*DEAL WITH SETTING ATTRIBUTES HERE*/ +// case SP_ATTR_XLINK_HREF: +// if (feImage->href) { +// g_free(feImage->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(); +// 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); +// break; +// } else { +// g_warning("SVG element URI was not found in the document while loading feImage"); +// } +// } +// // catches either MalformedURIException or UnsupportedURIException +// catch(const Inkscape::BadURIException & e) +// { +// feImage->from_element = false; +// /* This occurs when using external image as the source */ +// //g_warning("caught Inkscape::BadURIException in sp_feImage_set"); +// break; +// } +// break; +// +// 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); +// if (value) { +// int len; +// gchar c[256]; +// const gchar *p, *e; +// unsigned int align, clip; +// p = value; +// while (*p && *p == 32) p += 1; +// if (!*p) break; +// e = p; +// while (*e && *e != 32) e += 1; +// len = e - p; +// if (len > 8) break; +// memcpy (c, value, len); +// c[len] = 0; +// /* Now the actual part */ +// if (!strcmp (c, "none")) { +// align = SP_ASPECT_NONE; +// } else if (!strcmp (c, "xMinYMin")) { +// align = SP_ASPECT_XMIN_YMIN; +// } else if (!strcmp (c, "xMidYMin")) { +// align = SP_ASPECT_XMID_YMIN; +// } else if (!strcmp (c, "xMaxYMin")) { +// align = SP_ASPECT_XMAX_YMIN; +// } else if (!strcmp (c, "xMinYMid")) { +// align = SP_ASPECT_XMIN_YMID; +// } else if (!strcmp (c, "xMidYMid")) { +// align = SP_ASPECT_XMID_YMID; +// } else if (!strcmp (c, "xMaxYMid")) { +// align = SP_ASPECT_XMAX_YMID; +// } else if (!strcmp (c, "xMinYMax")) { +// align = SP_ASPECT_XMIN_YMAX; +// } else if (!strcmp (c, "xMidYMax")) { +// align = SP_ASPECT_XMID_YMAX; +// } else if (!strcmp (c, "xMaxYMax")) { +// align = SP_ASPECT_XMAX_YMAX; +// } else { +// g_warning("Illegal preserveAspectRatio: %s", c); +// break; +// } +// clip = SP_ASPECT_MEET; +// while (*e && *e == 32) e += 1; +// if (*e) { +// if (!strcmp (e, "meet")) { +// clip = SP_ASPECT_MEET; +// } else if (!strcmp (e, "slice")) { +// clip = SP_ASPECT_SLICE; +// } else { +// break; +// } +// } +// feImage->aspect_align = align; +// feImage->aspect_clip = clip; +// } +// break; +// +// default: +// if (((SPObjectClass *) feImage_parent_class)->set) +// ((SPObjectClass *) feImage_parent_class)->set(object, key, value); +// break; +// } + ((SPFeImage*)object)->cfeimage->onSet(key, value); +} + +void CFeImage::onSet(unsigned int key, gchar const *value) { + SPFeImage* object = this->spfeimage; + SPFeImage *feImage = SP_FEIMAGE(object); (void)feImage; switch(key) { @@ -248,11 +402,11 @@ static void sp_feImage_set(SPObject *object, unsigned int key, gchar const *valu break; default: - if (((SPObjectClass *) feImage_parent_class)->set) - ((SPObjectClass *) feImage_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feImage_parent_class)->set) +// ((SPObjectClass *) feImage_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } - } /** @@ -261,15 +415,31 @@ static void sp_feImage_set(SPObject *object, unsigned int key, gchar const *valu static void sp_feImage_update(SPObject *object, 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 *) feImage_parent_class)->update) { +// ((SPObjectClass *) feImage_parent_class)->update(object, ctx, flags); +// } + ((SPFeImage*)object)->cfeimage->onUpdate(ctx, flags); +} + +void CFeImage::onUpdate(SPCtx *ctx, guint flags) { + SPFeImage* object = this->spfeimage; + if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) { /* do something to trigger redisplay, updates? */ } - if (((SPObjectClass *) feImage_parent_class)->update) { - ((SPObjectClass *) feImage_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feImage_parent_class)->update) { +// ((SPObjectClass *) feImage_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -277,20 +447,62 @@ 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) { +// /* 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); +// } +// +// if (((SPObjectClass *) feImage_parent_class)->write) { +// ((SPObjectClass *) feImage_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeImage*)object)->cfeimage->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeImage::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeImage* object = this->spfeimage; + /* 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); } - if (((SPObjectClass *) feImage_parent_class)->write) { - ((SPObjectClass *) feImage_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feImage_parent_class)->write) { +// ((SPObjectClass *) feImage_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } static void sp_feImage_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); +// +// 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); + ((SPFeImage*)primitive)->cfeimage->onBuildRenderer(filter); +} + +void CFeImage::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeImage* primitive = this->spfeimage; + g_assert(primitive != NULL); g_assert(filter != NULL); diff --git a/src/filters/image.h b/src/filters/image.h index b4081602a..c222c53b8 100644 --- a/src/filters/image.h +++ b/src/filters/image.h @@ -26,7 +26,12 @@ class SPFeImageClass; -struct SPFeImage : public SPFilterPrimitive { +class CFeImage; + +class SPFeImage : public SPFilterPrimitive { +public: + CFeImage* cfeimage; + gchar *href; /* preserveAspectRatio */ @@ -45,6 +50,26 @@ struct SPFeImageClass { SPFilterPrimitiveClass parent_class; }; +class CFeImage : public CFilterPrimitive { +public: + CFeImage(SPFeImage* image); + virtual ~CFeImage(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeImage* spfeimage; +}; + GType sp_feImage_get_type(); #endif /* !SP_FEIMAGE_H_SEEN */ diff --git a/src/filters/merge.cpp b/src/filters/merge.cpp index ba6506fe9..c16783d84 100644 --- a/src/filters/merge.cpp +++ b/src/filters/merge.cpp @@ -76,9 +76,19 @@ sp_feMerge_class_init(SPFeMergeClass *klass) sp_primitive_class->build_renderer = sp_feMerge_build_renderer; } +CFeMerge::CFeMerge(SPFeMerge* merge) : CFilterPrimitive(merge) { + this->spfemerge = merge; +} + +CFeMerge::~CFeMerge() { +} + static void -sp_feMerge_init(SPFeMerge */*feMerge*/) +sp_feMerge_init(SPFeMerge *feMerge) { + feMerge->cfemerge = new CFeMerge(feMerge); + feMerge->cfilterprimitive = feMerge->cfemerge; + feMerge->cobject = feMerge->cfemerge; } /** @@ -86,15 +96,17 @@ 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) -{ +//static void +//sp_feMerge_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ // if (((SPObjectClass *) feMerge_parent_class)->build) { // ((SPObjectClass *) feMerge_parent_class)->build(object, document, repr); // } - // CPPIFY: todo - /*LOAD ATTRIBUTES FROM REPR HERE*/ +//} + +void CFeMerge::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + CFilterPrimitive::onBuild(document, repr); } /** @@ -103,8 +115,13 @@ sp_feMerge_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *re static void sp_feMerge_release(SPObject *object) { - if (((SPObjectClass *) feMerge_parent_class)->release) - ((SPObjectClass *) feMerge_parent_class)->release(object); +// if (((SPObjectClass *) feMerge_parent_class)->release) +// ((SPObjectClass *) feMerge_parent_class)->release(object); + ((SPFeMerge*)object)->cfemerge->onRelease(); +} + +void CFeMerge::onRelease() { + CFilterPrimitive::onRelease(); } /** @@ -113,17 +130,33 @@ sp_feMerge_release(SPObject *object) static void sp_feMerge_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeMerge *feMerge = SP_FEMERGE(object); +// (void)feMerge; +// +// switch(key) { +// /*DEAL WITH SETTING ATTRIBUTES HERE*/ +// default: +// if (((SPObjectClass *) feMerge_parent_class)->set) +// ((SPObjectClass *) feMerge_parent_class)->set(object, key, value); +// break; +// } + ((SPFeMerge*)object)->cfemerge->onSet(key, value); +} + +void CFeMerge::onSet(unsigned int key, gchar const *value) { + SPFeMerge* object = this->spfemerge; + SPFeMerge *feMerge = SP_FEMERGE(object); (void)feMerge; switch(key) { /*DEAL WITH SETTING ATTRIBUTES HERE*/ default: - if (((SPObjectClass *) feMerge_parent_class)->set) - ((SPObjectClass *) feMerge_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feMerge_parent_class)->set) +// ((SPObjectClass *) feMerge_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } - } /** @@ -132,13 +165,27 @@ sp_feMerge_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feMerge_update(SPObject *object, SPCtx *ctx, guint flags) { +// if (flags & SP_OBJECT_MODIFIED_FLAG) { +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); +// } +// +// if (((SPObjectClass *) feMerge_parent_class)->update) { +// ((SPObjectClass *) feMerge_parent_class)->update(object, ctx, flags); +// } + ((SPFeMerge*)object)->cfemerge->onUpdate(ctx, flags); +} + +void CFeMerge::onUpdate(SPCtx *ctx, guint flags) { + SPFeMerge* object = this->spfemerge; + if (flags & SP_OBJECT_MODIFIED_FLAG) { object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } - if (((SPObjectClass *) feMerge_parent_class)->update) { - ((SPObjectClass *) feMerge_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feMerge_parent_class)->update) { +// ((SPObjectClass *) feMerge_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -147,6 +194,24 @@ 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) { +// /* 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); +// } +// +// +// if (((SPObjectClass *) feMerge_parent_class)->write) { +// ((SPObjectClass *) feMerge_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeMerge*)object)->cfemerge->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeMerge::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeMerge* object = this->spfemerge; + /* TODO: Don't just clone, but create a new repr node and write all * relevant values into it. And child nodes, too! */ if (!repr) { @@ -154,14 +219,44 @@ sp_feMerge_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML:: } - if (((SPObjectClass *) feMerge_parent_class)->write) { - ((SPObjectClass *) feMerge_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feMerge_parent_class)->write) { +// ((SPObjectClass *) feMerge_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } static void sp_feMerge_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); +// +// SPObject *input = primitive->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; +// } + ((SPFeMerge*)primitive)->cfemerge->onBuildRenderer(filter); +} + +void CFeMerge::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeMerge* primitive = this->spfemerge; + g_assert(primitive != NULL); g_assert(filter != NULL); diff --git a/src/filters/merge.h b/src/filters/merge.h index 3243073ca..5cb307872 100644 --- a/src/filters/merge.h +++ b/src/filters/merge.h @@ -20,14 +20,37 @@ class SPFeMergeClass; -struct SPFeMerge : public SPFilterPrimitive { - +class CFeMerge; + +class SPFeMerge : public SPFilterPrimitive { +public: + CFeMerge* cfemerge; }; struct SPFeMergeClass { SPFilterPrimitiveClass parent_class; }; +class CFeMerge : public CFilterPrimitive { +public: + CFeMerge(SPFeMerge* merge); + virtual ~CFeMerge(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeMerge* spfemerge; +}; + GType sp_feMerge_get_type(); diff --git a/src/filters/morphology.cpp b/src/filters/morphology.cpp index b84c6e5f1..ad448837a 100644 --- a/src/filters/morphology.cpp +++ b/src/filters/morphology.cpp @@ -77,9 +77,20 @@ sp_feMorphology_class_init(SPFeMorphologyClass *klass) sp_primitive_class->build_renderer = sp_feMorphology_build_renderer; } +CFeMorphology::CFeMorphology(SPFeMorphology* morph) : CFilterPrimitive(morph) { + this->spfemorphology = morph; +} + +CFeMorphology::~CFeMorphology() { +} + static void sp_feMorphology_init(SPFeMorphology *feMorphology) { + feMorphology->cfemorphology = new CFeMorphology(feMorphology); + feMorphology->cfilterprimitive = feMorphology->cfemorphology; + feMorphology->cobject = feMorphology->cfemorphology; + //Setting default values: feMorphology->radius.set("0"); } @@ -89,17 +100,29 @@ 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 *) feMorphology_parent_class)->build) { -// ((SPObjectClass *) feMorphology_parent_class)->build(object, document, repr); -// } - // CPPIFY: todo +//static void +//sp_feMorphology_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ +//// if (((SPObjectClass *) feMorphology_parent_class)->build) { +//// ((SPObjectClass *) feMorphology_parent_class)->build(object, document, repr); +//// } +// +// /*LOAD ATTRIBUTES FROM REPR HERE*/ +// object->readAttr( "operator" ); +// object->readAttr( "radius" ); +//} + +void CFeMorphology::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + // if (((SPObjectClass *) feMorphology_parent_class)->build) { + // ((SPObjectClass *) feMorphology_parent_class)->build(object, document, repr); + // } + CFilterPrimitive::onBuild(document, repr); - /*LOAD ATTRIBUTES FROM REPR HERE*/ - object->readAttr( "operator" ); - object->readAttr( "radius" ); + SPFeMorphology* object = this->spfemorphology; + + /*LOAD ATTRIBUTES FROM REPR HERE*/ + object->readAttr( "operator" ); + object->readAttr( "radius" ); } /** @@ -108,8 +131,13 @@ sp_feMorphology_build(SPObject *object, SPDocument *document, Inkscape::XML::Nod static void sp_feMorphology_release(SPObject *object) { - if (((SPObjectClass *) feMorphology_parent_class)->release) - ((SPObjectClass *) feMorphology_parent_class)->release(object); +// if (((SPObjectClass *) feMorphology_parent_class)->release) +// ((SPObjectClass *) feMorphology_parent_class)->release(object); + ((SPFeMorphology*)object)->cfemorphology->onRelease(); +} + +void CFeMorphology::onRelease() { + CFilterPrimitive::onRelease(); } static Inkscape::Filters::FilterMorphologyOperator sp_feMorphology_read_operator(gchar const *value){ @@ -131,6 +159,38 @@ static Inkscape::Filters::FilterMorphologyOperator sp_feMorphology_read_operator static void sp_feMorphology_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeMorphology *feMorphology = SP_FEMORPHOLOGY(object); +// (void)feMorphology; +// +// 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); +// } +// break; +// case SP_ATTR_RADIUS: +// feMorphology->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); +// break; +// default: +// if (((SPObjectClass *) feMorphology_parent_class)->set) +// ((SPObjectClass *) feMorphology_parent_class)->set(object, key, value); +// break; +// } + + ((SPFeMorphology*)object)->cfemorphology->onSet(key, value); +} + +void CFeMorphology::onSet(unsigned int key, gchar const *value) { + SPFeMorphology* object = this->spfemorphology; + SPFeMorphology *feMorphology = SP_FEMORPHOLOGY(object); (void)feMorphology; @@ -152,8 +212,9 @@ sp_feMorphology_set(SPObject *object, unsigned int key, gchar const *value) object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); break; default: - if (((SPObjectClass *) feMorphology_parent_class)->set) - ((SPObjectClass *) feMorphology_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feMorphology_parent_class)->set) +// ((SPObjectClass *) feMorphology_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } @@ -165,6 +226,22 @@ sp_feMorphology_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feMorphology_update(SPObject *object, 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 *) feMorphology_parent_class)->update) { +// ((SPObjectClass *) feMorphology_parent_class)->update(object, ctx, flags); +// } + ((SPFeMorphology*)object)->cfemorphology->onUpdate(ctx, flags); +} + +void CFeMorphology::onUpdate(SPCtx *ctx, guint flags) { + SPFeMorphology* object = this->spfemorphology; + if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) { @@ -172,9 +249,10 @@ sp_feMorphology_update(SPObject *object, SPCtx *ctx, guint flags) } - if (((SPObjectClass *) feMorphology_parent_class)->update) { - ((SPObjectClass *) feMorphology_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feMorphology_parent_class)->update) { +// ((SPObjectClass *) feMorphology_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -183,20 +261,59 @@ 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) { - /* TODO: Don't just clone, but create a new repr node and write all +// /* 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); +// } +// +// if (((SPObjectClass *) feMorphology_parent_class)->write) { +// ((SPObjectClass *) feMorphology_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeMorphology*)object)->cfemorphology->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeMorphology::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeMorphology* object = this->spfemorphology; + + /* 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); } - if (((SPObjectClass *) feMorphology_parent_class)->write) { - ((SPObjectClass *) feMorphology_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feMorphology_parent_class)->write) { +// ((SPObjectClass *) feMorphology_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } static void sp_feMorphology_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); +// +// nr_morphology->set_operator(sp_morphology->Operator); +// nr_morphology->set_xradius( sp_morphology->radius.getNumber() ); +// nr_morphology->set_yradius( sp_morphology->radius.getOptNumber() ); + ((SPFeMorphology*)primitive)->cfemorphology->onBuildRenderer(filter); +} + +void CFeMorphology::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeMorphology* primitive = this->spfemorphology; + g_assert(primitive != NULL); g_assert(filter != NULL); diff --git a/src/filters/morphology.h b/src/filters/morphology.h index b7005a3d9..4a2e1722c 100644 --- a/src/filters/morphology.h +++ b/src/filters/morphology.h @@ -24,7 +24,12 @@ class SPFeMorphologyClass; -struct SPFeMorphology : public SPFilterPrimitive { +class CFeMorphology; + +class SPFeMorphology : public SPFilterPrimitive { +public: + CFeMorphology* cfemorphology; + Inkscape::Filters::FilterMorphologyOperator Operator; NumberOptNumber radius; }; @@ -33,6 +38,26 @@ struct SPFeMorphologyClass { SPFilterPrimitiveClass parent_class; }; +class CFeMorphology : public CFilterPrimitive { +public: + CFeMorphology(SPFeMorphology* morph); + virtual ~CFeMorphology(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeMorphology* spfemorphology; +}; + GType sp_feMorphology_get_type(); diff --git a/src/filters/offset.cpp b/src/filters/offset.cpp index b1b9bdf5f..a06668f27 100644 --- a/src/filters/offset.cpp +++ b/src/filters/offset.cpp @@ -77,9 +77,20 @@ sp_feOffset_class_init(SPFeOffsetClass *klass) sp_primitive_class->build_renderer = sp_feOffset_build_renderer; } +CFeOffset::CFeOffset(SPFeOffset* offset) : CFilterPrimitive(offset) { + this->spfeoffset = offset; +} + +CFeOffset::~CFeOffset() { +} + static void sp_feOffset_init(SPFeOffset *feOffset) { + feOffset->cfeoffset = new CFeOffset(feOffset); + feOffset->cfilterprimitive = feOffset->cfeoffset; + feOffset->cobject = feOffset->cfeoffset; + feOffset->dx = 0; feOffset->dy = 0; } @@ -89,16 +100,27 @@ 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 *) feOffset_parent_class)->build) { -// ((SPObjectClass *) feOffset_parent_class)->build(object, document, repr); -// } - // CPPIFY: todo +//static void +//sp_feOffset_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ +//// if (((SPObjectClass *) feOffset_parent_class)->build) { +//// ((SPObjectClass *) feOffset_parent_class)->build(object, document, repr); +//// } +// +// object->readAttr( "dx" ); +// object->readAttr( "dy" ); +//} + +void CFeOffset::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + SPFeOffset* object = this->spfeoffset; - object->readAttr( "dx" ); - object->readAttr( "dy" ); + // if (((SPObjectClass *) feOffset_parent_class)->build) { + // ((SPObjectClass *) feOffset_parent_class)->build(object, document, repr); + // } + CFilterPrimitive::onBuild(document, repr); + + object->readAttr( "dx" ); + object->readAttr( "dy" ); } /** @@ -107,8 +129,13 @@ sp_feOffset_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *r static void sp_feOffset_release(SPObject *object) { - if (((SPObjectClass *) feOffset_parent_class)->release) - ((SPObjectClass *) feOffset_parent_class)->release(object); +// if (((SPObjectClass *) feOffset_parent_class)->release) +// ((SPObjectClass *) feOffset_parent_class)->release(object); + ((SPFeOffset*)object)->cfeoffset->onRelease(); +} + +void CFeOffset::onRelease() { + CFilterPrimitive::onRelease(); } /** @@ -117,6 +144,37 @@ sp_feOffset_release(SPObject *object) static void sp_feOffset_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeOffset *feOffset = SP_FEOFFSET(object); +// +// 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); +// } +// 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); +// } +// break; +// +// /*DEAL WITH SETTING ATTRIBUTES HERE*/ +// default: +// if (((SPObjectClass *) feOffset_parent_class)->set) +// ((SPObjectClass *) feOffset_parent_class)->set(object, key, value); +// break; +// } + ((SPFeOffset*)object)->cfeoffset->onSet(key, value); +} + +void CFeOffset::onSet(unsigned int key, gchar const *value) { + SPFeOffset* object = this->spfeoffset; + SPFeOffset *feOffset = SP_FEOFFSET(object); double read_num; @@ -138,11 +196,11 @@ sp_feOffset_set(SPObject *object, unsigned int key, gchar const *value) /*DEAL WITH SETTING ATTRIBUTES HERE*/ default: - if (((SPObjectClass *) feOffset_parent_class)->set) - ((SPObjectClass *) feOffset_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feOffset_parent_class)->set) +// ((SPObjectClass *) feOffset_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } - } /** @@ -151,14 +209,29 @@ sp_feOffset_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feOffset_update(SPObject *object, SPCtx *ctx, guint flags) { +// if (flags & SP_OBJECT_MODIFIED_FLAG) { +// object->readAttr( "dx" ); +// object->readAttr( "dy" ); +// } +// +// if (((SPObjectClass *) feOffset_parent_class)->update) { +// ((SPObjectClass *) feOffset_parent_class)->update(object, ctx, flags); +// } + ((SPFeOffset*)object)->cfeoffset->onUpdate(ctx, flags); +} + +void CFeOffset::onUpdate(SPCtx *ctx, guint flags) { + SPFeOffset* object = this->spfeoffset; + if (flags & SP_OBJECT_MODIFIED_FLAG) { object->readAttr( "dx" ); object->readAttr( "dy" ); } - if (((SPObjectClass *) feOffset_parent_class)->update) { - ((SPObjectClass *) feOffset_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feOffset_parent_class)->update) { +// ((SPObjectClass *) feOffset_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -167,20 +240,58 @@ 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) { +// /* 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); +// } +// +// if (((SPObjectClass *) feOffset_parent_class)->write) { +// ((SPObjectClass *) feOffset_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeOffset*)object)->cfeoffset->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeOffset::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeOffset* object = this->spfeoffset; + /* 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); } - if (((SPObjectClass *) feOffset_parent_class)->write) { - ((SPObjectClass *) feOffset_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feOffset_parent_class)->write) { +// ((SPObjectClass *) feOffset_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } static void sp_feOffset_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); +// +// nr_offset->set_dx(sp_offset->dx); +// nr_offset->set_dy(sp_offset->dy); + ((SPFeOffset*)primitive)->cfeoffset->onBuildRenderer(filter); +} + +void CFeOffset::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeOffset* primitive = this->spfeoffset; + g_assert(primitive != NULL); g_assert(filter != NULL); diff --git a/src/filters/offset.h b/src/filters/offset.h index dba7ed8ef..eec7a7923 100644 --- a/src/filters/offset.h +++ b/src/filters/offset.h @@ -22,7 +22,12 @@ class SPFeOffsetClass; -struct SPFeOffset : public SPFilterPrimitive { +class CFeOffset; + +class SPFeOffset : public SPFilterPrimitive { +public: + CFeOffset* cfeoffset; + double dx, dy; }; @@ -30,6 +35,26 @@ struct SPFeOffsetClass { SPFilterPrimitiveClass parent_class; }; +class CFeOffset : public CFilterPrimitive { +public: + CFeOffset(SPFeOffset* offset); + virtual ~CFeOffset(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeOffset* spfeoffset; +}; + GType sp_feOffset_get_type(); diff --git a/src/filters/specularlighting.cpp b/src/filters/specularlighting.cpp index 4ffecea8a..5214b9310 100644 --- a/src/filters/specularlighting.cpp +++ b/src/filters/specularlighting.cpp @@ -94,9 +94,20 @@ sp_feSpecularLighting_class_init(SPFeSpecularLightingClass *klass) sp_primitive_class->build_renderer = sp_feSpecularLighting_build_renderer; } +CFeSpecularLighting::CFeSpecularLighting(SPFeSpecularLighting* lighting) : CFilterPrimitive(lighting) { + this->spfespecularlighting = lighting; +} + +CFeSpecularLighting::~CFeSpecularLighting() { +} + static void sp_feSpecularLighting_init(SPFeSpecularLighting *feSpecularLighting) { + feSpecularLighting->cfespecularlighting = new CFeSpecularLighting(feSpecularLighting); + feSpecularLighting->cfilterprimitive = feSpecularLighting->cfespecularlighting; + feSpecularLighting->cobject = feSpecularLighting->cfespecularlighting; + feSpecularLighting->surfaceScale = 1; feSpecularLighting->specularConstant = 1; feSpecularLighting->specularExponent = 1; @@ -115,21 +126,37 @@ 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 *) feSpecularLighting_parent_class)->build) { -// ((SPObjectClass *) feSpecularLighting_parent_class)->build(object, document, repr); -// } - // CPPIFY: todo - - /*LOAD ATTRIBUTES FROM REPR HERE*/ - object->readAttr( "surfaceScale" ); - object->readAttr( "specularConstant" ); - object->readAttr( "specularExponent" ); - object->readAttr( "kernelUnitLength" ); - object->readAttr( "lighting-color" ); - +//static void +//sp_feSpecularLighting_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ +//// if (((SPObjectClass *) feSpecularLighting_parent_class)->build) { +//// ((SPObjectClass *) feSpecularLighting_parent_class)->build(object, document, repr); +//// } +// // CPPIFY: todo +// +// /*LOAD ATTRIBUTES FROM REPR HERE*/ +// object->readAttr( "surfaceScale" ); +// object->readAttr( "specularConstant" ); +// object->readAttr( "specularExponent" ); +// object->readAttr( "kernelUnitLength" ); +// object->readAttr( "lighting-color" ); +// +//} + +void CFeSpecularLighting::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + SPFeSpecularLighting* object = this->spfespecularlighting; + + // if (((SPObjectClass *) feSpecularLighting_parent_class)->build) { + // ((SPObjectClass *) feSpecularLighting_parent_class)->build(object, document, repr); + // } + CFilterPrimitive::onBuild(document, repr); + + /*LOAD ATTRIBUTES FROM REPR HERE*/ + object->readAttr( "surfaceScale" ); + object->readAttr( "specularConstant" ); + object->readAttr( "specularExponent" ); + object->readAttr( "kernelUnitLength" ); + object->readAttr( "lighting-color" ); } /** @@ -138,8 +165,13 @@ sp_feSpecularLighting_build(SPObject *object, SPDocument *document, Inkscape::XM static void sp_feSpecularLighting_release(SPObject *object) { - if (((SPObjectClass *) feSpecularLighting_parent_class)->release) - ((SPObjectClass *) feSpecularLighting_parent_class)->release(object); +// if (((SPObjectClass *) feSpecularLighting_parent_class)->release) +// ((SPObjectClass *) feSpecularLighting_parent_class)->release(object); + ((SPFeSpecularLighting*)object)->cfespecularlighting->onRelease(); +} + +void CFeSpecularLighting::onRelease() { + CFilterPrimitive::onRelease(); } /** @@ -148,6 +180,108 @@ sp_feSpecularLighting_release(SPObject *object) static void sp_feSpecularLighting_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeSpecularLighting *feSpecularLighting = SP_FESPECULARLIGHTING(object); +// 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); +// if (end_ptr) { +// feSpecularLighting->surfaceScale_set = TRUE; +// } else { +// g_warning("feSpecularLighting: 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; +// } +// if (feSpecularLighting->renderer) { +// feSpecularLighting->renderer->surfaceScale = feSpecularLighting->surfaceScale; +// } +// object->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; +// } else { +// end_ptr = NULL; +// g_warning("feSpecularLighting: specularConstant should be a positive number ... defaulting to 1"); +// } +// } +// if (!value || !end_ptr) { +// feSpecularLighting->specularConstant = 1; +// feSpecularLighting->specularConstant_set = FALSE; +// } +// if (feSpecularLighting->renderer) { +// feSpecularLighting->renderer->specularConstant = feSpecularLighting->specularConstant; +// } +// object->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; +// } else { +// end_ptr = NULL; +// g_warning("feSpecularLighting: specularExponent should be a number in range [1, 128] ... defaulting to 1"); +// } +// } +// if (!value || !end_ptr) { +// feSpecularLighting->specularExponent = 1; +// feSpecularLighting->specularExponent_set = FALSE; +// } +// if (feSpecularLighting->renderer) { +// feSpecularLighting->renderer->specularExponent = feSpecularLighting->specularExponent; +// } +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); +// break; +// case SP_ATTR_KERNELUNITLENGTH: +// //TODO kernelUnit +// //feSpecularLighting->kernelUnitLength.set(value); +// /*TODOif (feSpecularLighting->renderer) { +// feSpecularLighting->renderer->surfaceScale = feSpecularLighting->renderer; +// } +// */ +// object->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); +// //if a value was read +// if (cend_ptr) { +// feSpecularLighting->lighting_color_set = TRUE; +// } else { +// //lighting_color already contains the default value +// feSpecularLighting->lighting_color_set = FALSE; +// } +// if (feSpecularLighting->renderer) { +// feSpecularLighting->renderer->lighting_color = feSpecularLighting->lighting_color; +// } +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); +// break; +// default: +// if (((SPObjectClass *) feSpecularLighting_parent_class)->set) +// ((SPObjectClass *) feSpecularLighting_parent_class)->set(object, key, value); +// break; +// } + ((SPFeSpecularLighting*)object)->cfespecularlighting->onSet(key, value); +} + +void CFeSpecularLighting::onSet(unsigned int key, gchar const *value) { + SPFeSpecularLighting* object = this->spfespecularlighting; + SPFeSpecularLighting *feSpecularLighting = SP_FESPECULARLIGHTING(object); gchar const *cend_ptr = NULL; gchar *end_ptr = NULL; @@ -240,11 +374,11 @@ sp_feSpecularLighting_set(SPObject *object, unsigned int key, gchar const *value object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); break; default: - if (((SPObjectClass *) feSpecularLighting_parent_class)->set) - ((SPObjectClass *) feSpecularLighting_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feSpecularLighting_parent_class)->set) +// ((SPObjectClass *) feSpecularLighting_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } - } /** @@ -253,6 +387,23 @@ sp_feSpecularLighting_set(SPObject *object, unsigned int key, gchar const *value static void sp_feSpecularLighting_update(SPObject *object, 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" ); +// } +// +// if (((SPObjectClass *) feSpecularLighting_parent_class)->update) { +// ((SPObjectClass *) feSpecularLighting_parent_class)->update(object, ctx, flags); +// } + ((SPFeSpecularLighting*)object)->cfespecularlighting->onUpdate(ctx, flags); +} + +void CFeSpecularLighting::onUpdate(SPCtx *ctx, guint flags) { + SPFeSpecularLighting* object = this->spfespecularlighting; + if (flags & (SP_OBJECT_MODIFIED_FLAG)) { object->readAttr( "surfaceScale" ); object->readAttr( "specularConstant" ); @@ -261,9 +412,10 @@ sp_feSpecularLighting_update(SPObject *object, SPCtx *ctx, guint flags) object->readAttr( "lighting-color" ); } - if (((SPObjectClass *) feSpecularLighting_parent_class)->update) { - ((SPObjectClass *) feSpecularLighting_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feSpecularLighting_parent_class)->update) { +// ((SPObjectClass *) feSpecularLighting_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -272,6 +424,38 @@ sp_feSpecularLighting_update(SPObject *object, SPCtx *ctx, guint flags) static Inkscape::XML::Node * sp_feSpecularLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { +// SPFeSpecularLighting *fespecularlighting = SP_FESPECULARLIGHTING(object); +// +// /* 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 = 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) { +// gchar c[64]; +// sp_svg_write_color(c, sizeof(c), fespecularlighting->lighting_color); +// repr->setAttribute("lighting-color", c); +// } +// if (((SPObjectClass *) feSpecularLighting_parent_class)->write) { +// ((SPObjectClass *) feSpecularLighting_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeSpecularLighting*)object)->cfespecularlighting->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeSpecularLighting::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeSpecularLighting* object = this->spfespecularlighting; + SPFeSpecularLighting *fespecularlighting = SP_FESPECULARLIGHTING(object); /* TODO: Don't just clone, but create a new repr node and write all @@ -293,9 +477,10 @@ sp_feSpecularLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inks sp_svg_write_color(c, sizeof(c), fespecularlighting->lighting_color); repr->setAttribute("lighting-color", c); } - if (((SPObjectClass *) feSpecularLighting_parent_class)->write) { - ((SPObjectClass *) feSpecularLighting_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feSpecularLighting_parent_class)->write) { +// ((SPObjectClass *) feSpecularLighting_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } @@ -306,15 +491,28 @@ sp_feSpecularLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inks static void sp_feSpecularLighting_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { +// SPFeSpecularLighting *f = SP_FESPECULARLIGHTING(object); +// +// if (((SPObjectClass *) feSpecularLighting_parent_class)->child_added) +// (* ((SPObjectClass *) feSpecularLighting_parent_class)->child_added)(object, child, ref); +// +// sp_feSpecularLighting_children_modified(f); +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + ((SPFeSpecularLighting*)object)->cfespecularlighting->onChildAdded(child, ref); +} + +void CFeSpecularLighting::onChildAdded(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { + SPFeSpecularLighting* object = this->spfespecularlighting; + SPFeSpecularLighting *f = SP_FESPECULARLIGHTING(object); - if (((SPObjectClass *) feSpecularLighting_parent_class)->child_added) - (* ((SPObjectClass *) feSpecularLighting_parent_class)->child_added)(object, child, ref); +// if (((SPObjectClass *) feSpecularLighting_parent_class)->child_added) +// (* ((SPObjectClass *) feSpecularLighting_parent_class)->child_added)(object, child, ref); + CFilterPrimitive::onChildAdded(child, ref); sp_feSpecularLighting_children_modified(f); object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } - /** * Callback for remove_child event. @@ -322,10 +520,24 @@ sp_feSpecularLighting_child_added(SPObject *object, Inkscape::XML::Node *child, static void sp_feSpecularLighting_remove_child(SPObject *object, Inkscape::XML::Node *child) { +// SPFeSpecularLighting *f = SP_FESPECULARLIGHTING(object); +// +// if (((SPObjectClass *) feSpecularLighting_parent_class)->remove_child) +// (* ((SPObjectClass *) feSpecularLighting_parent_class)->remove_child)(object, child); +// +// sp_feSpecularLighting_children_modified(f); +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + ((SPFeSpecularLighting*)object)->cfespecularlighting->onRemoveChild(child); +} + +void CFeSpecularLighting::onRemoveChild(Inkscape::XML::Node *child) { + SPFeSpecularLighting* object = this->spfespecularlighting; + SPFeSpecularLighting *f = SP_FESPECULARLIGHTING(object); - if (((SPObjectClass *) feSpecularLighting_parent_class)->remove_child) - (* ((SPObjectClass *) feSpecularLighting_parent_class)->remove_child)(object, child); +// if (((SPObjectClass *) feSpecularLighting_parent_class)->remove_child) +// (* ((SPObjectClass *) feSpecularLighting_parent_class)->remove_child)(object, child); + CFilterPrimitive::onRemoveChild(child); sp_feSpecularLighting_children_modified(f); object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -334,9 +546,22 @@ 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) { +// SPFeSpecularLighting *f = SP_FESPECULARLIGHTING(object); +// if (((SPObjectClass *) (feSpecularLighting_parent_class))->order_changed) +// (* ((SPObjectClass *) (feSpecularLighting_parent_class))->order_changed) (object, child, old_ref, new_ref); +// +// sp_feSpecularLighting_children_modified(f); +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + ((SPFeSpecularLighting*)object)->cfespecularlighting->onOrderChanged(child, old_ref, new_ref); +} + +void CFeSpecularLighting::onOrderChanged(Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref) { + SPFeSpecularLighting* object = this->spfespecularlighting; + SPFeSpecularLighting *f = SP_FESPECULARLIGHTING(object); - if (((SPObjectClass *) (feSpecularLighting_parent_class))->order_changed) - (* ((SPObjectClass *) (feSpecularLighting_parent_class))->order_changed) (object, child, old_ref, new_ref); +// if (((SPObjectClass *) (feSpecularLighting_parent_class))->order_changed) +// (* ((SPObjectClass *) (feSpecularLighting_parent_class))->order_changed) (object, child, old_ref, new_ref); + CFilterPrimitive::onOrderChanged(child, old_ref, new_ref); sp_feSpecularLighting_children_modified(f); object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -362,6 +587,46 @@ static void sp_feSpecularLighting_children_modified(SPFeSpecularLighting *sp_spe } static void sp_feSpecularLighting_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); +// +// 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; +// //We assume there is at most one child +// nr_specularlighting->light_type = Inkscape::Filters::NO_LIGHT; +// if (SP_IS_FEDISTANTLIGHT(primitive->children)) { +// nr_specularlighting->light_type = Inkscape::Filters::DISTANT_LIGHT; +// nr_specularlighting->light.distant = SP_FEDISTANTLIGHT(primitive->children); +// } +// if (SP_IS_FEPOINTLIGHT(primitive->children)) { +// nr_specularlighting->light_type = Inkscape::Filters::POINT_LIGHT; +// nr_specularlighting->light.point = SP_FEPOINTLIGHT(primitive->children); +// } +// if (SP_IS_FESPOTLIGHT(primitive->children)) { +// nr_specularlighting->light_type = Inkscape::Filters::SPOT_LIGHT; +// nr_specularlighting->light.spot = SP_FESPOTLIGHT(primitive->children); +// } +// +// //nr_offset->set_dx(sp_offset->dx); +// //nr_offset->set_dy(sp_offset->dy); + ((SPFeSpecularLighting*)primitive)->cfespecularlighting->onBuildRenderer(filter); +} + +void CFeSpecularLighting::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeSpecularLighting* primitive = this->spfespecularlighting; + g_assert(primitive != NULL); g_assert(filter != NULL); diff --git a/src/filters/specularlighting.h b/src/filters/specularlighting.h index 90d1f9f62..639f2b0f7 100644 --- a/src/filters/specularlighting.h +++ b/src/filters/specularlighting.h @@ -31,7 +31,12 @@ class FilterSpecularLighting; class SPFeSpecularLightingClass; -struct SPFeSpecularLighting : public SPFilterPrimitive { +class CFeSpecularLighting; + +class SPFeSpecularLighting : public SPFilterPrimitive { +public: + CFeSpecularLighting* cfespecularlighting; + gfloat surfaceScale; guint surfaceScale_set : 1; gfloat specularConstant; @@ -49,6 +54,31 @@ struct SPFeSpecularLightingClass { SPFilterPrimitiveClass parent_class; }; +class CFeSpecularLighting : public CFilterPrimitive { +public: + CFeSpecularLighting(SPFeSpecularLighting* lighting); + virtual ~CFeSpecularLighting(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onChildAdded(Inkscape::XML::Node* child, Inkscape::XML::Node* ref); + virtual void onRemoveChild(Inkscape::XML::Node* child); + + virtual void onOrderChanged(Inkscape::XML::Node* child, Inkscape::XML::Node* old_repr, Inkscape::XML::Node* new_repr); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeSpecularLighting* spfespecularlighting; +}; + GType sp_feSpecularLighting_get_type(); diff --git a/src/filters/tile.cpp b/src/filters/tile.cpp index 19c1c5e58..83141bd8c 100644 --- a/src/filters/tile.cpp +++ b/src/filters/tile.cpp @@ -73,9 +73,19 @@ sp_feTile_class_init(SPFeTileClass *klass) sp_primitive_class->build_renderer = sp_feTile_build_renderer; } +CFeTile::CFeTile(SPFeTile* tile) : CFilterPrimitive(tile) { + this->spfetile = tile; +} + +CFeTile::~CFeTile() { +} + static void -sp_feTile_init(SPFeTile */*feTile*/) +sp_feTile_init(SPFeTile *feTile) { + feTile->cfetile = new CFeTile(feTile); + feTile->cfilterprimitive = feTile->cfetile; + feTile->cobject = feTile->cfetile; } /** @@ -83,15 +93,18 @@ 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) -{ +//static void +//sp_feTile_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ // if (((SPObjectClass *) feTile_parent_class)->build) { // ((SPObjectClass *) feTile_parent_class)->build(object, document, repr); // } - // CPPIFY: todo - +// /*LOAD ATTRIBUTES FROM REPR HERE*/ +//} + +void CFeTile::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + CFilterPrimitive::onBuild(document, repr); } /** @@ -100,8 +113,13 @@ sp_feTile_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *rep static void sp_feTile_release(SPObject *object) { - if (((SPObjectClass *) feTile_parent_class)->release) - ((SPObjectClass *) feTile_parent_class)->release(object); +// if (((SPObjectClass *) feTile_parent_class)->release) +// ((SPObjectClass *) feTile_parent_class)->release(object); + ((SPFeTile*)object)->cfetile->onRelease(); +} + +void CFeTile::onRelease() { + CFilterPrimitive::onRelease(); } /** @@ -110,17 +128,34 @@ sp_feTile_release(SPObject *object) static void sp_feTile_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeTile *feTile = SP_FETILE(object); +// (void)feTile; +// +// switch(key) { +// /*DEAL WITH SETTING ATTRIBUTES HERE*/ +// default: +// if (((SPObjectClass *) feTile_parent_class)->set) +// ((SPObjectClass *) feTile_parent_class)->set(object, key, value); +// break; +// } + + ((SPFeTile*)object)->cfetile->onSet(key, value); +} + +void CFeTile::onSet(unsigned int key, gchar const *value) { + SPFeTile* object = this->spfetile; + SPFeTile *feTile = SP_FETILE(object); (void)feTile; switch(key) { /*DEAL WITH SETTING ATTRIBUTES HERE*/ default: - if (((SPObjectClass *) feTile_parent_class)->set) - ((SPObjectClass *) feTile_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feTile_parent_class)->set) +// ((SPObjectClass *) feTile_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } - } /** @@ -129,6 +164,22 @@ sp_feTile_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feTile_update(SPObject *object, 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 *) feTile_parent_class)->update) { +// ((SPObjectClass *) feTile_parent_class)->update(object, ctx, flags); +// } + ((SPFeTile*)object)->cfetile->onUpdate(ctx, flags); +} + +void CFeTile::onUpdate(SPCtx *ctx, guint flags) { + SPFeTile* object = this->spfetile; + if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) { @@ -136,9 +187,10 @@ sp_feTile_update(SPObject *object, SPCtx *ctx, guint flags) } - if (((SPObjectClass *) feTile_parent_class)->update) { - ((SPObjectClass *) feTile_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feTile_parent_class)->update) { +// ((SPObjectClass *) feTile_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -147,20 +199,57 @@ 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) { +// /* 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); +// } +// +// if (((SPObjectClass *) feTile_parent_class)->write) { +// ((SPObjectClass *) feTile_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFeTile*)object)->cfetile->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeTile::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeTile* object = this->spfetile; + /* 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); } - if (((SPObjectClass *) feTile_parent_class)->write) { - ((SPObjectClass *) feTile_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feTile_parent_class)->write) { +// ((SPObjectClass *) feTile_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); return repr; } + static void sp_feTile_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); + ((SPFeTile*)primitive)->cfetile->onBuildRenderer(filter); +} + +void CFeTile::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeTile* primitive = this->spfetile; + g_assert(primitive != NULL); g_assert(filter != NULL); diff --git a/src/filters/tile.h b/src/filters/tile.h index a376a6e10..888177b54 100644 --- a/src/filters/tile.h +++ b/src/filters/tile.h @@ -23,14 +23,37 @@ /* FeTile base class */ class SPFeTileClass; -struct SPFeTile : public SPFilterPrimitive { - +class CFeTile; + +class SPFeTile : public SPFilterPrimitive { +public: + CFeTile* cfetile; }; struct SPFeTileClass { SPFilterPrimitiveClass parent_class; }; +class CFeTile : public CFilterPrimitive { +public: + CFeTile(SPFeTile* tile); + virtual ~CFeTile(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeTile* spfetile; +}; + GType sp_feTile_get_type(); #endif /* !SP_FETILE_H_SEEN */ diff --git a/src/filters/turbulence.cpp b/src/filters/turbulence.cpp index 8d1041bab..416e6bfc1 100644 --- a/src/filters/turbulence.cpp +++ b/src/filters/turbulence.cpp @@ -80,9 +80,20 @@ sp_feTurbulence_class_init(SPFeTurbulenceClass *klass) sp_primitive_class->build_renderer = sp_feTurbulence_build_renderer; } +CFeTurbulence::CFeTurbulence(SPFeTurbulence* turb) : CFilterPrimitive(turb) { + this->spfeturbulence = turb; +} + +CFeTurbulence::~CFeTurbulence() { +} + static void sp_feTurbulence_init(SPFeTurbulence *feTurbulence) { + feTurbulence->cfeturbulence = new CFeTurbulence(feTurbulence); + feTurbulence->cfilterprimitive = feTurbulence->cfeturbulence; + feTurbulence->cobject = feTurbulence->cfeturbulence; + feTurbulence->updated=false; } @@ -91,20 +102,35 @@ 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 *) feTurbulence_parent_class)->build) { -// ((SPObjectClass *) feTurbulence_parent_class)->build(object, document, repr); -// } - // CPPIFY: todo - - /*LOAD ATTRIBUTES FROM REPR HERE*/ - object->readAttr( "baseFrequency" ); - object->readAttr( "numOctaves" ); - object->readAttr( "seed" ); - object->readAttr( "stitchTiles" ); - object->readAttr( "type" ); +//static void +//sp_feTurbulence_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ +//// if (((SPObjectClass *) feTurbulence_parent_class)->build) { +//// ((SPObjectClass *) 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 CFeTurbulence::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + SPFeTurbulence* object = this->spfeturbulence; + + // if (((SPObjectClass *) feTurbulence_parent_class)->build) { + // ((SPObjectClass *) feTurbulence_parent_class)->build(object, document, repr); + // } + CFilterPrimitive::onBuild(document, repr); + + /*LOAD ATTRIBUTES FROM REPR HERE*/ + object->readAttr( "baseFrequency" ); + object->readAttr( "numOctaves" ); + object->readAttr( "seed" ); + object->readAttr( "stitchTiles" ); + object->readAttr( "type" ); } /** @@ -113,8 +139,13 @@ sp_feTurbulence_build(SPObject *object, SPDocument *document, Inkscape::XML::Nod static void sp_feTurbulence_release(SPObject *object) { - if (((SPObjectClass *) feTurbulence_parent_class)->release) - ((SPObjectClass *) feTurbulence_parent_class)->release(object); +// if (((SPObjectClass *) feTurbulence_parent_class)->release) +// ((SPObjectClass *) feTurbulence_parent_class)->release(object); + ((SPFeTurbulence*)object)->cfeturbulence->onRelease(); +} + +void CFeTurbulence::onRelease() { + CFilterPrimitive::onRelease(); } static bool sp_feTurbulence_read_stitchTiles(gchar const *value){ @@ -149,6 +180,69 @@ static Inkscape::Filters::FilterTurbulenceType sp_feTurbulence_read_type(gchar c static void sp_feTurbulence_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFeTurbulence *feTurbulence = SP_FETURBULENCE(object); +// (void)feTurbulence; +// +// int read_int; +// double read_num; +// bool read_bool; +// Inkscape::Filters::FilterTurbulenceType read_type; +// +// 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); +// 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); +// } +// 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); +// } +// 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); +// } +// 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); +// } +// break; +// default: +// if (((SPObjectClass *) feTurbulence_parent_class)->set) +// ((SPObjectClass *) feTurbulence_parent_class)->set(object, key, value); +// break; +// } + + ((SPFeTurbulence*)object)->cfeturbulence->onSet(key, value); +} + +void CFeTurbulence::onSet(unsigned int key, gchar const *value) { + SPFeTurbulence* object = this->spfeturbulence; + SPFeTurbulence *feTurbulence = SP_FETURBULENCE(object); (void)feTurbulence; @@ -201,11 +295,11 @@ sp_feTurbulence_set(SPObject *object, unsigned int key, gchar const *value) } break; default: - if (((SPObjectClass *) feTurbulence_parent_class)->set) - ((SPObjectClass *) feTurbulence_parent_class)->set(object, key, value); +// if (((SPObjectClass *) feTurbulence_parent_class)->set) +// ((SPObjectClass *) feTurbulence_parent_class)->set(object, key, value); + CFilterPrimitive::onSet(key, value); break; } - } /** @@ -214,6 +308,22 @@ sp_feTurbulence_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feTurbulence_update(SPObject *object, 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 *) feTurbulence_parent_class)->update) { +// ((SPObjectClass *) feTurbulence_parent_class)->update(object, ctx, flags); +// } + ((SPFeTurbulence*)object)->cfeturbulence->onUpdate(ctx, flags); +} + +void CFeTurbulence::onUpdate(SPCtx *ctx, guint flags) { + SPFeTurbulence* object = this->spfeturbulence; + if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) { @@ -221,9 +331,10 @@ sp_feTurbulence_update(SPObject *object, SPCtx *ctx, guint flags) } - if (((SPObjectClass *) feTurbulence_parent_class)->update) { - ((SPObjectClass *) feTurbulence_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) feTurbulence_parent_class)->update) { +// ((SPObjectClass *) feTurbulence_parent_class)->update(object, ctx, flags); +// } + CFilterPrimitive::onUpdate(ctx, flags); } /** @@ -232,15 +343,36 @@ 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) { +// /* 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); +// } +// +// if (((SPObjectClass *) feTurbulence_parent_class)->write) { +// ((SPObjectClass *) feTurbulence_parent_class)->write(object, doc, repr, flags); +// } +// +// /* turbulence doesn't take input */ +// repr->setAttribute("in", 0); +// +// return repr; + return ((SPFeTurbulence*)object)->cfeturbulence->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFeTurbulence::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFeTurbulence* object = this->spfeturbulence; + /* 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); } - if (((SPObjectClass *) feTurbulence_parent_class)->write) { - ((SPObjectClass *) feTurbulence_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) feTurbulence_parent_class)->write) { +// ((SPObjectClass *) feTurbulence_parent_class)->write(object, doc, repr, flags); +// } + CFilterPrimitive::onWrite(doc, repr, flags); /* turbulence doesn't take input */ repr->setAttribute("in", 0); @@ -249,6 +381,31 @@ sp_feTurbulence_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape:: } static void sp_feTurbulence_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { +// g_assert(primitive != 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); +// +// 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); + ((SPFeTurbulence*)primitive)->cfeturbulence->onBuildRenderer(filter); +} + +void CFeTurbulence::onBuildRenderer(Inkscape::Filters::Filter* filter) { + SPFeTurbulence* primitive = this->spfeturbulence; + g_assert(primitive != NULL); g_assert(filter != NULL); diff --git a/src/filters/turbulence.h b/src/filters/turbulence.h index cbc4fb082..a700975c1 100644 --- a/src/filters/turbulence.h +++ b/src/filters/turbulence.h @@ -26,7 +26,12 @@ /* FeTurbulence base class */ class SPFeTurbulenceClass; -struct SPFeTurbulence : public SPFilterPrimitive { +class CFeTurbulence; + +class SPFeTurbulence : public SPFilterPrimitive { +public: + CFeTurbulence* cfeturbulence; + /** TURBULENCE ATTRIBUTES HERE */ NumberOptNumber baseFrequency; int numOctaves; @@ -41,6 +46,26 @@ struct SPFeTurbulenceClass { SPFilterPrimitiveClass parent_class; }; +class CFeTurbulence : public CFilterPrimitive { +public: + CFeTurbulence(SPFeTurbulence* turb); + virtual ~CFeTurbulence(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFeTurbulence* spfeturbulence; +}; + GType sp_feTurbulence_get_type(); diff --git a/src/sp-filter-primitive.cpp b/src/sp-filter-primitive.cpp index 6d36aaa45..b3926a695 100644 --- a/src/sp-filter-primitive.cpp +++ b/src/sp-filter-primitive.cpp @@ -76,8 +76,24 @@ static void sp_filter_primitive_class_init(SPFilterPrimitiveClass *klass) klass->build_renderer = NULL; } +CFilterPrimitive::CFilterPrimitive(SPFilterPrimitive* fp) : CObject(fp) { + this->spfilterprimitive = fp; +} + +CFilterPrimitive::~CFilterPrimitive() { +} + +// CPPIFY: Make pure virtual. +void CFilterPrimitive::onBuildRenderer(Inkscape::Filters::Filter* filter) { + // throw; +} + + static void sp_filter_primitive_init(SPFilterPrimitive *filter_primitive) { + filter_primitive->cfilterprimitive = new CFilterPrimitive(filter_primitive); + filter_primitive->cobject = filter_primitive->cfilterprimitive; + filter_primitive->image_in = Inkscape::Filters::NR_FILTER_SLOT_NOT_SET; filter_primitive->image_out = Inkscape::Filters::NR_FILTER_SLOT_NOT_SET; @@ -97,20 +113,35 @@ static void sp_filter_primitive_init(SPFilterPrimitive *filter_primitive) * 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_filter_primitive_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) -{ +//static void +//sp_filter_primitive_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +//{ // if ((static_cast<SPObjectClass *>(filter_primitive_parent_class))->build) { // (static_cast<SPObjectClass *>(filter_primitive_parent_class))->build(object, document, repr); // } - // CPPIFY: todo - - object->readAttr( "in" ); - object->readAttr( "result" ); - object->readAttr( "x" ); - object->readAttr( "y" ); - object->readAttr( "width" ); - object->readAttr( "height" ); +// +// object->readAttr( "in" ); +// object->readAttr( "result" ); +// object->readAttr( "x" ); +// object->readAttr( "y" ); +// object->readAttr( "width" ); +// object->readAttr( "height" ); +//} + +void CFilterPrimitive::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + SPFilterPrimitive* object = this->spfilterprimitive; + + // if ((static_cast<SPObjectClass *>(filter_primitive_parent_class))->build) { + // (static_cast<SPObjectClass *>(filter_primitive_parent_class))->build(object, document, repr); + // } + CObject::onBuild(document, repr); + + object->readAttr( "in" ); + object->readAttr( "result" ); + object->readAttr( "x" ); + object->readAttr( "y" ); + object->readAttr( "width" ); + object->readAttr( "height" ); } /** @@ -118,9 +149,14 @@ sp_filter_primitive_build(SPObject *object, SPDocument *document, Inkscape::XML: */ static void sp_filter_primitive_release(SPObject *object) { - /* deal with our children and our selves here */ - if ((static_cast<SPObjectClass *>(filter_primitive_parent_class))->release) - (static_cast<SPObjectClass *>(filter_primitive_parent_class))->release(object); +// /* deal with our children and our selves here */ +// if ((static_cast<SPObjectClass *>(filter_primitive_parent_class))->release) +// (static_cast<SPObjectClass *>(filter_primitive_parent_class))->release(object); + ((SPFilterPrimitive*)object)->cfilterprimitive->onRelease(); +} + +void CFilterPrimitive::onRelease() { + CObject::onRelease(); } /** @@ -129,6 +165,62 @@ static void sp_filter_primitive_release(SPObject *object) static void sp_filter_primitive_set(SPObject *object, unsigned int key, gchar const *value) { +// SPFilterPrimitive *filter_primitive = SP_FILTER_PRIMITIVE(object); +// (void)filter_primitive; +// int image_nr; +// switch (key) { +// case SP_ATTR_IN: +// if (value) { +// image_nr = sp_filter_primitive_read_in(filter_primitive, value); +// } else { +// image_nr = Inkscape::Filters::NR_FILTER_SLOT_NOT_SET; +// } +// if (image_nr != filter_primitive->image_in) { +// filter_primitive->image_in = image_nr; +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); +// } +// break; +// case SP_ATTR_RESULT: +// if (value) { +// image_nr = sp_filter_primitive_read_result(filter_primitive, value); +// } else { +// image_nr = Inkscape::Filters::NR_FILTER_SLOT_NOT_SET; +// } +// if (image_nr != filter_primitive->image_out) { +// filter_primitive->image_out = image_nr; +// object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); +// } +// break; +// +// /* Filter primitive sub-region */ +// case SP_ATTR_X: +// filter_primitive->x.readOrUnset(value); +// object->requestModified(SP_OBJECT_MODIFIED_FLAG); +// break; +// case SP_ATTR_Y: +// filter_primitive->y.readOrUnset(value); +// object->requestModified(SP_OBJECT_MODIFIED_FLAG); +// break; +// case SP_ATTR_WIDTH: +// filter_primitive->width.readOrUnset(value); +// object->requestModified(SP_OBJECT_MODIFIED_FLAG); +// break; +// case SP_ATTR_HEIGHT: +// filter_primitive->height.readOrUnset(value); +// object->requestModified(SP_OBJECT_MODIFIED_FLAG); +// break; +// } +// +// /* See if any parents need this value. */ +// if (((SPObjectClass *) filter_primitive_parent_class)->set) { +// ((SPObjectClass *) filter_primitive_parent_class)->set(object, key, value); +// } + ((SPFilterPrimitive*)object)->cfilterprimitive->onSet(key, value); +} + +void CFilterPrimitive::onSet(unsigned int key, gchar const *value) { + SPFilterPrimitive* object = this->spfilterprimitive; + SPFilterPrimitive *filter_primitive = SP_FILTER_PRIMITIVE(object); (void)filter_primitive; int image_nr; @@ -176,9 +268,10 @@ sp_filter_primitive_set(SPObject *object, unsigned int key, gchar const *value) } /* See if any parents need this value. */ - if (((SPObjectClass *) filter_primitive_parent_class)->set) { - ((SPObjectClass *) filter_primitive_parent_class)->set(object, key, value); - } +// if (((SPObjectClass *) filter_primitive_parent_class)->set) { +// ((SPObjectClass *) filter_primitive_parent_class)->set(object, key, value); +// } + CObject::onSet(key, value); } /** @@ -187,6 +280,26 @@ sp_filter_primitive_set(SPObject *object, unsigned int key, gchar const *value) static void sp_filter_primitive_update(SPObject *object, SPCtx *ctx, guint flags) { +// //SPFilterPrimitive *filter_primitive = SP_FILTER_PRIMITIVE(object); +// +// if (flags & SP_OBJECT_MODIFIED_FLAG) { +// object->readAttr( "in" ); +// object->readAttr( "result" ); +// object->readAttr( "x" ); +// object->readAttr( "y" ); +// object->readAttr( "width" ); +// object->readAttr( "height" ); +// } +// +// if (((SPObjectClass *) filter_primitive_parent_class)->update) { +// ((SPObjectClass *) filter_primitive_parent_class)->update(object, ctx, flags); +// } + ((SPFilterPrimitive*)object)->cfilterprimitive->onUpdate(ctx, flags); +} + +void CFilterPrimitive::onUpdate(SPCtx *ctx, guint flags) { + SPFilterPrimitive* object = this->spfilterprimitive; + //SPFilterPrimitive *filter_primitive = SP_FILTER_PRIMITIVE(object); if (flags & SP_OBJECT_MODIFIED_FLAG) { @@ -198,9 +311,10 @@ sp_filter_primitive_update(SPObject *object, SPCtx *ctx, guint flags) object->readAttr( "height" ); } - if (((SPObjectClass *) filter_primitive_parent_class)->update) { - ((SPObjectClass *) filter_primitive_parent_class)->update(object, ctx, flags); - } +// if (((SPObjectClass *) filter_primitive_parent_class)->update) { +// ((SPObjectClass *) filter_primitive_parent_class)->update(object, ctx, flags); +// } + CObject::onUpdate(ctx, flags); } /** @@ -209,6 +323,31 @@ sp_filter_primitive_update(SPObject *object, SPCtx *ctx, guint flags) static Inkscape::XML::Node * sp_filter_primitive_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { +// SPFilterPrimitive *prim = SP_FILTER_PRIMITIVE(object); +// SPFilter *parent = SP_FILTER(object->parent); +// +// if (!repr) { +// repr = object->getRepr()->duplicate(doc); +// } +// +// gchar const *in_name = sp_filter_name_for_image(parent, prim->image_in); +// repr->setAttribute("in", in_name); +// +// gchar const *out_name = sp_filter_name_for_image(parent, prim->image_out); +// repr->setAttribute("result", out_name); +// +// /* Do we need to add x,y,width,height? */ +// if (((SPObjectClass *) filter_primitive_parent_class)->write) { +// ((SPObjectClass *) filter_primitive_parent_class)->write(object, doc, repr, flags); +// } +// +// return repr; + return ((SPFilterPrimitive*)object)->cfilterprimitive->onWrite(doc, repr, flags); +} + +Inkscape::XML::Node* CFilterPrimitive::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPFilterPrimitive* object = this->spfilterprimitive; + SPFilterPrimitive *prim = SP_FILTER_PRIMITIVE(object); SPFilter *parent = SP_FILTER(object->parent); @@ -223,9 +362,10 @@ sp_filter_primitive_write(SPObject *object, Inkscape::XML::Document *doc, Inksca repr->setAttribute("result", out_name); /* Do we need to add x,y,width,height? */ - if (((SPObjectClass *) filter_primitive_parent_class)->write) { - ((SPObjectClass *) filter_primitive_parent_class)->write(object, doc, repr, flags); - } +// if (((SPObjectClass *) filter_primitive_parent_class)->write) { +// ((SPObjectClass *) filter_primitive_parent_class)->write(object, doc, repr, flags); +// } + CObject::onWrite(doc, repr, flags); return repr; } diff --git a/src/sp-filter-primitive.h b/src/sp-filter-primitive.h index 60104047e..38fd566f7 100644 --- a/src/sp-filter-primitive.h +++ b/src/sp-filter-primitive.h @@ -31,8 +31,12 @@ class Filter; class FilterPrimitive; } } +class CFilterPrimitive; + +class SPFilterPrimitive : public SPObject { +public: + CFilterPrimitive* cfilterprimitive; -struct SPFilterPrimitive : public SPObject { int image_in, image_out; /* filter primitive subregion */ @@ -44,6 +48,27 @@ struct SPFilterPrimitiveClass { void (* build_renderer)(SPFilterPrimitive*, Inkscape::Filters::Filter*); }; +class CFilterPrimitive : public CObject { +public: + CFilterPrimitive(SPFilterPrimitive* fp); + virtual ~CFilterPrimitive(); + + virtual void onBuild(SPDocument* doc, Inkscape::XML::Node* repr); + virtual void onRelease(); + + virtual void onSet(unsigned int key, const gchar* value); + + virtual void onUpdate(SPCtx* ctx, unsigned int flags); + + virtual Inkscape::XML::Node* onWrite(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags); + + virtual void onBuildRenderer(Inkscape::Filters::Filter* filter); + +private: + SPFilterPrimitive* spfilterprimitive; +}; + + GType sp_filter_primitive_get_type (void); /* Common initialization for filter primitives */ |
