static void sp_feComponentTransfer_children_modified(SPFeComponentTransfer *sp_componenttransfer) { if (sp_componenttransfer->renderer) { bool set[4] = {false, false, false, false}; SPObject* node = sp_componenttransfer->children; for(;node;node=node->next){ int i = 4; SPFeFuncNode *funcNode = SP_FEFUNCNODE(node); switch (funcNode->channel) { case SPFeFuncNode::R: i = 0; break; case SPFeFuncNode::G: i = 1; break; case SPFeFuncNode::B: i = 2; break; case SPFeFuncNode::A: i = 3; break; } if (i == 4) { g_warning("Unrecognized channel for component transfer."); break; } sp_componenttransfer->renderer->type[i] = ((SPFeFuncNode *) node)->type; sp_componenttransfer->renderer->tableValues[i] = ((SPFeFuncNode *) node)->tableValues; sp_componenttransfer->renderer->slope[i] = ((SPFeFuncNode *) node)->slope; sp_componenttransfer->renderer->intercept[i] = ((SPFeFuncNode *) node)->intercept; sp_componenttransfer->renderer->amplitude[i] = ((SPFeFuncNode *) node)->amplitude; sp_componenttransfer->renderer->exponent[i] = ((SPFeFuncNode *) node)->exponent; sp_componenttransfer->renderer->offset[i] = ((SPFeFuncNode *) node)->offset; set[i] = true; } // Set any types not explicitly set to the identity transform for(int i=0;i<4;i++) { if (!set[i]) { sp_componenttransfer->renderer->type[i] = Inkscape::Filters::COMPONENTTRANSFER_TYPE_IDENTITY; } } } }
/** * * Receives update notifications. * */ static void sp_fefuncnode_update(SPObject *object, SPCtx *ctx, guint flags) { SPFeFuncNode *feFuncNode = SP_FEFUNCNODE(object); (void)feFuncNode; if (flags & SP_OBJECT_MODIFIED_FLAG) { /* do something to trigger redisplay, updates? */ //TODO //object->readAttr( "azimuth" ); //object->readAttr( "elevation" ); } if (((SPObjectClass *) feFuncNode_parent_class)->update) { ((SPObjectClass *) feFuncNode_parent_class)->update(object, ctx, flags); } }
/** * Writes its settings to an incoming repr object, if any. */ static Inkscape::XML::Node * sp_fefuncnode_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { SPFeFuncNode *fefuncnode = SP_FEFUNCNODE(object); if (!repr) { repr = object->getRepr()->duplicate(doc); } (void)fefuncnode; /* TODO: I'm not sure what to do here... if (fefuncnode->azimuth_set) sp_repr_set_css_double(repr, "azimuth", fefuncnode->azimuth); if (fefuncnode->elevation_set) sp_repr_set_css_double(repr, "elevation", fefuncnode->elevation);*/ if (((SPObjectClass *) feFuncNode_parent_class)->write) { ((SPObjectClass *) feFuncNode_parent_class)->write(object, doc, repr, flags); } return repr; }
/** * Sets a specific value in the SPFeFuncNode. */ static void sp_fefuncnode_set(SPObject *object, unsigned int key, gchar const *value) { SPFeFuncNode *feFuncNode = SP_FEFUNCNODE(object); Inkscape::Filters::FilterComponentTransferType type; double read_num; switch(key) { case SP_ATTR_TYPE: type = sp_feComponenttransfer_read_type(value); if(type != feFuncNode->type) { feFuncNode->type = type; object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } break; case SP_ATTR_TABLEVALUES: if (value) { feFuncNode->tableValues = helperfns_read_vector(value); object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } break; case SP_ATTR_SLOPE: read_num = value ? helperfns_read_number(value) : 1; if (read_num != feFuncNode->slope) { feFuncNode->slope = read_num; object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } break; case SP_ATTR_INTERCEPT: read_num = value ? helperfns_read_number(value) : 0; if (read_num != feFuncNode->intercept) { feFuncNode->intercept = read_num; object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } break; case SP_ATTR_AMPLITUDE: read_num = value ? helperfns_read_number(value) : 1; if (read_num != feFuncNode->amplitude) { feFuncNode->amplitude = read_num; object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } break; case SP_ATTR_EXPONENT: read_num = value ? helperfns_read_number(value) : 1; if (read_num != feFuncNode->exponent) { feFuncNode->exponent = read_num; object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } break; case SP_ATTR_OFFSET: read_num = value ? helperfns_read_number(value) : 0; if (read_num != feFuncNode->offset) { feFuncNode->offset = read_num; object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } break; default: if (((SPObjectClass *) feFuncNode_parent_class)->set) ((SPObjectClass *) feFuncNode_parent_class)->set(object, key, value); break; } }