[librsvg: 4/15] state: port enable-background to rust



commit b269438dc1ece344bad8a3e0998e8afdedbf98f6
Author: Paolo Borelli <pborelli gnome org>
Date:   Fri Apr 6 22:28:45 2018 +0200

    state: port enable-background to rust

 librsvg/rsvg-cairo-draw.c   |  8 ++++++--
 librsvg/rsvg-styles.c       | 18 +++++++-----------
 librsvg/rsvg-styles.h       |  6 ++++--
 rsvg_internals/src/lib.rs   |  1 +
 rsvg_internals/src/state.rs | 42 ++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 60 insertions(+), 15 deletions(-)
---
diff --git a/librsvg/rsvg-cairo-draw.c b/librsvg/rsvg-cairo-draw.c
index 9fe52025..8e37b0d7 100644
--- a/librsvg/rsvg-cairo-draw.c
+++ b/librsvg/rsvg-cairo-draw.c
@@ -338,6 +338,7 @@ rsvg_cairo_push_render_stack (RsvgDrawingCtx * ctx)
     const char *mask;
     guint8 opacity;
     cairo_operator_t comp_op;
+    RsvgEnableBackgroundType enable_background;
     cairo_surface_t *surface;
     cairo_t *child_cr;
     RsvgBbox *bbox;
@@ -350,6 +351,7 @@ rsvg_cairo_push_render_stack (RsvgDrawingCtx * ctx)
     mask = rsvg_state_get_mask (state);
     opacity = rsvg_state_get_opacity (state);
     comp_op = rsvg_state_get_comp_op (state);
+    enable_background = rsvg_state_get_enable_background (state);
 
     if (clip_path) {
         RsvgNode *node;
@@ -374,7 +376,7 @@ rsvg_cairo_push_render_stack (RsvgDrawingCtx * ctx)
 
     if (opacity == 0xFF
         && !filter && !mask && !lateclip && (comp_op == CAIRO_OPERATOR_OVER)
-        && (state->enable_background == RSVG_ENABLE_BACKGROUND_ACCUMULATE))
+        && (enable_background == RSVG_ENABLE_BACKGROUND_ACCUMULATE))
         return;
 
     if (!filter) {
@@ -433,6 +435,7 @@ rsvg_cairo_pop_render_stack (RsvgDrawingCtx * ctx)
     const char *mask;
     guint8 opacity;
     cairo_operator_t comp_op;
+    RsvgEnableBackgroundType enable_background;
     cairo_t *child_cr = render->cr;
     RsvgNode *lateclip = NULL;
     cairo_surface_t *surface = NULL;
@@ -444,6 +447,7 @@ rsvg_cairo_pop_render_stack (RsvgDrawingCtx * ctx)
     mask = rsvg_state_get_mask (state);
     opacity = rsvg_state_get_opacity (state);
     comp_op = rsvg_state_get_comp_op (state);
+    enable_background = rsvg_state_get_enable_background (state);
 
     if (clip_path) {
         RsvgNode *node;
@@ -460,7 +464,7 @@ rsvg_cairo_pop_render_stack (RsvgDrawingCtx * ctx)
 
     if (opacity == 0xFF
         && !filter && !mask && !lateclip && (comp_op == CAIRO_OPERATOR_OVER)
-        && (state->enable_background == RSVG_ENABLE_BACKGROUND_ACCUMULATE))
+        && (enable_background == RSVG_ENABLE_BACKGROUND_ACCUMULATE))
         return;
 
     surface = cairo_get_target (child_cr);
diff --git a/librsvg/rsvg-styles.c b/librsvg/rsvg-styles.c
index c709b33d..a41b6f23 100644
--- a/librsvg/rsvg-styles.c
+++ b/librsvg/rsvg-styles.c
@@ -54,6 +54,7 @@ extern State *rsvg_state_rust_clone(State *state);
 extern cairo_matrix_t rsvg_state_rust_get_affine(const State *state);
 extern void rsvg_state_rust_set_affine(State *state, cairo_matrix_t affine);
 extern cairo_operator_t rsvg_state_rust_get_comp_op(const State *state);
+extern RsvgEnableBackgroundType rsvg_state_rust_get_enable_background(const State *state);
 
 extern gboolean rsvg_state_rust_parse_style_pair(State *state, RsvgAttribute attr, const char *value)
     G_GNUC_WARN_UNUSED_RESULT;
@@ -129,7 +130,6 @@ rsvg_state_init (RsvgState * state)
     state->stop_opacity.kind = RSVG_OPACITY_INHERIT;
 
     state->clip_rule = CAIRO_FILL_RULE_WINDING;
-    state->enable_background = RSVG_ENABLE_BACKGROUND_ACCUMULATE;
     state->flood_color = 0;
     state->flood_opacity = 255;
 
@@ -394,7 +394,6 @@ rsvg_state_inherit_run (RsvgState * dst, const RsvgState * src,
         dst->mask = g_strdup (src->mask);
         g_free (dst->filter);
         dst->filter = g_strdup (src->filter);
-        dst->enable_background = src->enable_background;
         dst->opacity = src->opacity;
     }
 }
@@ -622,15 +621,6 @@ rsvg_parse_style_pair (RsvgState *state,
     }
     break;
 
-    case RSVG_ATTRIBUTE_ENABLE_BACKGROUND:
-    {
-        if (g_str_equal (value, "new"))
-            state->enable_background = RSVG_ENABLE_BACKGROUND_NEW;
-        else
-            state->enable_background = RSVG_ENABLE_BACKGROUND_ACCUMULATE;
-    }
-    break;
-
     case RSVG_ATTRIBUTE_DISPLAY:
     {
         state->has_visible = TRUE;
@@ -1653,6 +1643,12 @@ rsvg_state_get_comp_op (RsvgState *state)
     return rsvg_state_rust_get_comp_op (state->state_rust);
 }
 
