[librsvg: 12/15] state: move font weight to rust



commit 07d497bda8ea981094c8fcb65e9799d92b5dbebe
Author: Paolo Borelli <pborelli gnome org>
Date:   Sat Apr 7 21:43:28 2018 +0200

    state: move font weight to rust

 librsvg/rsvg-css.c          | 51 ---------------------------------------------
 librsvg/rsvg-css.h          |  3 ---
 librsvg/rsvg-styles.c       | 16 --------------
 librsvg/rsvg-styles.h       |  5 -----
 rsvg_internals/src/state.rs | 33 ++++++++++++++++++++++++-----
 rsvg_internals/src/text.rs  | 23 +++++++++++++++++++-
 6 files changed, 50 insertions(+), 81 deletions(-)
---
diff --git a/librsvg/rsvg-css.c b/librsvg/rsvg-css.c
index 21d59c47..2b5e80d8 100644
--- a/librsvg/rsvg-css.c
+++ b/librsvg/rsvg-css.c
@@ -36,21 +36,9 @@
 #ifdef HAVE_STRINGS_H
 #include <strings.h>
 #endif
-#include <errno.h>
-#include <math.h>
 
 #include <libxml/parser.h>
 
-#include <libcroco/libcroco.h>
-
-#define POINTS_PER_INCH (72.0)
-#define CM_PER_INCH     (2.54)
-#define MM_PER_INCH     (25.4)
-#define PICA_PER_INCH   (6.0)
-
-#define SETINHERIT() G_STMT_START {if (inherit != NULL) *inherit = TRUE;} G_STMT_END
-#define UNSETINHERIT() G_STMT_START {if (inherit != NULL) *inherit = FALSE;} G_STMT_END
-
 /* This is defined like this so that we can export the Rust function... just for
  * the benefit of rsvg-convert.c
  */
@@ -61,45 +49,6 @@ RsvgCssColorSpec rsvg_css_parse_color_ (const char       *str,
     return rsvg_css_parse_color (str, allow_inherit, allow_current_color);
 }
 
