summaryrefslogtreecommitdiffstats
path: root/src/sp-filter-primitive.cpp
diff options
context:
space:
mode:
authorTavmjong Bah <tavmjong@free.fr>2011-03-11 15:59:38 +0000
committertavmjong-free <tavmjong@free.fr>2011-03-11 15:59:38 +0000
commit2c93e5fb2d1d7c8bfc72bc11826069686a67b113 (patch)
treea193cb9811010724fc8a5c3a296a521a8304929e /src/sp-filter-primitive.cpp
parentComment out non-functional code that prevents compiling (diff)
downloadinkscape-2c93e5fb2d1d7c8bfc72bc11826069686a67b113.tar.gz
inkscape-2c93e5fb2d1d7c8bfc72bc11826069686a67b113.zip
Add handling filter primitive subregion to filter primitive classes.
More correct handling of image placement in feImage filter primitive. (bzr r10092)
Diffstat (limited to 'src/sp-filter-primitive.cpp')
-rw-r--r--src/sp-filter-primitive.cpp39
1 files changed, 38 insertions, 1 deletions
diff --git a/src/sp-filter-primitive.cpp b/src/sp-filter-primitive.cpp
index 87f96fb90..c186c7fd9 100644
--- a/src/sp-filter-primitive.cpp
+++ b/src/sp-filter-primitive.cpp
@@ -84,6 +84,16 @@ sp_filter_primitive_init(SPFilterPrimitive *filter_primitive)
{
filter_primitive->image_in = Inkscape::Filters::NR_FILTER_SLOT_NOT_SET;
filter_primitive->image_out = Inkscape::Filters::NR_FILTER_SLOT_NOT_SET;
+
+ // We must keep track if a value is set or not, if not set then the region defaults to 0%, 0%,
+ // 100%, 100% ("x", "y", "width", "height") of the -> filter <- region. If set then
+ // percentages are in terms of bounding box or viewbox, depending on value of "primitiveUnits"
+
+ // NB: SVGLength.set takes prescaled percent values: 1 means 100%
+ filter_primitive->x.unset(SVGLength::PERCENT, 0, 0);
+ filter_primitive->y.unset(SVGLength::PERCENT, 0, 0);
+ filter_primitive->width.unset(SVGLength::PERCENT, 1, 0);
+ filter_primitive->height.unset(SVGLength::PERCENT, 1, 0);
}
/**
@@ -100,6 +110,10 @@ sp_filter_primitive_build(SPObject *object, SPDocument *document, Inkscape::XML:
object->readAttr( "in" );
object->readAttr( "result" );
+ object->readAttr( "x" );
+ object->readAttr( "y" );
+ object->readAttr( "width" );
+ object->readAttr( "height" );
}
/**
@@ -121,7 +135,6 @@ 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:
@@ -146,6 +159,24 @@ sp_filter_primitive_set(SPObject *object, unsigned int key, gchar const *value)
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. */
@@ -165,6 +196,10 @@ sp_filter_primitive_update(SPObject *object, SPCtx *ctx, guint flags)
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) {
@@ -191,6 +226,7 @@ sp_filter_primitive_write(SPObject *object, Inkscape::XML::Document *doc, Inksca
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);
}
@@ -279,6 +315,7 @@ void sp_filter_primitive_renderer_common(SPFilterPrimitive *sp_prim, Inkscape::F
nr_prim->set_output(sp_prim->image_out);
/* TODO: place here code to handle input images, filter area etc. */
+ nr_prim->set_subregion( sp_prim->x, sp_prim->y, sp_prim->width, sp_prim->height );
}