X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ffilters%2Fconvolvematrix.cpp;h=3e1c36f0ad994afd8f6d3cc3edfc88a174a658c4;hb=43be2ed2178db96177d31205e4b9692535612136;hp=41028fb201773097cd04ac525b8b5a966c049f71;hpb=d9a7c806ee7f408ddb61ff4f233c9d96111ee2b5;p=inkscape.git diff --git a/src/filters/convolvematrix.cpp b/src/filters/convolvematrix.cpp index 41028fb20..3e1c36f0a 100644 --- a/src/filters/convolvematrix.cpp +++ b/src/filters/convolvematrix.cpp @@ -175,31 +175,38 @@ sp_feConvolveMatrix_set(SPObject *object, unsigned int key, gchar const *value) if (value){ feConvolveMatrix->kernelMatrixIsSet = true; feConvolveMatrix->kernelMatrix = helperfns_read_vector(value, (int) (feConvolveMatrix->order.getNumber() * feConvolveMatrix->order.getOptNumber())); + if (! feConvolveMatrix->divisorIsSet) { + feConvolveMatrix->divisor = 0; + for (unsigned int i = 0; i< feConvolveMatrix->kernelMatrix.size(); i++) + feConvolveMatrix->divisor += feConvolveMatrix->kernelMatrix[i]; + if (feConvolveMatrix->divisor == 0) feConvolveMatrix->divisor = 1; + } object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } else { g_warning("For feConvolveMatrix you MUST pass a kernelMatrix parameter!"); } break; case SP_ATTR_DIVISOR: - if (!value){ - read_num = 1; - } else { + if (value) { read_num = helperfns_read_number(value); if (read_num == 0) { - if (feConvolveMatrix->kernelMatrixIsSet){ - g_warning("You shouldn't pass a divisor value equal to 0! Assuming the sum of all values in kernelMatrix as the default value."); + // This should actually be an error, but given our UI it is more useful to simply set divisor to the default. + if (feConvolveMatrix->kernelMatrixIsSet) { for (unsigned int i = 0; i< feConvolveMatrix->kernelMatrix.size(); i++) read_num += feConvolveMatrix->kernelMatrix[i]; - } else { - g_warning("You shouldn't pass a divisor value equal to 0! Assuming 1 as the default value."); - read_num = 1; } + if (read_num == 0) read_num = 1; + if (feConvolveMatrix->divisorIsSet || feConvolveMatrix->divisor!=read_num) { + feConvolveMatrix->divisorIsSet = false; + feConvolveMatrix->divisor = read_num; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } + } else if (!feConvolveMatrix->divisorIsSet || feConvolveMatrix->divisor!=read_num) { + feConvolveMatrix->divisorIsSet = true; + feConvolveMatrix->divisor = read_num; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } } - if (read_num != feConvolveMatrix->divisor){ - feConvolveMatrix->divisor = read_num; - object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); - } break; case SP_ATTR_BIAS: read_num = 0; @@ -210,27 +217,31 @@ sp_feConvolveMatrix_set(SPObject *object, unsigned int key, gchar const *value) } break; case SP_ATTR_TARGETX: - read_int = (int) helperfns_read_number(value); - if (read_int < 0 || read_int > feConvolveMatrix->order.getNumber()){ - g_warning("targetX must be a value between 0 and orderX! Assuming orderX as default value."); - read_int = (int) feConvolveMatrix->order.getNumber(); - } - feConvolveMatrix->targetXIsSet = true; - if (read_int != feConvolveMatrix->targetX){ - feConvolveMatrix->targetX = read_int; - object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + if (value) { + read_int = (int) helperfns_read_number(value); + if (read_int < 0 || read_int > feConvolveMatrix->order.getNumber()){ + g_warning("targetX must be a value between 0 and orderX! Assuming floor(orderX/2) as default value."); + read_int = (int) floor(feConvolveMatrix->order.getNumber()/2.0); + } + feConvolveMatrix->targetXIsSet = true; + if (read_int != feConvolveMatrix->targetX){ + feConvolveMatrix->targetX = read_int; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } } break; case SP_ATTR_TARGETY: - read_int = (int) helperfns_read_number(value); - if (read_int < 0 || read_int > feConvolveMatrix->order.getOptNumber()){ - g_warning("targetY must be a value between 0 and orderY! Assuming orderY as default value."); - read_int = (int) feConvolveMatrix->order.getOptNumber(); - } - feConvolveMatrix->targetYIsSet = true; - if (read_int != feConvolveMatrix->targetY){ - feConvolveMatrix->targetY = read_int; - object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + if (value) { + read_int = (int) helperfns_read_number(value); + if (read_int < 0 || read_int > feConvolveMatrix->order.getOptNumber()){ + g_warning("targetY must be a value between 0 and orderY! Assuming floor(orderY/2) as default value."); + read_int = (int) floor(feConvolveMatrix->order.getOptNumber()/2.0); + } + feConvolveMatrix->targetYIsSet = true; + if (read_int != feConvolveMatrix->targetY){ + feConvolveMatrix->targetY = read_int; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } } break; case SP_ATTR_EDGEMODE: @@ -286,16 +297,13 @@ sp_feConvolveMatrix_update(SPObject *object, SPCtx *ctx, guint flags) static Inkscape::XML::Node * sp_feConvolveMatrix_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { - // Inkscape-only object, not copied during an "plain SVG" dump: - if (flags & SP_OBJECT_WRITE_EXT) { - if (repr) { - // is this sane? - //repr->mergeFrom(SP_OBJECT_REPR(object), "id"); - } else { - repr = SP_OBJECT_REPR(object)->duplicate(doc); - } + /* 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); } + if (((SPObjectClass *) feConvolveMatrix_parent_class)->write) { ((SPObjectClass *) feConvolveMatrix_parent_class)->write(object, doc, repr, flags); }