[librsvg: 71/95] rsvg_filter_primitive_convolve_matrix_set_atts(): Parse attributes with the PHF



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]