[librsvg: 6/15] state: move text-rendering to rust



commit 91313fb140baf4921f2d9843180348dc9fed54c8
Author: Paolo Borelli <pborelli gnome org>
Date:   Sat Apr 7 11:01:57 2018 +0200

    state: move text-rendering to rust

 librsvg/rsvg-styles.c       | 32 --------------------------------
 librsvg/rsvg-styles.h       |  6 ------
 rsvg_internals/src/draw.rs  | 33 ++++++++++++++++++++++++++++-----
 rsvg_internals/src/state.rs | 34 ++++++++++++++++++++++++----------
 4 files changed, 52 insertions(+), 53 deletions(-)
---
diff --git a/librsvg/rsvg-styles.c b/librsvg/rsvg-styles.c
index a41b6f23..6d3ca5bf 100644
--- a/librsvg/rsvg-styles.c
+++ b/librsvg/rsvg-styles.c
@@ -68,13 +68,6 @@ enum {
   SHAPE_RENDERING_GEOMETRIC_PRECISION = CAIRO_ANTIALIAS_DEFAULT
 };
 
-enum {
-  TEXT_RENDERING_AUTO = CAIRO_ANTIALIAS_DEFAULT,
-  TEXT_RENDERING_OPTIMIZE_SPEED = CAIRO_ANTIALIAS_NONE,
-  TEXT_RENDERING_OPTIMIZE_LEGIBILITY = CAIRO_ANTIALIAS_DEFAULT,
-  TEXT_RENDERING_GEOMETRIC_PRECISION = CAIRO_ANTIALIAS_DEFAULT
-};
-
 typedef struct _StyleValueData {
     gchar *value;
     gboolean important;
@@ -170,8 +163,6 @@ rsvg_state_init (RsvgState * state)
 
     state->shape_rendering_type = SHAPE_RENDERING_AUTO;
     state->has_shape_rendering_type = FALSE;
-    state->text_rendering_type = TEXT_RENDERING_AUTO;
-    state->has_text_rendering_type = FALSE;
 
     state->styles = g_hash_table_new_full (g_str_hash, g_str_equal,
                                            g_free, (GDestroyNotify) style_value_data_free);
@@ -364,8 +355,6 @@ rsvg_state_inherit_run (RsvgState * dst, const RsvgState * src,
     }
     if (function (dst->has_shape_rendering_type, src->has_shape_rendering_type))
             dst->shape_rendering_type = src->shape_rendering_type;
-    if (function (dst->has_text_rendering_type, src->has_text_rendering_type))
-            dst->text_rendering_type = src->text_rendering_type;
 
     if (function (dst->has_visible, src->has_visible))
         dst->visible = src->visible;
@@ -855,21 +844,6 @@ rsvg_parse_style_pair (RsvgState *state,
     }
     break;
 
-    case RSVG_ATTRIBUTE_TEXT_RENDERING:
-    {
-        state->has_text_rendering_type = TRUE;
-
-        if (g_str_equal (value, "auto") || g_str_equal (value, "default"))
-            state->text_rendering_type = TEXT_RENDERING_AUTO;
-        else if (g_str_equal (value, "optimizeSpeed"))
-            state->text_rendering_type = TEXT_RENDERING_OPTIMIZE_SPEED;
-        else if (g_str_equal (value, "optimizeLegibility"))
-            state->text_rendering_type = TEXT_RENDERING_OPTIMIZE_LEGIBILITY;
-        else if (g_str_equal (value, "geometricPrecision"))
-            state->text_rendering_type = TEXT_RENDERING_GEOMETRIC_PRECISION;
-    }
-    break;
-
     case RSVG_ATTRIBUTE_STROKE_DASHARRAY:
     {
         /* FIXME: the following returns NULL on error; find a way to propagate
@@ -1631,12 +1605,6 @@ rsvg_state_get_shape_rendering_type (RsvgState *state)
     return state->shape_rendering_type;
 }
 
-cairo_antialias_t
-rsvg_state_get_text_rendering_type (RsvgState *state)
-{
-    return state->text_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 1edf82fa..72ea9b7b 100644
--- a/librsvg/rsvg-styles.h
+++ b/librsvg/rsvg-styles.h
@@ -117,9 +117,6 @@ struct _RsvgState {
     cairo_antialias_t shape_rendering_type;
     gboolean has_shape_rendering_type;
 
-    cairo_antialias_t text_rendering_type;
-    gboolean has_text_rendering_type;
-
     GHashTable *styles;
 
     State *state_rust;
@@ -235,9 +232,6 @@ 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_antialias_t rsvg_state_get_text_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 0bbc4e81..39106bd2 100644
--- a/rsvg_internals/src/draw.rs
+++ b/rsvg_internals/src/draw.rs
@@ -10,7 +10,16 @@ use float_eq_cairo::ApproxEqCairo;
 use length::StrokeDasharray;
 use paint_server;
 use path_builder::PathBuilder;
-use state::{self, CompOp, FillRule, RsvgState, StrokeLinecap, StrokeLinejoin, StrokeMiterlimit};
+use state::{
+    self,
+    CompOp,
+    FillRule,
+    RsvgState,
+    StrokeLinecap,
+    StrokeLinejoin,
+    StrokeMiterlimit,
+    TextRendering,
+};
 use text;
 
 pub fn draw_path_builder(draw_ctx: *mut RsvgDrawingCtx, builder: &PathBuilder, clipping: bool) {
@@ -149,6 +158,17 @@ impl From<FillRule> for cairo::FillRule {
     }
 }
 
+impl From<TextRendering> for cairo::Antialias {
+    fn from(tr: TextRendering) -> cairo::Antialias {
+        match tr {
+            TextRendering::Auto
+            | TextRendering::OptimizeLegibility
+            | TextRendering::GeometricPrecision => cairo::Antialias::Default,
+            TextRendering::OptimizeSpeed => cairo::Antialias::None,
+        }
+    }
+}
+
 fn setup_cr_for_stroke(
     cr: &cairo::Context,
     draw_ctx: *const RsvgDrawingCtx,
@@ -255,7 +275,8 @@ pub fn draw_pango_layout(
     clipping: bool,
 ) {
     let state = drawing_ctx::get_current_state(draw_ctx);
-    let rust_state = state::get_state_rust(state);
+    let rstate = state::get_state_rust(state);
+
     let cr = drawing_ctx::get_cairo_context(draw_ctx);
     let gravity = layout.get_context().unwrap().get_gravity();
 
@@ -265,7 +286,7 @@ pub fn draw_pango_layout(
         return;
     }
 
-    let bbox = compute_text_bbox(&ink, x, y, &rust_state.affine, gravity);
+    let bbox = compute_text_bbox(&ink, x, y, &rstate.affine, gravity);
 
     let fill = state::get_fill(state);
     let stroke = state::get_stroke(state);
@@ -274,11 +295,13 @@ pub fn draw_pango_layout(
         drawing_ctx::insert_bbox(draw_ctx, &bbox);
     }
 
-    cr.set_antialias(state::get_text_rendering_type(state));
+    cr.set_antialias(cairo::Antialias::from(
+        rstate.text_rendering.unwrap_or_default(),
+    ));
 
     setup_cr_for_stroke(&cr, draw_ctx, state);
 
-    drawing_ctx::set_affine_on_cr(draw_ctx, &cr, &rust_state.affine);
+    drawing_ctx::set_affine_on_cr(draw_ctx, &cr, &rstate.affine);
 
     let rotation = unsafe { pango_sys::pango_gravity_to_rotation(gravity.to_glib()) };
 
diff --git a/rsvg_internals/src/state.rs b/rsvg_internals/src/state.rs
index 7dbadcdd..0ad7ce82 100644
--- a/rsvg_internals/src/state.rs
+++ b/rsvg_internals/src/state.rs
@@ -50,6 +50,7 @@ pub struct State {
     pub stroke_miterlimit: Option<StrokeMiterlimit>,
     pub text_anchor: Option<TextAnchor>,
     pub text_decoration: Option<TextDecoration>,
+    pub text_rendering: Option<TextRendering>,
     pub unicode_bidi: Option<UnicodeBidi>,
     pub xml_lang: Option<XmlLang>,
     pub xml_space: Option<XmlSpace>,
@@ -76,6 +77,7 @@ impl State {
             stroke_miterlimit: Default::default(),
             text_anchor: Default::default(),
             text_decoration: Default::default(),
+            text_rendering: Default::default(),
             xml_lang: Default::default(),
             unicode_bidi: Default::default(),
             xml_space: Default::default(),
@@ -145,6 +147,10 @@ impl State {
                 self.text_decoration = parse_property(value, ())?;
             }
 
+            Attribute::TextRendering => {
+                self.text_rendering = parse_property(value, ())?;
+            }
+
             Attribute::UnicodeBidi => {
                 self.unicode_bidi = parse_property(value, ())?;
             }
@@ -204,7 +210,6 @@ extern "C" {
     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_text_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;
@@ -336,10 +341,6 @@ pub fn get_shape_rendering_type(state: *const RsvgState) -> cairo::Antialias {
     unsafe { rsvg_state_get_shape_rendering_type(state) }
 }
 
-pub fn get_text_rendering_type(state: *const RsvgState) -> cairo::Antialias {
-    unsafe { rsvg_state_get_text_rendering_type(state) }
-}
-
 pub fn get_stroke<'a>(state: *const RsvgState) -> Option<&'a PaintServer> {
     unsafe {
         let ps = rsvg_state_get_stroke(state);
@@ -597,6 +598,17 @@ make_property!(
     newtype_from_str: f64
 );
 
+make_property!(
+    TextAnchor,
+    default: Start,
+    inherits_automatically: true,
+
+    identifiers:
+    "start" => Start,
+    "middle" => Middle,
+    "end" => End,
+);
+
 make_property!(
     TextDecoration,
     inherits_automatically: true,
@@ -621,14 +633,15 @@ impl Parse for TextDecoration {
 }
 
 make_property!(
-    TextAnchor,
-    default: Start,
+    TextRendering,
+    default: Auto,
     inherits_automatically: true,
 
     identifiers:
-    "start" => Start,
-    "middle" => Middle,
-    "end" => End,
+    "auto" => Auto,
+    "optimizeSpeed" => OptimizeSpeed,
+    "optimizeLegibility" => OptimizeLegibility,
+    "geometricPrecision" => GeometricPrecision,
 );
 
 make_property!(
@@ -761,6 +774,7 @@ pub extern "C" fn rsvg_state_rust_inherit_run(
     );
     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.text_rendering, &src.text_rendering);
     inherit(inherit_fn, &mut dst.unicode_bidi, &src.unicode_bidi);
     inherit(inherit_fn, &mut dst.xml_lang, &src.xml_lang);
     inherit(inherit_fn, &mut dst.xml_space, &src.xml_space);


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