-PangoWeight
-rsvg_css_parse_font_weight (const char *str, gboolean * inherit)
-{
-    SETINHERIT ();
-    if (str) {
-        if (!strcmp (str, "lighter"))
-            return PANGO_WEIGHT_LIGHT;
-        else if (!strcmp (str, "bold"))
-            return PANGO_WEIGHT_BOLD;
-        else if (!strcmp (str, "bolder"))
-            return PANGO_WEIGHT_ULTRABOLD;
-        else if (!strcmp (str, "100"))
-            return (PangoWeight) 100;
-        else if (!strcmp (str, "200"))
-            return (PangoWeight) 200;
-        else if (!strcmp (str, "300"))
-            return (PangoWeight) 300;
-        else if (!strcmp (str, "400"))
-            return (PangoWeight) 400;
-        else if (!strcmp (str, "500"))
-            return (PangoWeight) 500;
-        else if (!strcmp (str, "600"))
-            return (PangoWeight) 600;
-        else if (!strcmp (str, "700"))
-            return (PangoWeight) 700;
-        else if (!strcmp (str, "800"))
-            return (PangoWeight) 800;
-        else if (!strcmp (str, "900"))
-            return (PangoWeight) 900;
-        else if (!strcmp (str, "inherit")) {
-            UNSETINHERIT ();
-            return PANGO_WEIGHT_NORMAL;
-        }
-    }
-
-    UNSETINHERIT ();
-    return PANGO_WEIGHT_NORMAL;
-}
-
 static void
 rsvg_xml_noerror (void *data, xmlErrorPtr error)
 {
diff --git a/librsvg/rsvg-css.h b/librsvg/rsvg-css.h
index 1913f718..402c2c07 100644
--- a/librsvg/rsvg-css.h
+++ b/librsvg/rsvg-css.h
@@ -89,9 +89,6 @@ typedef struct {
 G_GNUC_INTERNAL
 RsvgOpacitySpec rsvg_css_parse_opacity (const char *str);
 
-G_GNUC_INTERNAL
-PangoWeight     rsvg_css_parse_font_weight         (const char *str, gboolean * inherit);
-
 /* Implemented in rust/src/parsers.rs */
 G_GNUC_INTERNAL
 gboolean rsvg_css_parse_number_optional_number (const char *str, double *out_x, double *out_y);
diff --git a/librsvg/rsvg-styles.c b/librsvg/rsvg-styles.c
index 57b68a48..aa8ceb39 100644
--- a/librsvg/rsvg-styles.c
+++ b/librsvg/rsvg-styles.c
@@ -117,7 +117,6 @@ rsvg_state_init (RsvgState * state)
     state->flood_color = 0;
     state->flood_opacity = 255;
 
-    state->font_weight = PANGO_WEIGHT_NORMAL;
     state->text_dir = PANGO_DIRECTION_LTR;
     state->text_gravity = PANGO_GRAVITY_SOUTH;
     state->cond_true = TRUE;
@@ -139,7 +138,6 @@ rsvg_state_init (RsvgState * state)
     state->has_cond = FALSE;
     state->has_stop_color = FALSE;
     state->has_stop_opacity = FALSE;
-    state->has_font_weight = FALSE;
     state->has_text_dir = FALSE;
     state->has_text_gravity = FALSE;
     state->has_startMarker = FALSE;
@@ -311,8 +309,6 @@ rsvg_state_inherit_run (RsvgState * dst, const RsvgState * src,
     }
     if (function (dst->has_cond, src->has_cond))
         dst->cond_true = src->cond_true;
-    if (function (dst->has_font_weight, src->has_font_weight))
-        dst->font_weight = src->font_weight;
     if (function (dst->has_text_dir, src->has_text_dir))
         dst->text_dir = src->text_dir;
     if (function (dst->has_text_gravity, src->has_text_gravity))
@@ -633,12 +629,6 @@ rsvg_parse_style_pair (RsvgState *state,
     }
     break;
 
-    case RSVG_ATTRIBUTE_FONT_WEIGHT:
-    {
-        state->font_weight = rsvg_css_parse_font_weight (value, &state->has_font_weight);
-    }
-    break;
-
     case RSVG_ATTRIBUTE_DIRECTION:
     {
         state->has_text_dir = TRUE;
@@ -1470,12 +1460,6 @@ rsvg_state_get_text_gravity (RsvgState *state)
     return state->text_gravity;
 }
 
-PangoWeight
-rsvg_state_get_font_weight (RsvgState *state)
-{
-    return state->font_weight;
-}
-
 RsvgPaintServer *
 rsvg_state_get_fill (RsvgState *state)
 {
diff --git a/librsvg/rsvg-styles.h b/librsvg/rsvg-styles.h
index 664640fc..7f2f5c5b 100644
--- a/librsvg/rsvg-styles.h
+++ b/librsvg/rsvg-styles.h
@@ -66,8 +66,6 @@ struct _RsvgState {
     guint8 stroke_opacity;      /* 0..255 */
     gboolean has_stroke_opacity;
 
-    PangoWeight font_weight;
-    gboolean has_font_weight;
     PangoDirection text_dir;
     gboolean has_text_dir;
     PangoGravity text_gravity;
@@ -202,9 +200,6 @@ PangoDirection rsvg_state_get_text_dir (RsvgState *state);
 G_GNUC_INTERNAL
 PangoGravity rsvg_state_get_text_gravity (RsvgState *state);
 
-G_GNUC_INTERNAL
-PangoWeight rsvg_state_get_font_weight (RsvgState *state);
-
 G_GNUC_INTERNAL
 RsvgPaintServer *rsvg_state_get_fill (RsvgState *state);
 
diff --git a/rsvg_internals/src/state.rs b/rsvg_internals/src/state.rs
index 950d7a96..93946184 100644
--- a/rsvg_internals/src/state.rs
+++ b/rsvg_internals/src/state.rs
@@ -44,6 +44,7 @@ pub struct State {
     pub font_stretch: Option<FontStretch>,
     pub font_style: Option<FontStyle>,
     pub font_variant: Option<FontVariant>,
+    pub font_weight: Option<FontWeight>,
     pub display: Option<Display>,
     pub enable_background: Option<EnableBackground>,
     pub letter_spacing: Option<LetterSpacing>,
@@ -77,6 +78,7 @@ impl State {
             font_stretch: Default::default(),
             font_style: Default::default(),
             font_variant: Default::default(),
+            font_weight: Default::default(),
             display: Default::default(),
             enable_background: Default::default(),
             letter_spacing: Default::default(),
@@ -135,6 +137,10 @@ impl State {
                 self.font_variant = parse_property(value, ())?;
             }
 
+            Attribute::FontWeight => {
+                self.font_weight = parse_property(value, ())?;
+            }
+
             Attribute::Display => {
                 self.display = parse_property(value, ())?;
             }
@@ -249,7 +255,6 @@ extern "C" {
     fn rsvg_state_get_stroke_opacity(state: *const RsvgState) -> u8;
     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;
     fn rsvg_state_get_fill(state: *const RsvgState) -> *const PaintServer;
     fn rsvg_state_get_fill_opacity(state: *const RsvgState) -> u8;
 
@@ -404,10 +409,6 @@ pub fn get_text_gravity(state: *const RsvgState) -> pango::Gravity {
     unsafe { from_glib(rsvg_state_get_text_gravity(state)) }
 }
 
-pub fn get_font_weight(state: *const RsvgState) -> pango::Weight {
-    unsafe { from_glib(rsvg_state_get_font_weight(state)) }
-}
-
 pub fn get_fill<'a>(state: *const RsvgState) -> Option<&'a PaintServer> {
     unsafe {
         let ps = rsvg_state_get_fill(state);
@@ -587,6 +588,27 @@ make_property!(
     "small-caps" => SmallCaps,
 );
 
+make_property!(
+    FontWeight,
+    default: Normal,
+    inherits_automatically: true,
+
+    identifiers:
+    "normal" => Normal,
+    "bold" => Bold,
+    "bolder" => Bolder,
+    "lighter" => Lighter,
+    "100" => W100, // FIXME: we should use Weight(100),
+    "200" => W200, // but we need a smarter macro for that
+    "300" => W300,
+    "400" => W400,
+    "500" => W500,
+    "600" => W600,
+    "700" => W700,
+    "800" => W800,
+    "900" => W900,
+);
+
 make_property!(
     Display,
     default: Inline,
@@ -890,6 +912,7 @@ pub extern "C" fn rsvg_state_rust_inherit_run(
     inherit(inherit_fn, &mut dst.font_stretch, &src.font_stretch);
     inherit(inherit_fn, &mut dst.font_style, &src.font_style);
     inherit(inherit_fn, &mut dst.font_variant, &src.font_variant);
+    inherit(inherit_fn, &mut dst.font_weight, &src.font_weight);
     inherit(inherit_fn, &mut dst.display, &src.display);
     inherit(inherit_fn, &mut dst.letter_spacing, &src.letter_spacing);
     inherit(inherit_fn, &mut dst.overflow, &src.overflow);
diff --git a/rsvg_internals/src/text.rs b/rsvg_internals/src/text.rs
index 89ce2a46..4d5423b6 100644
--- a/rsvg_internals/src/text.rs
+++ b/rsvg_internals/src/text.rs
@@ -27,6 +27,7 @@ use state::{
     FontStretch,
     FontStyle,
     FontVariant,
+    FontWeight,
     LetterSpacing,
     RsvgState,
     TextAnchor,
@@ -430,6 +431,26 @@ impl From<FontStretch> for pango::Stretch {
     }
 }
 
+impl From<FontWeight> for pango::Weight {
+    fn from(w: FontWeight) -> pango::Weight {
+        match w {
+            FontWeight::Normal => pango::Weight::Normal,
+            FontWeight::Bold => pango::Weight::Bold,
+            FontWeight::Bolder => pango::Weight::Ultrabold,
+            FontWeight::Lighter => pango::Weight::Light,
+            FontWeight::W100 => pango::Weight::Thin,
+            FontWeight::W200 => pango::Weight::Ultralight,
+            FontWeight::W300 => pango::Weight::Semilight,
+            FontWeight::W400 => pango::Weight::Normal,
+            FontWeight::W500 => pango::Weight::Medium,
+            FontWeight::W600 => pango::Weight::Semibold,
+            FontWeight::W700 => pango::Weight::Bold,
+            FontWeight::W800 => pango::Weight::Ultrabold,
+            FontWeight::W900 => pango::Weight::Heavy,
+        }
+    }
+}
+
 fn create_pango_layout(draw_ctx: *const RsvgDrawingCtx, text: &str) -> pango::Layout {
     let state = drawing_ctx::get_current_state(draw_ctx);
     let rstate = state::get_state_rust(state);
@@ -465,7 +486,7 @@ fn create_pango_layout(draw_ctx: *const RsvgDrawingCtx, text: &str) -> pango::La
         rstate.font_variant.unwrap_or_default(),
     ));
 
-    font_desc.set_weight(state::get_font_weight(state));
+    font_desc.set_weight(pango::Weight::from(rstate.font_weight.unwrap_or_default()));
 
     font_desc.set_stretch(pango::Stretch::from(
         rstate.font_stretch.unwrap_or_default(),


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