summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarkus Engel <markus.engel@tum.de>2013-03-29 23:46:23 +0000
committerMarkus Engel <markus.engel@tum.de>2013-03-29 23:46:23 +0000
commitcbee151d9455d50fc58b1c5b82383dcd85ec7278 (patch)
treecbf3941db66091d35d6079135c40f9eb5941a37f /src
parentAdded "virtual pads" for (diff)
downloadinkscape-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')
-rw-r--r--src/filters/blend.cpp202
-rw-r--r--src/filters/blend.h28
-rw-r--r--src/filters/colormatrix.cpp160
-rw-r--r--src/filters/colormatrix.h27
-rw-r--r--src/filters/componenttransfer.cpp186
-rw-r--r--src/filters/componenttransfer.h31
-rw-r--r--src/filters/composite.cpp313
-rw-r--r--src/filters/composite.h27
-rw-r--r--src/filters/convolvematrix.cpp280
-rw-r--r--src/filters/convolvematrix.h27
-rw-r--r--src/filters/diffuselighting.cpp314
-rw-r--r--src/filters/diffuselighting.h32
-rw-r--r--src/filters/displacementmap.cpp248
-rw-r--r--src/filters/displacementmap.h27
-rw-r--r--src/filters/flood.cpp197
-rw-r--r--src/filters/flood.h27
-rw-r--r--src/filters/gaussian-blur.cpp130
-rw-r--r--src/filters/gaussian-blur.h27
-rw-r--r--src/filters/image.cpp242
-rw-r--r--src/filters/image.h27
-rw-r--r--src/filters/merge.cpp129
-rw-r--r--src/filters/merge.h27
-rw-r--r--src/filters/morphology.cpp159
-rw-r--r--src/filters/morphology.h27
-rw-r--r--src/filters/offset.cpp151
-rw-r--r--src/filters/offset.h27
-rw-r--r--src/filters/specularlighting.cpp331
-rw-r--r--src/filters/specularlighting.h32
-rw-r--r--src/filters/tile.cpp123
-rw-r--r--src/filters/tile.h27
-rw-r--r--src/filters/turbulence.cpp207
-rw-r--r--src/filters/turbulence.h27
-rw-r--r--src/sp-filter-primitive.cpp186
-rw-r--r--src/sp-filter-primitive.h27
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 */