/** * Drops any allocated memory. */ static void sp_feImage_release(SPObject *object) { SPFeImage *feImage = SP_FEIMAGE(object); feImage->_modified_connection.disconnect(); if (feImage->SVGElemRef) delete feImage->SVGElemRef; if (((SPObjectClass *) feImage_parent_class)->release) ((SPObjectClass *) feImage_parent_class)->release(object); }
/** * Sets a specific value in the SPFeImage. */ static void sp_feImage_set(SPObject *object, unsigned int key, gchar const *value) { SPFeImage *feImage = SP_FEIMAGE(object); (void)feImage; Inkscape::URI* SVGElem_uri; 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; try{ SVGElem_uri = new Inkscape::URI(feImage->href); feImage->SVGElemRef = new Inkscape::URIReference(feImage->document); feImage->from_element = true; feImage->SVGElemRef->attach(*SVGElem_uri); feImage->SVGElem = SP_ITEM(feImage->SVGElemRef->getObject()); g_free(SVGElem_uri); feImage->_modified_connection = ((SPObject*) feImage->SVGElem)->connectModified(sigc::bind(sigc::ptr_fun(&sp_feImage_elem_modified), object)); object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; } catch(const Inkscape::UnsupportedURIException & e) { feImage->from_element = false; g_warning("caught Inkscape::UnsupportedURIException in sp_feImage_set"); 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); break; default: if (((SPObjectClass *) feImage_parent_class)->set) ((SPObjectClass *) feImage_parent_class)->set(object, key, value); break; } }
static void sp_feImage_href_modified(SPObject* /*old_elem*/, SPObject* new_elem, SPObject* obj) { SPFeImage *feImage = SP_FEIMAGE(obj); feImage->_image_modified_connection.disconnect(); if (new_elem) { feImage->SVGElem = SP_ITEM(new_elem); feImage->_image_modified_connection = ((SPObject*) feImage->SVGElem)->connectModified(sigc::bind(sigc::ptr_fun(&sp_feImage_elem_modified), obj)); } else { feImage->SVGElem = 0; } obj->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); }
/** * Reads the Inkscape::XML::Node, and initializes SPFeImage 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_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); } /*LOAD ATTRIBUTES FROM REPR HERE*/ object->readAttr( "preserveAspectRatio" ); object->readAttr( "xlink:href" ); }
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_region(sp_image->x, sp_image->y, sp_image->width, sp_image->height); nr_image->set_href(sp_image->href); nr_image->set_document(sp_image->document); }
/** * Reads the Inkscape::XML::Node, and initializes SPFeImage 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_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); } /*LOAD ATTRIBUTES FROM REPR HERE*/ sp_object_read_attr(object, "x"); sp_object_read_attr(object, "y"); sp_object_read_attr(object, "width"); sp_object_read_attr(object, "height"); sp_object_read_attr(object, "xlink:href"); }
/** * Sets a specific value in the SPFeImage. */ 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; } }