[librsvg: 12/15] state: move font weight to rust
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 12/15] state: move font weight to rust
- Date: Sun, 8 Apr 2018 00:01:32 +0000 (UTC)
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]