[librsvg: 4/15] state: port enable-background to rust
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 4/15] state: port enable-background to rust
- Date: Sun, 8 Apr 2018 00:00:52 +0000 (UTC)
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]