sp-filter.cpp revision 7851b4b4bb161abbc3a3100f9f94ce9b7369a6e0
/** \file
* SVG <filter> implementation.
*/
/*
* Authors:
* Hugo Rodrigues <haa.rodrigues@gmail.com>
* Niko Kiirala <niko@kiirala.com>
* Jon A. Cruz <jon@joncruz.org>
* Abhishek Sharma
*
* Copyright (C) 2006,2007 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <map>
#include <string.h>
#include <glibmm.h>
#include "attributes.h"
#include "display/nr-filter.h"
#include "document.h"
#include "sp-filter.h"
#include "sp-filter-reference.h"
#include "sp-filter-primitive.h"
#include "sp-item.h"
#include "uri.h"
#include <cstring>
#include <string>
#define SP_MACROS_SILENT
#include "macros.h"
#include "sp-factory.h"
namespace {
SPObject* createFilter() {
return new SPFilter();
}
}
{
this->href = new SPFilterReference(this);
this->x = 0;
this->y = 0;
this->width = 0;
this->height = 0;
this->_image_name->clear();
}
}
/**
* Reads the Inkscape::XML::Node, and initializes SPFilter 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.
*/
//Read values of key attributes from XML nodes into object.
this->readAttr( "filterUnits" );
this->readAttr( "primitiveUnits" );
this->readAttr( "x" );
this->readAttr( "y" );
this->readAttr( "width" );
this->readAttr( "height" );
this->readAttr( "filterRes" );
this->readAttr( "xlink:href" );
//is this necessary?
}
/**
* Drops any allocated memory.
*/
if (this->document) {
// Unregister ourselves
}
//TODO: release resources here
//release href
if (this->href) {
this->modified_connection.disconnect();
delete this->href;
}
for (map<gchar *, int, ltstr>::const_iterator i = this->_image_name->begin() ; i != this->_image_name->end() ; ++i) {
}
delete this->_image_name;
}
/**
* Sets a specific value in the SPFilter.
*/
switch (key) {
case SP_ATTR_FILTERUNITS:
if (value) {
} else {
}
this->filterUnits_set = TRUE;
} else {
this->filterUnits_set = FALSE;
}
break;
case SP_ATTR_PRIMITIVEUNITS:
if (value) {
} else {
}
this->primitiveUnits_set = TRUE;
} else {
this->primitiveUnits_set = FALSE;
}
break;
case SP_ATTR_X:
this->x.readOrUnset(value);
break;
case SP_ATTR_Y:
this->y.readOrUnset(value);
break;
case SP_ATTR_WIDTH:
break;
case SP_ATTR_HEIGHT:
break;
case SP_ATTR_FILTERRES:
break;
case SP_ATTR_XLINK_HREF:
if (value) {
try {
} catch (Inkscape::BadURIException &e) {
}
} else {
}
break;
default:
// See if any parents need this value.
break;
}
}
/**
* Receives update notifications.
*/
// Do here since we know viewport (Bounding box case handled during rendering)
// Note: This only works for root viewport since this routine is not called after
// setting a new viewport. A true fix requires a strategy like SPItemView or SPMarkerView.
if(this->filterUnits == SP_FILTER_UNITS_USERSPACEONUSE) {
this->x._set = true;
}
this->y._set = true;
}
}
}
}
/* do something to trigger redisplay, updates? */
}
// Update filter primitives in order to update filter primitive area
// (SPObject::ActionUpdate is not actually used)
unsigned childflags = flags;
if (flags & SP_OBJECT_MODIFIED_FLAG) {
}
while (l) {
l = g_slist_remove (l, child);
if( SP_IS_FILTER_PRIMITIVE( child ) ) {
}
}
}
/**
* Writes its settings to an incoming repr object, if any.
*/
Inkscape::XML::Node* SPFilter::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
// Original from sp-item-group.cpp
if (flags & SP_OBJECT_WRITE_BUILD) {
if (!repr) {
}
if (crepr) {
l = g_slist_prepend (l, crepr);
}
}
while (l) {
l = g_slist_remove (l, l->data);
}
} else {
}
}
switch (this->filterUnits) {
break;
default:
break;
}
}
switch (this->primitiveUnits) {
break;
default:
break;
}
}
if (this->x._set) {
} else {
}
if (this->y._set) {
} else {
}
} else {
}
} else {
}
} else {
}
}
return repr;
}
/**
* Gets called when the filter is (re)attached to another filter.
*/
static void
{
if (old_ref) {
}
if ( SP_IS_FILTER(ref)
{
}
}
{
}
/**
* Callback for child_added event.
*/
}
/**
* Callback for remove_child event.
*/
}
{
} else {
}
}
while (primitive_obj) {
if (SP_IS_FILTER_PRIMITIVE(primitive_obj)) {
// if (((SPFilterPrimitiveClass*) G_OBJECT_GET_CLASS(primitive))->build_renderer) {
// ((SPFilterPrimitiveClass *) G_OBJECT_GET_CLASS(primitive))->build_renderer(primitive, nr_filter);
// } else {
// g_warning("Cannot build filter renderer: missing builder");
// } // CPPIFY: => FilterPrimitive should be abstract.
}
}
}
int count = 0;
while (primitive_obj) {
}
return count;
}
}
// The element is not inserted (because an element with the same key was already in the map)
// Therefore, free the memory allocated for the new entry:
}
return value;
}
switch (image) {
return "SourceGraphic";
break;
return "SourceAlpha";
break;
return "BackgroundImage";
break;
return "BackgroundAlpha";
break;
return "StrokePaint";
break;
return "FillPaint";
break;
return 0;
break;
default:
return i->first;
}
}
}
return 0;
}
int largest = 0;
while (primitive_obj) {
if (SP_IS_FILTER_PRIMITIVE(primitive_obj)) {
int index;
if (result)
{
{
{
}
}
}
}
}
}
{
}
/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :