[librsvg: 1/15] state: port StrokeMiterlimit to rust



commit 2d40ddde7047f1f216d7250c2487ea6ba9b5ee66
Author: Paolo Borelli <pborelli gnome org>
Date:   Thu Apr 5 19:49:04 2018 +0200

    state: port StrokeMiterlimit to rust

 librsvg/rsvg-styles.c       | 17 -----------------
 librsvg/rsvg-styles.h       |  5 -----
 rsvg_internals/src/draw.rs  | 16 ++++++++++++++--
 rsvg_internals/src/state.rs | 23 ++++++++++++++++++-----
 4 files changed, 32 insertions(+), 29 deletions(-)
---
diff --git a/librsvg/rsvg-styles.c b/librsvg/rsvg-styles.c
index e376b5ec..359a8019 100644
--- a/librsvg/rsvg-styles.c
+++ b/librsvg/rsvg-styles.c
@@ -116,7 +116,6 @@ rsvg_state_init (RsvgState * state)
     state->fill_opacity = 0xff;
     state->stroke_opacity = 0xff;
     state->stroke_width = rsvg_length_parse ("1", LENGTH_DIR_BOTH);
-    state->miter_limit = 4;
 
     /* The following two start as INHERIT, even though has_stop_color and
      * has_stop_opacity get initialized to FALSE below.  This is so that the
@@ -155,7 +154,6 @@ rsvg_state_init (RsvgState * state)
     state->has_stroke_server = FALSE;
     state->has_stroke_opacity = FALSE;
     state->has_stroke_width = FALSE;
-    state->has_miter_limit = FALSE;
     state->has_dash = FALSE;
     state->has_dashoffset = FALSE;
     state->has_visible = FALSE;
@@ -329,8 +327,6 @@ rsvg_state_inherit_run (RsvgState * dst, const RsvgState * src,
         dst->stroke_opacity = src->stroke_opacity;
     if (function (dst->has_stroke_width, src->has_stroke_width))
         dst->stroke_width = src->stroke_width;
-    if (function (dst->has_miter_limit, src->has_miter_limit))
-        dst->miter_limit = src->miter_limit;
     if (function (dst->has_stop_color, src->has_stop_color)) {
         if (dst->stop_color.kind == RSVG_CSS_COLOR_SPEC_INHERIT) {
             dst->has_stop_color = TRUE;
@@ -900,13 +896,6 @@ rsvg_parse_style_pair (RsvgState *state,
     }
     break;
 
-    case RSVG_ATTRIBUTE_STROKE_MITERLIMIT:
-    {
-        state->has_miter_limit = TRUE;
-        state->miter_limit = g_ascii_strtod (value, NULL);
-    }
-    break;
-
     case RSVG_ATTRIBUTE_STROKE_DASHOFFSET:
     {
         state->has_dashoffset = TRUE;
@@ -1585,12 +1574,6 @@ rsvg_state_get_stroke_width (RsvgState *state)
     return state->stroke_width;
 }
 
-double
-rsvg_state_get_miter_limit (RsvgState *state)
-{
-    return state->miter_limit;
-}
-
 gboolean
 rsvg_state_get_cond_true (RsvgState *state)
 {
diff --git a/librsvg/rsvg-styles.h b/librsvg/rsvg-styles.h
index ae01b586..b6869a4c 100644
--- a/librsvg/rsvg-styles.h
+++ b/librsvg/rsvg-styles.h
@@ -68,8 +68,6 @@ struct _RsvgState {
     gboolean has_stroke_opacity;
     RsvgLength stroke_width;
     gboolean has_stroke_width;
-    double miter_limit;
-    gboolean has_miter_limit;
 
     PangoWeight font_weight;
     gboolean has_font_weight;
@@ -182,9 +180,6 @@ guint8 rsvg_state_get_stroke_opacity (RsvgState *state);
 G_GNUC_INTERNAL
 RsvgLength rsvg_state_get_stroke_width (RsvgState *state);
 
-G_GNUC_INTERNAL
-double rsvg_state_get_miter_limit (RsvgState *state);
-
 G_GNUC_INTERNAL
 gboolean rsvg_state_get_cond_true (RsvgState *state);
 
diff --git a/rsvg_internals/src/draw.rs b/rsvg_internals/src/draw.rs
index df5f1e24..7c68a161 100644
--- a/rsvg_internals/src/draw.rs
+++ b/rsvg_internals/src/draw.rs
@@ -10,7 +10,14 @@ use float_eq_cairo::ApproxEqCairo;
 use length::StrokeDasharray;
 use paint_server;
 use path_builder::PathBuilder;
-use state::{self, FillRule, RsvgState, StrokeLinecap, StrokeLinejoin};
+use state::{
+    self,
+    FillRule,
+    RsvgState,
+    StrokeLinecap,
+    StrokeLinejoin,
+    StrokeMiterlimit,
+};
 use text;
 
 pub fn draw_path_builder(draw_ctx: *mut RsvgDrawingCtx, builder: &PathBuilder, clipping: bool) {
@@ -126,7 +133,12 @@ fn setup_cr_for_stroke(
     let rstate = state::get_state_rust(state);
 
     cr.set_line_width(state::get_stroke_width(state).normalize(draw_ctx));
-    cr.set_miter_limit(state::get_miter_limit(state));
+    cr.set_miter_limit(
+        rstate
+            .stroke_miterlimit
+            .as_ref()
+            .map_or_else(|| StrokeMiterlimit::default().0, |l| l.0),
+    );
     cr.set_line_cap(cairo::LineCap::from(
         rstate.stroke_line_cap.unwrap_or_default(),
     ));
diff --git a/rsvg_internals/src/state.rs b/rsvg_internals/src/state.rs
index 6781d98c..4aea408a 100644
--- a/rsvg_internals/src/state.rs
+++ b/rsvg_internals/src/state.rs
@@ -45,6 +45,7 @@ pub struct State {
     pub overflow: Option<Overflow>,
     pub stroke_line_cap: Option<StrokeLinecap>,
     pub stroke_line_join: Option<StrokeLinejoin>,
+    pub stroke_miterlimit: Option<StrokeMiterlimit>,
     pub text_anchor: Option<TextAnchor>,
     pub text_decoration: Option<TextDecoration>,
     pub unicode_bidi: Option<UnicodeBidi>,
@@ -68,6 +69,7 @@ impl State {
             overflow: Default::default(),
             stroke_line_cap: Default::default(),
             stroke_line_join: Default::default(),
+            stroke_miterlimit: Default::default(),
             text_anchor: Default::default(),
             text_decoration: Default::default(),
             xml_lang: Default::default(),
@@ -119,6 +121,10 @@ impl State {
                 self.stroke_line_join = parse_property(value, ())?;
             }
 
+            Attribute::StrokeMiterlimit => {
+                self.stroke_miterlimit = parse_property(value, ())?;
+            }
+
             Attribute::TextAnchor => {
                 self.text_anchor = parse_property(value, ())?;
             }
@@ -190,7 +196,6 @@ extern "C" {
     fn rsvg_state_get_stroke(state: *const RsvgState) -> *const PaintServer;
     fn rsvg_state_get_stroke_opacity(state: *const RsvgState) -> u8;
     fn rsvg_state_get_stroke_width(state: *const RsvgState) -> RsvgLength;
-    fn rsvg_state_get_miter_limit(state: *const RsvgState) -> f64;
     fn rsvg_state_get_text_dir(state: *const RsvgState) -> pango_sys::PangoDirection;
     fn rsvg_state_get_text_gravity(state: *const RsvgState) -> pango_sys::PangoGravity;
     fn rsvg_state_get_font_weight(state: *const RsvgState) -> pango_sys::PangoWeight;
@@ -344,10 +349,6 @@ pub fn get_stroke_width(state: *const RsvgState) -> RsvgLength {
     unsafe { rsvg_state_get_stroke_width(state) }
 }
 
-pub fn get_miter_limit(state: *const RsvgState) -> f64 {
-    unsafe { rsvg_state_get_miter_limit(state) }
-}
-
 pub fn get_text_dir(state: *const RsvgState) -> pango::Direction {
     unsafe { from_glib(rsvg_state_get_text_dir(state)) }
 }
@@ -540,6 +541,13 @@ make_property!(
     "bevel" => Bevel,
 );
 
+make_property!(
+    StrokeMiterlimit,
+    default: 4f64,
+    inherits_automatically: true,
+    newtype_from_str: f64
+);
+
 make_property!(
     TextDecoration,
     inherits_automatically: true,
@@ -696,6 +704,11 @@ pub extern "C" fn rsvg_state_rust_inherit_run(
     inherit(inherit_fn, &mut dst.overflow, &src.overflow);
     inherit(inherit_fn, &mut dst.stroke_line_cap, &src.stroke_line_cap);
     inherit(inherit_fn, &mut dst.stroke_line_join, &src.stroke_line_join);
+    inherit(
+        inherit_fn,
+        &mut dst.stroke_miterlimit,
+        &src.stroke_miterlimit,
+    );
     inherit(inherit_fn, &mut dst.text_anchor, &src.text_anchor);
     inherit(inherit_fn, &mut dst.text_decoration, &src.text_decoration);
     inherit(inherit_fn, &mut dst.unicode_bidi, &src.unicode_bidi);


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