[librsvg: 61/95] rsvg_property_bag_iter_next(): Return the Attribute as well



commit 6e13ebd8b92128ec8eb4ac66872235990e0d8929
Author: Federico Mena Quintero <federico gnome org>
Date:   Wed Feb 21 10:46:42 2018 -0600

    rsvg_property_bag_iter_next(): Return the Attribute as well
    
    Now the callers don't have to compute it themselves.

 rsvg-base.c              | 12 ++++--------
 rsvg-private.h           |  2 ++
 rsvg-styles.c            | 18 ++++--------------
 rust/src/property_bag.rs |  8 +++++++-
 4 files changed, 17 insertions(+), 23 deletions(-)
---
diff --git a/rsvg-base.c b/rsvg-base.c
index 55822f3a..a42c08fc 100644
--- a/rsvg-base.c
+++ b/rsvg-base.c
@@ -171,6 +171,7 @@ rsvg_start_style (RsvgHandle *handle, RsvgPropertyBag *atts)
     RsvgSaxHandlerStyle *handler = g_new0 (RsvgSaxHandlerStyle, 1);
     RsvgPropertyBagIter *iter;
     const char *key;
+    RsvgAttribute attr;
     const char *value;
 
     handler->super.free = rsvg_style_handler_free;
@@ -200,13 +201,7 @@ rsvg_start_style (RsvgHandle *handle, RsvgPropertyBag *atts)
 
     iter = rsvg_property_bag_iter_begin (atts);
 
-    while (rsvg_property_bag_iter_next (iter, &key, &value)) {
-        RsvgAttribute attr;
-
-        if (!rsvg_attribute_from_name (key, &attr)) {
-            continue;
-        }
-
+    while (rsvg_property_bag_iter_next (iter, &key, &attr, &value)) {
         if (attr == RSVG_ATTRIBUTE_TYPE) {
             handler->is_text_css = (g_ascii_strcasecmp (value, "text/css") == 0);
         }
@@ -573,6 +568,7 @@ rsvg_metadata_handler_start (RsvgSaxHandler * self, const char *name, RsvgProper
     RsvgSaxHandlerMetadata *z = (RsvgSaxHandlerMetadata *) self;
     RsvgPropertyBagIter *iter;
     const char *key;
+    RsvgAttribute attr;
     const char *value;
 
     rsvg_extra_handler_start (self, name, atts);
@@ -584,7 +580,7 @@ rsvg_metadata_handler_start (RsvgSaxHandler * self, const char *name, RsvgProper
 
     iter = rsvg_property_bag_iter_begin (atts);
 
-    while (rsvg_property_bag_iter_next (iter, &key, &value)) {
+    while (rsvg_property_bag_iter_next (iter, &key, &attr, &value)) {
         g_string_append_printf (z->string, "%s=\"%s\" ", key, value);
     }
 
diff --git a/rsvg-private.h b/rsvg-private.h
index 058c715c..18791879 100644
--- a/rsvg-private.h
+++ b/rsvg-private.h
@@ -30,6 +30,7 @@
 #include <cairo.h>
 
 #include "rsvg.h"
+#include "rsvg-attributes.h"
 #include "rsvg-path-builder.h"
 
 #include <libxml/SAX.h>
@@ -452,6 +453,7 @@ RsvgPropertyBagIter *rsvg_property_bag_iter_begin (RsvgPropertyBag bag);
 G_GNUC_INTERNAL
 gboolean rsvg_property_bag_iter_next (RsvgPropertyBagIter *iter,
                                       const char **out_key,
+                                      RsvgAttribute *out_attr,
                                       const char **out_value);
 
 /* Implemented in rust/src/property_bag.rs */
diff --git a/rsvg-styles.c b/rsvg-styles.c
index 3f18bc15..dd0e9c93 100644
--- a/rsvg-styles.c
+++ b/rsvg-styles.c
@@ -1175,17 +1175,12 @@ rsvg_parse_presentation_attributes (RsvgState * state, RsvgPropertyBag * atts)
 {
     RsvgPropertyBagIter *iter;
     const char *key;
+    RsvgAttribute attr;
     const char *value;
 
     iter = rsvg_property_bag_iter_begin (atts);
 
-    while (rsvg_property_bag_iter_next (iter, &key, &value)) {
-        RsvgAttribute attr;
-
-        if (!rsvg_attribute_from_name (key, &attr)) {
-            continue;
-        }
-
+    while (rsvg_property_bag_iter_next (iter, &key, &attr, &value)) {
         rsvg_parse_style_pair (state, key, attr, value, FALSE, PAIR_SOURCE_PRESENTATION_ATTRIBUTE);
     }
 
@@ -1572,6 +1567,7 @@ rsvg_parse_style_attrs (RsvgHandle *handle,
     RsvgState *state;
     RsvgPropertyBagIter *iter;
     const char *key;
+    RsvgAttribute attr;
     const char *value;
 
     state = rsvg_node_get_state (node);
@@ -1654,13 +1650,7 @@ rsvg_parse_style_attrs (RsvgHandle *handle,
 
     iter = rsvg_property_bag_iter_begin (atts);
 
-    while (rsvg_property_bag_iter_next (iter, &key, &value)) {
-        RsvgAttribute attr;
-
-        if (!rsvg_attribute_from_name (key, &attr)) {
-            continue;
-        }
-
+    while (rsvg_property_bag_iter_next (iter, &key, &attr, &value)) {
         switch (attr) {
         case RSVG_ATTRIBUTE_STYLE:
             rsvg_parse_style (state, value);
diff --git a/rust/src/property_bag.rs b/rust/src/property_bag.rs
index 114009de..7fd0b43c 100644
--- a/rust/src/property_bag.rs
+++ b/rust/src/property_bag.rs
@@ -150,15 +150,17 @@ pub extern fn rsvg_property_bag_iter_begin(pbag: *const PropertyBag) -> *mut Pro
 #[no_mangle]
 pub extern fn rsvg_property_bag_iter_next(iter: *mut PropertyBagCStrIter,
                                           out_key: *mut *const libc::c_char,
+                                          out_attr: *mut Attribute,
                                           out_value: *mut *const libc::c_char)
                                           -> glib_sys::gboolean
 {
     assert!(!iter.is_null());
     let iter = unsafe { &mut *iter };
 
-    if let Some((key, _, val)) = iter.next() {
+    if let Some((key, attr, val)) = iter.next() {
         unsafe {
             *out_key = key.as_ptr();
+            *out_attr = attr;
             *out_value = val.as_ptr();
         }
         true.to_glib()
@@ -259,18 +261,22 @@ mod tests {
         let iter = rsvg_property_bag_iter_begin(&pbag as *const PropertyBag);
 
         let mut key = unsafe { mem::uninitialized() };
+        let mut att = unsafe { mem::uninitialized() };
         let mut val = unsafe { mem::uninitialized() };
 
         while from_glib(rsvg_property_bag_iter_next(iter,
                                                     &mut key as *mut _,
+                                                    &mut att as *mut _,
                                                     &mut val as *mut _)) {
             let k = unsafe { CStr::from_ptr(key).to_str().unwrap() };
             let v = unsafe { CStr::from_ptr(val).to_str().unwrap() };
 
             if k == "rx" {
+                assert!(att == Attribute::Rx);
                 assert!(v == "1");
                 had_rx = true;
             } else if k == "ry" {
+                assert!(att == Attribute::Ry);
                 assert!(v == "2");
                 had_ry = true;
             }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]