[lasem] svg_text: add support for text-anchor.



commit 2ea0b172d9886c63af851f38f7806b0a8998352a
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Mon Aug 9 22:54:20 2010 +0200

    svg_text: add support for text-anchor.

 src/lsmsvgenums.c  |   23 +++++++++++++++++++++++
 src/lsmsvgenums.h  |   10 ++++++++++
 src/lsmsvgstyle.c  |    2 +-
 src/lsmsvgstyle.h  |    7 ++++++-
 src/lsmsvgtraits.c |   25 +++++++++++++++++++++++++
 src/lsmsvgtraits.h |    1 +
 src/lsmsvgview.c   |   12 ++++++++++++
 7 files changed, 78 insertions(+), 2 deletions(-)
---
diff --git a/src/lsmsvgenums.c b/src/lsmsvgenums.c
index 97d7e0a..1cfa97c 100644
--- a/src/lsmsvgenums.c
+++ b/src/lsmsvgenums.c
@@ -360,3 +360,26 @@ lsm_svg_font_weight_from_string (const char *string)
 			return -1;
 	}
 }
+
+static const char *lsm_svg_text_anchor_strings[] = {
+	"start",
+	"middle",
+	"end"
+};
+
+const char *
+lsm_svg_text_anchor_to_string (LsmSvgTextAnchor text_anchor)
+{
+	if (text_anchor < 0 || text_anchor > LSM_SVG_TEXT_ANCHOR_MIDDLE)
+		return NULL;
+
+	return lsm_svg_text_anchor_strings[text_anchor];
+}
+
+LsmSvgTextAnchor
+lsm_svg_text_anchor_from_string (const char *string)
+{
+	return lsm_enum_value_from_string (string, lsm_svg_text_anchor_strings,
+					   G_N_ELEMENTS (lsm_svg_text_anchor_strings));
+}
+
diff --git a/src/lsmsvgenums.h b/src/lsmsvgenums.h
index af75d2a..5dac966 100644
--- a/src/lsmsvgenums.h
+++ b/src/lsmsvgenums.h
@@ -231,6 +231,16 @@ const char * 		lsm_svg_font_weight_to_string 	(LsmSvgFontWeight font_weight);
 LsmSvgFontWeight	lsm_svg_font_weight_from_string	(const char *string);
 
 typedef enum {
+	LSM_SVG_TEXT_ANCHOR_ERROR = -1,
+	LSM_SVG_TEXT_ANCHOR_START,
+	LSM_SVG_TEXT_ANCHOR_MIDDLE,
+	LSM_SVG_TEXT_ANCHOR_END
+} LsmSvgTextAnchor;
+
+const char * 		lsm_svg_text_anchor_to_string 		(LsmSvgTextAnchor text_anchor);
+LsmSvgTextAnchor	lsm_svg_text_anchor_from_string		(const char *string);
+
+typedef enum {
 	LSM_SVG_ELEMENT_CATEGORY_NONE			= 1 << 0,
 	LSM_SVG_ELEMENT_CATEGORY_DESCRIPTIVE		= 1 << 1,
 	LSM_SVG_ELEMENT_CATEGORY_CONTAINER		= 1 << 2,
diff --git a/src/lsmsvgstyle.c b/src/lsmsvgstyle.c
index 707f9a5..a7ca03b 100644
--- a/src/lsmsvgstyle.c
+++ b/src/lsmsvgstyle.c
@@ -368,7 +368,7 @@ static const LsmPropertyInfos lsm_svg_property_infos[] = {
 	{
 		.name = "text-anchor",
 		.id = LSM_PROPERTY_OFFSET_TO_ID (LsmSvgStyle, text_anchor),
-		.trait_class = &lsm_null_trait_class,
+		.trait_class = &lsm_svg_text_anchor_trait_class,
 		.trait_default = "start"
 	},
 	{
diff --git a/src/lsmsvgstyle.h b/src/lsmsvgstyle.h
index aebad9a..c0a843f 100644
--- a/src/lsmsvgstyle.h
+++ b/src/lsmsvgstyle.h
@@ -88,6 +88,11 @@ typedef struct {
 	LsmSvgDashArray value;
 } LsmSvgDashArrayProperty;
 
+typedef struct {
+	LsmProperty base;
+	LsmSvgTextAnchor value;
+} LsmSvgTextAnchorProperty;
+
 struct _LsmSvgStyle {
 	/* Not inherited */
 
@@ -150,7 +155,7 @@ struct _LsmSvgStyle {
 	LsmSvgDoubleProperty *		stroke_miter_limit;
 	LsmSvgDoubleProperty *		stroke_opacity;
 	LsmSvgLengthProperty *		stroke_width;
-	LsmProperty *			text_anchor;
+	LsmSvgTextAnchorProperty *	text_anchor;
 	LsmProperty *			text_rendering;
 	LsmProperty *			visibility;
 	LsmProperty *			word_spacing;
diff --git a/src/lsmsvgtraits.c b/src/lsmsvgtraits.c
index 7c0348d..1e55c51 100644
--- a/src/lsmsvgtraits.c
+++ b/src/lsmsvgtraits.c
@@ -832,3 +832,28 @@ const LsmTraitClass lsm_svg_angle_trait_class = {
 	.from_string = lsm_svg_angle_trait_from_string,
 	.to_string = lsm_svg_angle_trait_to_string
 };
+
+static gboolean
+lsm_svg_text_anchor_trait_from_string (LsmTrait *abstract_trait, char *string)
+{
+	LsmSvgTextAnchor *trait = (LsmSvgTextAnchor *) abstract_trait;
+
+	*trait = lsm_svg_text_anchor_from_string (string);
+
+	return *trait >= 0;
+}
+
+char *
+lsm_svg_text_anchor_trait_to_string (LsmTrait *abstract_trait)
+{
+	LsmSvgTextAnchor *trait = (LsmSvgTextAnchor *) abstract_trait;
+
+	return g_strdup (lsm_svg_text_anchor_to_string (*trait));
+}
+
+const LsmTraitClass lsm_svg_text_anchor_trait_class = {
+	.size = sizeof (LsmSvgTextAnchor),
+	.from_string = lsm_svg_text_anchor_trait_from_string,
+	.to_string = lsm_svg_text_anchor_trait_to_string
+};
+
diff --git a/src/lsmsvgtraits.h b/src/lsmsvgtraits.h
index 76ee1e7..c639c7f 100644
--- a/src/lsmsvgtraits.h
+++ b/src/lsmsvgtraits.h
@@ -82,6 +82,7 @@ extern const LsmTraitClass lsm_svg_paint_trait_class;
 extern const LsmTraitClass lsm_svg_pattern_units_trait_class;
 extern const LsmTraitClass lsm_svg_preserve_aspect_ratio_trait_class;
 extern const LsmTraitClass lsm_svg_spread_method_trait_class;
+extern const LsmTraitClass lsm_svg_text_anchor_trait_class;
 
 G_END_DECLS
 
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index 2f4c314..0793859 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -1342,6 +1342,18 @@ lsm_svg_view_show_text (LsmSvgView *view, char const *string, double x, double y
 	x1 = x - pango_units_to_double (ink_rect.x);
 	y1 = y - pango_units_to_double (baseline);
 
+	switch (style->text_anchor->value) {
+		case LSM_SVG_TEXT_ANCHOR_END:
+			x1 -= pango_units_to_double (ink_rect.width);
+			break;
+		case LSM_SVG_TEXT_ANCHOR_MIDDLE:
+			x1 -= pango_units_to_double (ink_rect.width) / 2.0;
+			break;
+		case LSM_SVG_TEXT_ANCHOR_START:
+		default:
+			break;
+	}
+
 	cairo_move_to (view->dom_view.cairo, x1, y1);
 
 	pango_cairo_layout_path (view->dom_view.cairo, pango_layout);



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