static void _rsvg_node_text_draw (RsvgNode * self, RsvgDrawingCtx * ctx, int dominate) { double x, y; gboolean lastwasspace = TRUE; RsvgNodeText *text = (RsvgNodeText *) self; rsvg_state_reinherit_top (ctx, self->state, dominate); x = _rsvg_css_normalize_length (&text->x, ctx, 'h'); y = _rsvg_css_normalize_length (&text->y, ctx, 'v'); x += _rsvg_css_normalize_length (&text->dx, ctx, 'h'); y += _rsvg_css_normalize_length (&text->dy, ctx, 'v'); if (rsvg_current_state (ctx)->text_anchor != TEXT_ANCHOR_START) { double length = 0; _rsvg_node_text_length_children (self, ctx, &length, &lastwasspace); if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_END) x -= length; if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_MIDDLE) x -= length / 2; } lastwasspace = TRUE; _rsvg_node_text_type_children (self, ctx, &x, &y, &lastwasspace); }
static void _rsvg_node_text_type_tref (RsvgNodeTref * self, RsvgDrawingCtx * ctx, gdouble * x, gdouble * y, gboolean * lastwasspace) { if (self->link) _rsvg_node_text_type_children (self->link, ctx, x, y, lastwasspace); }
static void _rsvg_node_text_type_tspan (RsvgNodeText * self, RsvgDrawingCtx * ctx, gdouble * x, gdouble * y, gboolean * lastwasspace, gboolean usetextonly) { double dx, dy, length = 0; rsvg_state_reinherit_top (ctx, self->super.state, 0); dx = _rsvg_css_normalize_length (&self->dx, ctx, 'h'); dy = _rsvg_css_normalize_length (&self->dy, ctx, 'v'); if (rsvg_current_state (ctx)->text_anchor != TEXT_ANCHOR_START) { gboolean lws = *lastwasspace; _rsvg_node_text_length_children (&self->super, ctx, &length, &lws, usetextonly); if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_MIDDLE) length /= 2; } if (self->x.factor != 'n') { *x = _rsvg_css_normalize_length (&self->x, ctx, 'h'); if (!PANGO_GRAVITY_IS_VERTICAL (rsvg_current_state (ctx)->text_gravity)) { *x -= length; if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_MIDDLE) dx /= 2; if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_END) dx = 0; } } *x += dx; if (self->y.factor != 'n') { *y = _rsvg_css_normalize_length (&self->y, ctx, 'v'); if (PANGO_GRAVITY_IS_VERTICAL (rsvg_current_state (ctx)->text_gravity)) { *y -= length; if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_MIDDLE) dy /= 2; if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_END) dy = 0; } } *y += dy; _rsvg_node_text_type_children (&self->super, ctx, x, y, lastwasspace, usetextonly); }
static void _rsvg_node_text_type_tref (RsvgNodeTref * self, RsvgDrawingCtx * ctx, gdouble * x, gdouble * y, gboolean * lastwasspace, gboolean usetextonly) { RsvgNode *link; if (self->link == NULL) return; link = rsvg_acquire_node (ctx, self->link); if (link == NULL) return; _rsvg_node_text_type_children (link, ctx, x, y, lastwasspace, TRUE); rsvg_release_node (ctx, link); }
static void _rsvg_node_text_type_children (RsvgNode * self, RsvgDrawingCtx * ctx, gdouble * x, gdouble * y, gboolean * lastwasspace, gboolean usetextonly) { guint i; rsvg_push_discrete_layer (ctx); for (i = 0; i < self->children->len; i++) { RsvgNode *node = g_ptr_array_index (self->children, i); RsvgNodeType type = RSVG_NODE_TYPE (node); if (type == RSVG_NODE_TYPE_CHARS) { RsvgNodeChars *chars = (RsvgNodeChars *) node; GString *str = _rsvg_text_chomp (rsvg_current_state (ctx), chars->contents, lastwasspace); rsvg_text_render_text (ctx, str->str, x, y); g_string_free (str, TRUE); } else { if (usetextonly) { _rsvg_node_text_type_children (node, ctx, x, y, lastwasspace, usetextonly); } else { if (type == RSVG_NODE_TYPE_TSPAN) { RsvgNodeText *tspan = (RsvgNodeText *) node; rsvg_state_push (ctx); _rsvg_node_text_type_tspan (tspan, ctx, x, y, lastwasspace, usetextonly); rsvg_state_pop (ctx); } else if (type == RSVG_NODE_TYPE_TREF) { RsvgNodeTref *tref = (RsvgNodeTref *) node; _rsvg_node_text_type_tref (tref, ctx, x, y, lastwasspace, usetextonly); } else if (type == RSVG_NODE_TYPE_TEXT_PATH) { RsvgNodeTextPath *textpath = (RsvgNodeTextPath *) node; _rsvg_node_text_type_text_path(textpath, ctx, x, y, lastwasspace, usetextonly); } } } } rsvg_pop_discrete_layer (ctx); }
static void _rsvg_node_text_draw (RsvgNode * self, RsvgDrawingCtx * ctx, int dominate) { double x, y, dx, dy, length = 0; gboolean lastwasspace = TRUE; RsvgNodeText *text = (RsvgNodeText *) self; rsvg_state_reinherit_top (ctx, self->state, dominate); x = _rsvg_css_normalize_length (&text->x, ctx, 'h'); y = _rsvg_css_normalize_length (&text->y, ctx, 'v'); dx = _rsvg_css_normalize_length (&text->dx, ctx, 'h'); dy = _rsvg_css_normalize_length (&text->dy, ctx, 'v'); if (rsvg_current_state (ctx)->text_anchor != TEXT_ANCHOR_START) { _rsvg_node_text_length_children (self, ctx, &length, &lastwasspace, FALSE); if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_MIDDLE) length /= 2; } if (PANGO_GRAVITY_IS_VERTICAL (rsvg_current_state (ctx)->text_gravity)) { y -= length; if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_MIDDLE) dy /= 2; if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_END) dy = 0; } else { x -= length; if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_MIDDLE) dx /= 2; if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_END) dx = 0; } x += dx; y += dy; lastwasspace = TRUE; _rsvg_node_text_type_children (self, ctx, &x, &y, &lastwasspace, FALSE); }
static void _rsvg_node_text_type_tspan (RsvgNodeText * self, RsvgDrawingCtx * ctx, gdouble * x, gdouble * y, gboolean * lastwasspace) { rsvg_state_reinherit_top (ctx, self->super.state, 0); if (self->x.factor != 'n') { *x = _rsvg_css_normalize_length (&self->x, ctx, 'h'); if (rsvg_current_state (ctx)->text_anchor != TEXT_ANCHOR_START) { double length = 0; gboolean lws = *lastwasspace; _rsvg_node_text_length_children (&self->super, ctx, &length, &lws); if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_END) *x -= length; if (rsvg_current_state (ctx)->text_anchor == TEXT_ANCHOR_MIDDLE) *x -= length / 2; } } if (self->y.factor != 'n') *y = _rsvg_css_normalize_length (&self->y, ctx, 'v'); *x += _rsvg_css_normalize_length (&self->dx, ctx, 'h'); *y += _rsvg_css_normalize_length (&self->dy, ctx, 'v'); _rsvg_node_text_type_children (&self->super, ctx, x, y, lastwasspace); }