diff options
| author | Tavmjong Bah <tavmjong@free.fr> | 2011-03-11 15:59:38 +0000 |
|---|---|---|
| committer | tavmjong-free <tavmjong@free.fr> | 2011-03-11 15:59:38 +0000 |
| commit | 2c93e5fb2d1d7c8bfc72bc11826069686a67b113 (patch) | |
| tree | a193cb9811010724fc8a5c3a296a521a8304929e /src/filters | |
| parent | Comment out non-functional code that prevents compiling (diff) | |
| download | inkscape-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/filters')
| -rw-r--r-- | src/filters/image.cpp | 88 | ||||
| -rw-r--r-- | src/filters/image.h | 6 |
2 files changed, 72 insertions, 22 deletions
diff --git a/src/filters/image.cpp b/src/filters/image.cpp index ebad7a002..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); @@ -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 2445da5c6..535dd80fa 100644 --- a/src/filters/image.h +++ b/src/filters/image.h @@ -26,7 +26,11 @@ class SPFeImageClass; struct SPFeImage : public SPFilterPrimitive { /** IMAGE ATTRIBUTES HERE */ 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; |
