summaryrefslogtreecommitdiffstats
path: root/src/filters
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2011-04-07 23:42:04 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2011-04-07 23:42:04 +0000
commit945ce419c806c73d70203dec33ececafbe108a92 (patch)
treecfcdb59bf47e9db7f9e01f7eebb59924bdeaea94 /src/filters
parentMerge from trunk (again) (diff)
parentExtensions. SVG+media fix (see Bug #400356). (diff)
downloadinkscape-945ce419c806c73d70203dec33ececafbe108a92.tar.gz
inkscape-945ce419c806c73d70203dec33ececafbe108a92.zip
Merge from trunk
(bzr r9508.1.73)
Diffstat (limited to 'src/filters')
-rw-r--r--src/filters/colormatrix.cpp2
-rw-r--r--src/filters/componenttransfer-funcnode.cpp11
-rw-r--r--src/filters/componenttransfer.cpp2
-rw-r--r--src/filters/convolvematrix.cpp2
-rw-r--r--src/filters/diffuselighting.cpp2
-rw-r--r--src/filters/distantlight.cpp8
-rw-r--r--src/filters/flood.cpp2
-rw-r--r--src/filters/gaussian-blur.cpp2
-rw-r--r--src/filters/image.cpp90
-rw-r--r--src/filters/image.h6
-rw-r--r--src/filters/merge.cpp2
-rw-r--r--src/filters/mergenode.cpp4
-rw-r--r--src/filters/morphology.cpp2
-rw-r--r--src/filters/offset.cpp2
-rw-r--r--src/filters/pointlight.cpp8
-rw-r--r--src/filters/specularlighting.cpp2
-rw-r--r--src/filters/spotlight.cpp8
-rw-r--r--src/filters/tile.cpp2
-rw-r--r--src/filters/turbulence.cpp2
19 files changed, 104 insertions, 55 deletions
diff --git a/src/filters/colormatrix.cpp b/src/filters/colormatrix.cpp
index 4d54aa579..b110e2766 100644
--- a/src/filters/colormatrix.cpp
+++ b/src/filters/colormatrix.cpp
@@ -191,7 +191,7 @@ sp_feColorMatrix_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape:
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
if (((SPObjectClass *) feColorMatrix_parent_class)->write) {
diff --git a/src/filters/componenttransfer-funcnode.cpp b/src/filters/componenttransfer-funcnode.cpp
index a245e1c89..446009e1d 100644
--- a/src/filters/componenttransfer-funcnode.cpp
+++ b/src/filters/componenttransfer-funcnode.cpp
@@ -183,14 +183,13 @@ sp_fefuncnode_build(SPObject *object, SPDocument *document, Inkscape::XML::Node
/**
* Drops any allocated memory.
*/
-static void
-sp_fefuncnode_release(SPObject *object)
+static void sp_fefuncnode_release(SPObject *object)
{
//SPFeFuncNode *fefuncnode = SP_FEFUNCNODE(object);
- if (SP_OBJECT_DOCUMENT(object)) {
- /* Unregister ourselves */
- SP_OBJECT_DOCUMENT(object)->removeResource("fefuncnode", SP_OBJECT(object));
+ if ( object->document ) {
+ // Unregister ourselves
+ object->document->removeResource("fefuncnode", object);
}
//TODO: release resources here
@@ -313,7 +312,7 @@ sp_fefuncnode_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XM
SPFeFuncNode *fefuncnode = SP_FEFUNCNODE(object);
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
(void)fefuncnode;
diff --git a/src/filters/componenttransfer.cpp b/src/filters/componenttransfer.cpp
index e2e4922c8..99d8616f4 100644
--- a/src/filters/componenttransfer.cpp
+++ b/src/filters/componenttransfer.cpp
@@ -222,7 +222,7 @@ sp_feComponentTransfer_write(SPObject *object, Inkscape::XML::Document *doc, Ink
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
if (((SPObjectClass *) feComponentTransfer_parent_class)->write) {
diff --git a/src/filters/convolvematrix.cpp b/src/filters/convolvematrix.cpp
index 263e6edc4..20d652bee 100644
--- a/src/filters/convolvematrix.cpp
+++ b/src/filters/convolvematrix.cpp
@@ -299,7 +299,7 @@ sp_feConvolveMatrix_write(SPObject *object, Inkscape::XML::Document *doc, Inksca
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
diff --git a/src/filters/diffuselighting.cpp b/src/filters/diffuselighting.cpp
index 7169bb285..0f2f29d67 100644
--- a/src/filters/diffuselighting.cpp
+++ b/src/filters/diffuselighting.cpp
@@ -249,7 +249,7 @@ sp_feDiffuseLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inksc
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values _and children_ into it */
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
//repr = doc->createElement("svg:feDiffuseLighting");
}
diff --git a/src/filters/distantlight.cpp b/src/filters/distantlight.cpp
index a646267be..891049415 100644
--- a/src/filters/distantlight.cpp
+++ b/src/filters/distantlight.cpp
@@ -115,9 +115,9 @@ sp_fedistantlight_release(SPObject *object)
{
//SPFeDistantLight *fedistantlight = SP_FEDISTANTLIGHT(object);
- if (SP_OBJECT_DOCUMENT(object)) {
- /* Unregister ourselves */
- SP_OBJECT_DOCUMENT(object)->removeResource("fedistantlight", SP_OBJECT(object));
+ if ( object->document ) {
+ // Unregister ourselves
+ object->document->removeResource("fedistantlight", object);
}
//TODO: release resources here
@@ -206,7 +206,7 @@ sp_fedistantlight_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape
SPFeDistantLight *fedistantlight = SP_FEDISTANTLIGHT(object);
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
if (fedistantlight->azimuth_set)
diff --git a/src/filters/flood.cpp b/src/filters/flood.cpp
index e1c7ba214..3de1eb527 100644
--- a/src/filters/flood.cpp
+++ b/src/filters/flood.cpp
@@ -204,7 +204,7 @@ sp_feFlood_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
if (((SPObjectClass *) feFlood_parent_class)->write) {
diff --git a/src/filters/gaussian-blur.cpp b/src/filters/gaussian-blur.cpp
index 8919aece0..ee1af8904 100644
--- a/src/filters/gaussian-blur.cpp
+++ b/src/filters/gaussian-blur.cpp
@@ -159,7 +159,7 @@ sp_gaussianBlur_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
if (((SPObjectClass *) gaussianBlur_parent_class)->write) {
diff --git a/src/filters/image.cpp b/src/filters/image.cpp
index bbe775c18..f6ef310f7 100644
--- a/src/filters/image.cpp
+++ b/src/filters/image.cpp
@@ -19,6 +19,7 @@
#endif
#include "uri.h"
#include "uri-references.h"
+#include "enums.h"
#include "attributes.h"
#include "svg/svg.h"
#include "image.h"
@@ -78,8 +79,10 @@ static void sp_feImage_class_init(SPFeImageClass *klass)
sp_primitive_class->build_renderer = sp_feImage_build_renderer;
}
-static void sp_feImage_init(SPFeImage */*feImage*/)
+static void sp_feImage_init(SPFeImage *feImage)
{
+ feImage->aspect_align = SP_ASPECT_XMID_YMID; // Default
+ feImage->aspect_clip = SP_ASPECT_MEET; // Default
}
/**
@@ -99,10 +102,7 @@ static void sp_feImage_build(SPObject *object, SPDocument *document, Inkscape::X
/*LOAD ATTRIBUTES FROM REPR HERE*/
- object->readAttr( "x" );
- object->readAttr( "y" );
- object->readAttr( "width" );
- object->readAttr( "height" );
+ object->readAttr( "preserveAspectRatio" );
object->readAttr( "xlink:href" );
}
@@ -185,22 +185,67 @@ static void sp_feImage_set(SPObject *object, unsigned int key, gchar const *valu
}
break;
- case SP_ATTR_X:
- feImage->x.readOrUnset(value);
- object->requestModified(SP_OBJECT_MODIFIED_FLAG);
- break;
- case SP_ATTR_Y:
- feImage->y.readOrUnset(value);
- object->requestModified(SP_OBJECT_MODIFIED_FLAG);
- break;
- case SP_ATTR_WIDTH:
- feImage->width.readOrUnset(value);
- object->requestModified(SP_OBJECT_MODIFIED_FLAG);
- break;
- case SP_ATTR_HEIGHT:
- feImage->height.readOrUnset(value);
- object->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ 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);
@@ -234,7 +279,7 @@ static Inkscape::XML::Node * sp_feImage_write(SPObject *object, Inkscape::XML::D
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
if (((SPObjectClass *) feImage_parent_class)->write) {
@@ -259,7 +304,8 @@ static void sp_feImage_build_renderer(SPFilterPrimitive *primitive, Inkscape::Fi
nr_image->from_element = sp_image->from_element;
nr_image->SVGElem = sp_image->SVGElem;
- nr_image->set_region(sp_image->x, sp_image->y, sp_image->width, sp_image->height);
+ 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);
}
diff --git a/src/filters/image.h b/src/filters/image.h
index a66e6c4c5..b4081602a 100644
--- a/src/filters/image.h
+++ b/src/filters/image.h
@@ -28,7 +28,11 @@ class SPFeImageClass;
struct SPFeImage : public SPFilterPrimitive {
gchar *href;
- SVGLength x, y, height, width;
+
+ /* preserveAspectRatio */
+ unsigned int aspect_align : 4;
+ unsigned int aspect_clip : 1;
+
SPDocument *document;
bool from_element;
SPItem* SVGElem;
diff --git a/src/filters/merge.cpp b/src/filters/merge.cpp
index dacfb7e91..47830c38b 100644
--- a/src/filters/merge.cpp
+++ b/src/filters/merge.cpp
@@ -151,7 +151,7 @@ sp_feMerge_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::
/* 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 = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
diff --git a/src/filters/mergenode.cpp b/src/filters/mergenode.cpp
index f4c4c6089..639928305 100644
--- a/src/filters/mergenode.cpp
+++ b/src/filters/mergenode.cpp
@@ -151,9 +151,9 @@ sp_feMergeNode_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::X
if (flags & SP_OBJECT_WRITE_EXT) {
if (repr) {
// is this sane?
- //repr->mergeFrom(SP_OBJECT_REPR(object), "id");
+ //repr->mergeFrom(object->getRepr(), "id");
} else {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
}
diff --git a/src/filters/morphology.cpp b/src/filters/morphology.cpp
index bbfa97728..42327d59f 100644
--- a/src/filters/morphology.cpp
+++ b/src/filters/morphology.cpp
@@ -185,7 +185,7 @@ sp_feMorphology_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
if (((SPObjectClass *) feMorphology_parent_class)->write) {
diff --git a/src/filters/offset.cpp b/src/filters/offset.cpp
index 360012d3b..f45169aba 100644
--- a/src/filters/offset.cpp
+++ b/src/filters/offset.cpp
@@ -169,7 +169,7 @@ sp_feOffset_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML:
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
if (((SPObjectClass *) feOffset_parent_class)->write) {
diff --git a/src/filters/pointlight.cpp b/src/filters/pointlight.cpp
index f09449615..ee6824d00 100644
--- a/src/filters/pointlight.cpp
+++ b/src/filters/pointlight.cpp
@@ -119,9 +119,9 @@ sp_fepointlight_release(SPObject *object)
{
//SPFePointLight *fepointlight = SP_FEPOINTLIGHT(object);
- if (SP_OBJECT_DOCUMENT(object)) {
- /* Unregister ourselves */
- SP_OBJECT_DOCUMENT(object)->removeResource("fepointlight", SP_OBJECT(object));
+ if ( object->document ) {
+ // Unregister ourselves
+ object->document->removeResource("fepointlight", object);
}
//TODO: release resources here
@@ -229,7 +229,7 @@ sp_fepointlight_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::
SPFePointLight *fepointlight = SP_FEPOINTLIGHT(object);
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
if (fepointlight->x_set)
diff --git a/src/filters/specularlighting.cpp b/src/filters/specularlighting.cpp
index acb986d74..71a705c94 100644
--- a/src/filters/specularlighting.cpp
+++ b/src/filters/specularlighting.cpp
@@ -276,7 +276,7 @@ sp_feSpecularLighting_write(SPObject *object, Inkscape::XML::Document *doc, Inks
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values _and children_ into it */
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
//repr = doc->createElement("svg:feSpecularLighting");
}
diff --git a/src/filters/spotlight.cpp b/src/filters/spotlight.cpp
index 060b3b04d..7be83ed00 100644
--- a/src/filters/spotlight.cpp
+++ b/src/filters/spotlight.cpp
@@ -134,9 +134,9 @@ sp_fespotlight_release(SPObject *object)
{
//SPFeSpotLight *fespotlight = SP_FESPOTLIGHT(object);
- if (SP_OBJECT_DOCUMENT(object)) {
- /* Unregister ourselves */
- SP_OBJECT_DOCUMENT(object)->removeResource("fespotlight", SP_OBJECT(object));
+ if ( object->document ) {
+ // Unregister ourselves
+ object->document->removeResource("fespotlight", object);
}
//TODO: release resources here
@@ -332,7 +332,7 @@ sp_fespotlight_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::X
SPFeSpotLight *fespotlight = SP_FESPOTLIGHT(object);
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
if (fespotlight->x_set)
diff --git a/src/filters/tile.cpp b/src/filters/tile.cpp
index d4e4ac890..c3555ee7c 100644
--- a/src/filters/tile.cpp
+++ b/src/filters/tile.cpp
@@ -151,7 +151,7 @@ sp_feTile_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::N
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
if (((SPObjectClass *) feTile_parent_class)->write) {
diff --git a/src/filters/turbulence.cpp b/src/filters/turbulence.cpp
index 739001311..9d1448c70 100644
--- a/src/filters/turbulence.cpp
+++ b/src/filters/turbulence.cpp
@@ -234,7 +234,7 @@ sp_feTurbulence_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::
/* TODO: Don't just clone, but create a new repr node and write all
* relevant values into it */
if (!repr) {
- repr = SP_OBJECT_REPR(object)->duplicate(doc);
+ repr = object->getRepr()->duplicate(doc);
}
if (((SPObjectClass *) feTurbulence_parent_class)->write) {