+RsvgEnableBackgroundType
+rsvg_state_get_enable_background (RsvgState *state)
+{
+    return rsvg_state_rust_get_enable_background (state->state_rust);
+}
+
 State *
 rsvg_state_get_state_rust (RsvgState *state)
 {
diff --git a/librsvg/rsvg-styles.h b/librsvg/rsvg-styles.h
index e51d2510..1edf82fa 100644
--- a/librsvg/rsvg-styles.h
+++ b/librsvg/rsvg-styles.h
@@ -36,6 +36,7 @@
 
 G_BEGIN_DECLS 
 
+/* Keep in sync with rust/src/state.c:EnableBackgroundC */
 typedef enum {
     RSVG_ENABLE_BACKGROUND_ACCUMULATE,
     RSVG_ENABLE_BACKGROUND_NEW
@@ -113,8 +114,6 @@ struct _RsvgState {
     gboolean has_middleMarker;
     gboolean has_endMarker;
 
-    RsvgEnableBackgroundType enable_background;
-
     cairo_antialias_t shape_rendering_type;
     gboolean has_shape_rendering_type;
 
@@ -242,6 +241,9 @@ cairo_antialias_t rsvg_state_get_text_rendering_type (RsvgState *state);
 G_GNUC_INTERNAL
 cairo_operator_t rsvg_state_get_comp_op (RsvgState *state);
 
+G_GNUC_INTERNAL
+RsvgEnableBackgroundType rsvg_state_get_enable_background (RsvgState *state);
+
 G_GNUC_INTERNAL
 void rsvg_state_dominate (RsvgState *state, const RsvgState *src);
 
diff --git a/rsvg_internals/src/lib.rs b/rsvg_internals/src/lib.rs
index 32534a2b..7fcbe8c0 100644
--- a/rsvg_internals/src/lib.rs
+++ b/rsvg_internals/src/lib.rs
@@ -130,6 +130,7 @@ pub use state::{
     rsvg_state_rust_free,
     rsvg_state_rust_get_affine,
     rsvg_state_rust_get_comp_op,
+    rsvg_state_rust_get_enable_background,
     rsvg_state_rust_inherit_run,
     rsvg_state_rust_new,
     rsvg_state_rust_parse_style_pair,
diff --git a/rsvg_internals/src/state.rs b/rsvg_internals/src/state.rs
index f85d8320..7dbadcdd 100644
--- a/rsvg_internals/src/state.rs
+++ b/rsvg_internals/src/state.rs
@@ -42,6 +42,7 @@ pub struct State {
     pub font_size: Option<FontSize>,
     pub font_style: Option<FontStyle>,
     pub font_variant: Option<FontVariant>,
+    pub enable_background: Option<EnableBackground>,
     pub letter_spacing: Option<LetterSpacing>,
     pub overflow: Option<Overflow>,
     pub stroke_line_cap: Option<StrokeLinecap>,
@@ -67,6 +68,7 @@ impl State {
             font_size: Default::default(),
             font_style: Default::default(),
             font_variant: Default::default(),
+            enable_background: Default::default(),
             letter_spacing: Default::default(),
             overflow: Default::default(),
             stroke_line_cap: Default::default(),
@@ -111,6 +113,10 @@ impl State {
                 self.font_variant = parse_property(value, ())?;
             }
 
+            Attribute::EnableBackground => {
+                self.enable_background = parse_property(value, ())?;
+            }
+
             Attribute::LetterSpacing => {
                 self.letter_spacing = parse_property(value, LengthDir::Horizontal)?;
             }
@@ -524,6 +530,16 @@ make_property!(
     "small-caps" => SmallCaps,
 );
 
+make_property!(
+    EnableBackground,
+    default: Accumulate,
+    inherits_automatically: false,
+
+    identifiers:
+    "accumulate" => Accumulate,
+    "new" => New,
+);
+
 make_property!(
     LetterSpacing,
     default: RsvgLength::default(),
@@ -751,6 +767,7 @@ pub extern "C" fn rsvg_state_rust_inherit_run(
 
     if from_glib(inheritunheritables) {
         dst.comp_op.clone_from(&src.comp_op);
+        dst.enable_background.clone_from(&src.enable_background);
     }
 }
 
@@ -777,3 +794,28 @@ pub extern "C" fn rsvg_state_rust_get_comp_op(state: *const State) -> cairo::Ope
         cairo::Operator::from(state.comp_op.unwrap_or_default())
     }
 }
+
+// Keep in sync with rsvg-styles.h:RsvgEnableBackgroundType
+#[allow(dead_code)]
+#[repr(C)]
+pub enum EnableBackgroundC {
+    Accumulate,
+    New,
+}
+
+impl From<EnableBackground> for EnableBackgroundC {
+    fn from(e: EnableBackground) -> EnableBackgroundC {
+        match e {
+            EnableBackground::Accumulate => EnableBackgroundC::Accumulate,
+            EnableBackground::New => EnableBackgroundC::New,
+        }
+    }
+}
+
+#[no_mangle]
+pub extern "C" fn rsvg_state_rust_get_enable_background(state: *const State) -> EnableBackgroundC {
+    unsafe {
+        let state = &*state;
+        EnableBackgroundC::from(state.enable_background.unwrap_or_default())
+    }
+}


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