[librsvg: 71/95] rsvg_filter_primitive_convolve_matrix_set_atts(): Parse attributes with the PHF
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 71/95] rsvg_filter_primitive_convolve_matrix_set_atts(): Parse attributes with the PHF
- Date: Thu, 22 Feb 2018 03:19:06 +0000 (UTC)
commit da822b08226cf12ffa28133f593bc92dd98fe02c
Author: Federico Mena Quintero <federico gnome org>
Date: Wed Feb 21 15:15:26 2018 -0600
rsvg_filter_primitive_convolve_matrix_set_atts(): Parse attributes with the PHF
rsvg-filter.c | 168 ++++++++++++++++++++++++++++++++++------------------------
1 file changed, 98 insertions(+), 70 deletions(-)
---
diff --git a/rsvg-filter.c b/rsvg-filter.c
index 92c19c58..602e149a 100644
--- a/rsvg-filter.c
+++ b/rsvg-filter.c
@@ -1319,95 +1319,119 @@ rsvg_filter_primitive_convolve_matrix_set_atts (RsvgNode *node, gpointer impl, R
{
RsvgFilterPrimitiveConvolveMatrix *filter = impl;
gint i, j;
- const char *value;
gboolean has_target_x, has_target_y;
+ RsvgPropertyBagIter *iter;
+ const char *key;
+ RsvgAttribute attr;
+ const char *value;
+
has_target_x = 0;
has_target_y = 0;
- if ((value = rsvg_property_bag_lookup (atts, "in")))
- g_string_assign (filter->super.in, value);
- if ((value = rsvg_property_bag_lookup (atts, "result")))
- g_string_assign (filter->super.result, value);
-
filter_primitive_set_x_y_width_height_atts ((RsvgFilterPrimitive *) filter, atts);
- if ((value = rsvg_property_bag_lookup (atts, "targetX"))) {
- has_target_x = 1;
- filter->targetx = atoi (value);
- }
- if ((value = rsvg_property_bag_lookup (atts, "targetY"))) {
- has_target_y = 1;
- filter->targety = atoi (value);
- }
- if ((value = rsvg_property_bag_lookup (atts, "bias")))
- filter->bias = atof (value);
- if ((value = rsvg_property_bag_lookup (atts, "preserveAlpha"))) {
- if (!strcmp (value, "true"))
- filter->preservealpha = TRUE;
- else
- filter->preservealpha = FALSE;
- }
- if ((value = rsvg_property_bag_lookup (atts, "divisor")))
- filter->divisor = atof (value);
-
- if ((value = rsvg_property_bag_lookup (atts, "order"))) {
- double tempx, tempy;
- if (rsvg_css_parse_number_optional_number (value, &tempx, &tempy)
- && tempx >= 1.0 && tempy <= 100.0
- && tempy >= 1.0 && tempy <= 100.0) {
- filter->orderx = (int) tempx;
- filter->ordery = (int) tempy;
- g_assert (filter->orderx >= 1);
- g_assert (filter->ordery >= 1);
+ iter = rsvg_property_bag_iter_begin (atts);
+
+ while (rsvg_property_bag_iter_next (iter, &key, &attr, &value)) {
+ switch (attr) {
+ case RSVG_ATTRIBUTE_IN:
+ g_string_assign (filter->super.in, value);
+ break;
+
+ case RSVG_ATTRIBUTE_RESULT:
+ g_string_assign (filter->super.result, value);
+ break;
+
+ case RSVG_ATTRIBUTE_TARGET_X:
+ has_target_x = 1;
+ filter->targetx = atoi (value);
+ break;
+
+ case RSVG_ATTRIBUTE_TARGET_Y:
+ has_target_y = 1;
+ filter->targety = atoi (value);
+ break;
+
+ case RSVG_ATTRIBUTE_BIAS:
+ filter->bias = atof (value);
+ break;
+
+ case RSVG_ATTRIBUTE_PRESERVE_ALPHA:
+ if (!strcmp (value, "true"))
+ filter->preservealpha = TRUE;
+ else
+ filter->preservealpha = FALSE;
+ break;
+
+ case RSVG_ATTRIBUTE_DIVISOR:
+ filter->divisor = atof (value);
+ break;
+
+ case RSVG_ATTRIBUTE_ORDER: {
+ double tempx, tempy;
+ if (rsvg_css_parse_number_optional_number (value, &tempx, &tempy)
+ && tempx >= 1.0 && tempy <= 100.0
+ && tempy >= 1.0 && tempy <= 100.0) {
+ filter->orderx = (int) tempx;
+ filter->ordery = (int) tempy;
+ g_assert (filter->orderx >= 1);
+ g_assert (filter->ordery >= 1);
#define SIZE_OVERFLOWS(a,b) (G_UNLIKELY ((b) > 0 && (a) > G_MAXSIZE / (b)))
- if (SIZE_OVERFLOWS (filter->orderx, filter->ordery)) {
- rsvg_node_set_attribute_parse_error (node, "order", "number of kernelMatrix elements would
be too big");
- return;
+ if (SIZE_OVERFLOWS (filter->orderx, filter->ordery)) {
+ rsvg_node_set_attribute_parse_error (node, "order", "number of kernelMatrix elements
would be too big");
+ goto out;
+ }
+ } else {
+ rsvg_node_set_attribute_parse_error (node, "order", "invalid size for convolve matrix");
+ goto out;
}
- } else {
- rsvg_node_set_attribute_parse_error (node, "order", "invalid size for convolve matrix");
- return;
+ break;
}
- }
- if ((value = rsvg_property_bag_lookup (atts, "kernelUnitLength"))) {
- if (!rsvg_css_parse_number_optional_number (value, &filter->dx, &filter->dy)) {
- rsvg_node_set_attribute_parse_error (node, "kernelUnitLength", "expected
number-optional-number");
- return;
- }
- }
+ case RSVG_ATTRIBUTE_KERNEL_UNIT_LENGTH:
+ if (!rsvg_css_parse_number_optional_number (value, &filter->dx, &filter->dy)) {
+ rsvg_node_set_attribute_parse_error (node, "kernelUnitLength", "expected
number-optional-number");
+ goto out;
+ }
+ break;
- if ((value = rsvg_property_bag_lookup (atts, "kernelMatrix"))) {
- gsize num_elems;
- gsize got_num_elems;
+ case RSVG_ATTRIBUTE_KERNEL_MATRIX: {
+ gsize num_elems;
+ gsize got_num_elems;
- num_elems = filter->orderx * filter->ordery;
+ num_elems = filter->orderx * filter->ordery;
- if (!rsvg_css_parse_number_list (value,
- NUMBER_LIST_LENGTH_EXACT,
- num_elems,
- &filter->KernelMatrix,
- &got_num_elems)) {
- rsvg_node_set_attribute_parse_error (node, "kernelMatrix", "expected a matrix of numbers");
- return;
+ if (!rsvg_css_parse_number_list (value,
+ NUMBER_LIST_LENGTH_EXACT,
+ num_elems,
+ &filter->KernelMatrix,
+ &got_num_elems)) {
+ rsvg_node_set_attribute_parse_error (node, "kernelMatrix", "expected a matrix of numbers");
+ goto out;
+ }
+
+ g_assert (num_elems == got_num_elems);
+ break;
}
- g_assert (num_elems == got_num_elems);
- }
+ case RSVG_ATTRIBUTE_EDGE_MODE:
+ if (!strcmp (value, "duplicate")) {
+ filter->edgemode = EDGE_MODE_DUPLICATE;
+ } else if (!strcmp (value, "wrap")) {
+ filter->edgemode = EDGE_MODE_WRAP;
+ } else if (!strcmp (value, "none")) {
+ filter->edgemode = EDGE_MODE_NONE;
+ } else {
+ rsvg_node_set_attribute_parse_error (node, "edgeMode", "expected 'duplicate' | 'wrap' |
'none'");
+ goto out;
+ }
+ break;
- if ((value = rsvg_property_bag_lookup (atts, "edgeMode"))) {
- if (!strcmp (value, "duplicate")) {
- filter->edgemode = EDGE_MODE_DUPLICATE;
- } else if (!strcmp (value, "wrap")) {
- filter->edgemode = EDGE_MODE_WRAP;
- } else if (!strcmp (value, "none")) {
- filter->edgemode = EDGE_MODE_NONE;
- } else {
- rsvg_node_set_attribute_parse_error (node, "edgeMode", "expected 'duplicate' | 'wrap' | 'none'");
- return;
+ default:
+ break;
}
}
@@ -1426,6 +1450,10 @@ rsvg_filter_primitive_convolve_matrix_set_atts (RsvgNode *node, gpointer impl, R
if (!has_target_y) {
filter->targety = floor (filter->ordery / 2);
}
+
+out:
+
+ rsvg_property_bag_iter_end (iter);
}
RsvgNode *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]