diff options
| author | Krzysztof Kosi??ski <tweenk.pl@gmail.com> | 2011-04-07 23:42:04 +0000 |
|---|---|---|
| committer | Krzysztof KosiĆski <tweenk.pl@gmail.com> | 2011-04-07 23:42:04 +0000 |
| commit | 945ce419c806c73d70203dec33ececafbe108a92 (patch) | |
| tree | cfcdb59bf47e9db7f9e01f7eebb59924bdeaea94 /src/filters | |
| parent | Merge from trunk (again) (diff) | |
| parent | Extensions. SVG+media fix (see Bug #400356). (diff) | |
| download | inkscape-945ce419c806c73d70203dec33ececafbe108a92.tar.gz inkscape-945ce419c806c73d70203dec33ececafbe108a92.zip | |
Merge from trunk
(bzr r9508.1.73)
Diffstat (limited to 'src/filters')
| -rw-r--r-- | src/filters/colormatrix.cpp | 2 | ||||
| -rw-r--r-- | src/filters/componenttransfer-funcnode.cpp | 11 | ||||
| -rw-r--r-- | src/filters/componenttransfer.cpp | 2 | ||||
| -rw-r--r-- | src/filters/convolvematrix.cpp | 2 | ||||
| -rw-r--r-- | src/filters/diffuselighting.cpp | 2 | ||||
| -rw-r--r-- | src/filters/distantlight.cpp | 8 | ||||
| -rw-r--r-- | src/filters/flood.cpp | 2 | ||||
| -rw-r--r-- | src/filters/gaussian-blur.cpp | 2 | ||||
| -rw-r--r-- | src/filters/image.cpp | 90 | ||||
| -rw-r--r-- | src/filters/image.h | 6 | ||||
| -rw-r--r-- | src/filters/merge.cpp | 2 | ||||
| -rw-r--r-- | src/filters/mergenode.cpp | 4 | ||||
| -rw-r--r-- | src/filters/morphology.cpp | 2 | ||||
| -rw-r--r-- | src/filters/offset.cpp | 2 | ||||
| -rw-r--r-- | src/filters/pointlight.cpp | 8 | ||||
| -rw-r--r-- | src/filters/specularlighting.cpp | 2 | ||||
| -rw-r--r-- | src/filters/spotlight.cpp | 8 | ||||
| -rw-r--r-- | src/filters/tile.cpp | 2 | ||||
| -rw-r--r-- | src/filters/turbulence.cpp | 2 |
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) { |
