[librsvg: 7/15] state: move shape-rendering to rust



commit 6f5bf214d5b2879d356bd55d35120727e3e5c559
Author: Paolo Borelli <pborelli gnome org>
Date:   Sat Apr 7 11:15:21 2018 +0200

    state: move shape-rendering to rust

 librsvg/rsvg-styles.c       | 33 ---------------------------------
 librsvg/rsvg-styles.h       |  6 ------
 rsvg_internals/src/draw.rs  | 15 ++++++++++++++-
 rsvg_internals/src/state.rs | 24 +++++++++++++++++++-----
 4 files changed, 33 insertions(+), 45 deletions(-)
---
diff --git a/librsvg/rsvg-styles.c b/librsvg/rsvg-styles.c
index 6d3ca5bf..6f18e008 100644
--- a/librsvg/rsvg-styles.c
+++ b/librsvg/rsvg-styles.c
@@ -61,13 +61,6 @@ extern gboolean rsvg_state_rust_parse_style_pair(State *state, RsvgAttribute att
 
 extern void rsvg_state_rust_inherit_run(State *dst, State *src, InheritanceFunction inherit_fn, gboolean 
inherituninheritables);
 
-enum {
-  SHAPE_RENDERING_AUTO = CAIRO_ANTIALIAS_DEFAULT,
-  SHAPE_RENDERING_OPTIMIZE_SPEED = CAIRO_ANTIALIAS_NONE,
-  SHAPE_RENDERING_CRISP_EDGES = CAIRO_ANTIALIAS_NONE,
-  SHAPE_RENDERING_GEOMETRIC_PRECISION = CAIRO_ANTIALIAS_DEFAULT
-};
-
 typedef struct _StyleValueData {
     gchar *value;
     gboolean important;
@@ -161,9 +154,6 @@ rsvg_state_init (RsvgState * state)
     state->has_middleMarker = FALSE;
     state->has_endMarker = FALSE;
 
-    state->shape_rendering_type = SHAPE_RENDERING_AUTO;
-    state->has_shape_rendering_type = FALSE;
-
     state->styles = g_hash_table_new_full (g_str_hash, g_str_equal,
                                            g_free, (GDestroyNotify) style_value_data_free);
 
@@ -353,8 +343,6 @@ rsvg_state_inherit_run (RsvgState * dst, const RsvgState * src,
         g_free (dst->endMarker);
         dst->endMarker = g_strdup (src->endMarker);
     }
-    if (function (dst->has_shape_rendering_type, src->has_shape_rendering_type))
-            dst->shape_rendering_type = src->shape_rendering_type;
 
     if (function (dst->has_visible, src->has_visible))
         dst->visible = src->visible;
@@ -829,21 +817,6 @@ rsvg_parse_style_pair (RsvgState *state,
     }
     break;
 
-    case RSVG_ATTRIBUTE_SHAPE_RENDERING:
-    {
-        state->has_shape_rendering_type = TRUE;
-
-        if (g_str_equal (value, "auto") || g_str_equal (value, "default"))
-            state->shape_rendering_type = SHAPE_RENDERING_AUTO;
-        else if (g_str_equal (value, "optimizeSpeed"))
-            state->shape_rendering_type = SHAPE_RENDERING_OPTIMIZE_SPEED;
-        else if (g_str_equal (value, "crispEdges"))
-            state->shape_rendering_type = SHAPE_RENDERING_CRISP_EDGES;
-        else if (g_str_equal (value, "geometricPrecision"))
-            state->shape_rendering_type = SHAPE_RENDERING_GEOMETRIC_PRECISION;
-    }
-    break;
-
     case RSVG_ATTRIBUTE_STROKE_DASHARRAY:
     {
         /* FIXME: the following returns NULL on error; find a way to propagate
@@ -1599,12 +1572,6 @@ rsvg_state_get_fill_opacity (RsvgState *state)
     return state->fill_opacity;
 }
 
-cairo_antialias_t
-rsvg_state_get_shape_rendering_type (RsvgState *state)
-{
-    return state->shape_rendering_type;
-}
-
 cairo_operator_t
 rsvg_state_get_comp_op (RsvgState *state)
 {
diff --git a/librsvg/rsvg-styles.h b/librsvg/rsvg-styles.h
index 72ea9b7b..dc756ee6 100644
--- a/librsvg/rsvg-styles.h
+++ b/librsvg/rsvg-styles.h
@@ -114,9 +114,6 @@ struct _RsvgState {
     gboolean has_middleMarker;
     gboolean has_endMarker;
 
-    cairo_antialias_t shape_rendering_type;
-    gboolean has_shape_rendering_type;
-
     GHashTable *styles;
 
     State *state_rust;
@@ -229,9 +226,6 @@ RsvgPaintServer *rsvg_state_get_fill (RsvgState *state);
 G_GNUC_INTERNAL
 guint8 rsvg_state_get_fill_opacity (RsvgState *state);
 
-G_GNUC_INTERNAL
-cairo_antialias_t rsvg_state_get_shape_rendering_type (RsvgState *state);
-
 G_GNUC_INTERNAL
 cairo_operator_t rsvg_state_get_comp_op (RsvgState *state);
 
diff --git a/rsvg_internals/src/draw.rs b/rsvg_internals/src/draw.rs
index 39106bd2..415fa24a 100644
--- a/rsvg_internals/src/draw.rs
+++ b/rsvg_internals/src/draw.rs
@@ -15,6 +15,7 @@ use state::{
     CompOp,
     FillRule,
     RsvgState,
+    ShapeRendering,
     StrokeLinecap,
     StrokeLinejoin,
     StrokeMiterlimit,
@@ -50,8 +51,11 @@ pub fn draw_path_builder(draw_ctx: *mut RsvgDrawingCtx, builder: &PathBuilder, c
 
 fn stroke_and_fill(cr: &cairo::Context, draw_ctx: *mut RsvgDrawingCtx) {
     let state = drawing_ctx::get_current_state(draw_ctx);
+    let rstate = state::get_state_rust(state);
 
-    cr.set_antialias(state::get_shape_rendering_type(state));
+    cr.set_antialias(cairo::Antialias::from(
+        rstate.shape_rendering.unwrap_or_default(),
+    ));
 
     setup_cr_for_stroke(cr, draw_ctx, state);
 
@@ -158,6 +162,15 @@ impl From<FillRule> for cairo::FillRule {
     }
 }
 
+impl From<ShapeRendering> for cairo::Antialias {
+    fn from(sr: ShapeRendering) -> cairo::Antialias {
+        match sr {
+            ShapeRendering::Auto | ShapeRendering::GeometricPrecision => cairo::Antialias::Default,
+            ShapeRendering::OptimizeSpeed | ShapeRendering::CrispEdges => cairo::Antialias::None,
+        }
+    }
+}
+
 impl From<TextRendering> for cairo::Antialias {
     fn from(tr: TextRendering) -> cairo::Antialias {
         match tr {
diff --git a/rsvg_internals/src/state.rs b/rsvg_internals/src/state.rs
index 0ad7ce82..a6ded039 100644
--- a/rsvg_internals/src/state.rs
+++ b/rsvg_internals/src/state.rs
@@ -45,6 +45,7 @@ pub struct State {
     pub enable_background: Option<EnableBackground>,
     pub letter_spacing: Option<LetterSpacing>,
     pub overflow: Option<Overflow>,
+    pub shape_rendering: Option<ShapeRendering>,
     pub stroke_line_cap: Option<StrokeLinecap>,
     pub stroke_line_join: Option<StrokeLinejoin>,
     pub stroke_miterlimit: Option<StrokeMiterlimit>,
@@ -72,6 +73,7 @@ impl State {
             enable_background: Default::default(),
             letter_spacing: Default::default(),
             overflow: Default::default(),
+            shape_rendering: Default::default(),
             stroke_line_cap: Default::default(),
             stroke_line_join: Default::default(),
             stroke_miterlimit: Default::default(),
@@ -127,6 +129,10 @@ impl State {
                 self.overflow = parse_property(value, ())?;
             }
 
+            Attribute::ShapeRendering => {
+                self.shape_rendering = parse_property(value, ())?;
+            }
+
             Attribute::StrokeLinecap => {
                 self.stroke_line_cap = parse_property(value, ())?;
             }
@@ -209,7 +215,6 @@ extern "C" {
     fn rsvg_state_get_stroke_dasharray(state: *const RsvgState) -> *const StrokeDasharray;
     fn rsvg_state_get_dash_offset(state: *const RsvgState) -> RsvgLength;
     fn rsvg_state_get_current_color(state: *const RsvgState) -> u32;
-    fn rsvg_state_get_shape_rendering_type(state: *const RsvgState) -> cairo::Antialias;
     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;
@@ -337,10 +342,6 @@ pub fn get_current_color(state: *const RsvgState) -> Color {
     Color::from(argb)
 }
 
-pub fn get_shape_rendering_type(state: *const RsvgState) -> cairo::Antialias {
-    unsafe { rsvg_state_get_shape_rendering_type(state) }
-}
-
 pub fn get_stroke<'a>(state: *const RsvgState) -> Option<&'a PaintServer> {
     unsafe {
         let ps = rsvg_state_get_stroke(state);
@@ -569,6 +570,18 @@ make_property!(
     "auto" => Auto,
 );
 
+make_property!(
+    ShapeRendering,
+    default: Auto,
+    inherits_automatically: true,
+
+    identifiers:
+    "auto" => Auto,
+    "optimizeSpeed" => OptimizeSpeed,
+    "geometricPrecision" => GeometricPrecision,
+    "crispEdges" => CrispEdges,
+);
+
 make_property!(
     StrokeLinecap,
     default: Butt,
@@ -765,6 +778,7 @@ pub extern "C" fn rsvg_state_rust_inherit_run(
     inherit(inherit_fn, &mut dst.font_variant, &src.font_variant);
     inherit(inherit_fn, &mut dst.letter_spacing, &src.letter_spacing);
     inherit(inherit_fn, &mut dst.overflow, &src.overflow);
+    inherit(inherit_fn, &mut dst.shape_rendering, &src.shape_rendering);
     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(


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