summaryrefslogtreecommitdiffstats
path: root/src/display/canvas-text.cpp
diff options
context:
space:
mode:
authorFelipe Corr??a da Silva Sanches <juca@members.fsf.org>2011-06-21 09:09:08 +0000
committerFelipe C. da S. Sanches <juca@members.fsf.org>2011-06-21 09:09:08 +0000
commitd7855fbb9be54daf2b8f3b9bfe15b9e2b9afe7d8 (patch)
tree9744fdf9a098dd5a97243a55712a19759aa8d05d /src/display/canvas-text.cpp
parentaddress sissue with measure tool described here: (diff)
downloadinkscape-d7855fbb9be54daf2b8f3b9bfe15b9e2b9afe7d8.tar.gz
inkscape-d7855fbb9be54daf2b8f3b9bfe15b9e2b9afe7d8.zip
fix bug 800052: improve measure tool readability
https://bugs.launchpad.net/inkscape/+bug/800052 And also using text_extents for calculating area of rendering for the canvas_text labels (although I am not really sure this is correct. May require some extra work to get it right) (bzr r10329)
Diffstat (limited to 'src/display/canvas-text.cpp')
-rw-r--r--src/display/canvas-text.cpp45
1 files changed, 33 insertions, 12 deletions
diff --git a/src/display/canvas-text.cpp b/src/display/canvas-text.cpp
index 54cbe5da8..f598f8c59 100644
--- a/src/display/canvas-text.cpp
+++ b/src/display/canvas-text.cpp
@@ -74,6 +74,8 @@ sp_canvastext_init (SPCanvasText *canvastext)
{
canvastext->rgba = 0x33337fff;
canvastext->rgba_stroke = 0xffffffff;
+ canvastext->rgba_background = 0x0000007f;
+ canvastext->background = false;
canvastext->s[Geom::X] = canvastext->s[Geom::Y] = 0.0;
canvastext->affine = Geom::identity();
canvastext->fontsize = 10.0;
@@ -119,13 +121,29 @@ sp_canvastext_render (SPCanvasItem *item, SPCanvasBuf *buf)
offsetx -= anchor_offset_x;
offsety += anchor_offset_y;
+ if (cl->background){
+ cairo_text_extents_t extents;
+ cairo_text_extents(buf->ct, cl->text, &extents);
+
+ double border = extents.height*0.5;
+ cairo_rectangle(buf->ct, offsetx - extents.x_bearing - border,
+ offsety + extents.y_bearing - border,
+ extents.width + 2*border,
+ extents.height + 2*border);
+
+ ink_cairo_set_source_rgba32(buf->ct, cl->rgba_background);
+ cairo_fill(buf->ct);
+ }
+
cairo_move_to(buf->ct, offsetx, offsety);
cairo_set_font_size(buf->ct, cl->fontsize);
cairo_text_path(buf->ct, cl->text);
- ink_cairo_set_source_rgba32(buf->ct, cl->rgba_stroke);
- cairo_set_line_width (buf->ct, 2.0);
- cairo_stroke_preserve(buf->ct);
+ if (cl->outline){
+ ink_cairo_set_source_rgba32(buf->ct, cl->rgba_stroke);
+ cairo_set_line_width (buf->ct, 2.0);
+ cairo_stroke_preserve(buf->ct);
+ }
ink_cairo_set_source_rgba32(buf->ct, cl->rgba);
cairo_fill(buf->ct);
}
@@ -148,20 +166,23 @@ sp_canvastext_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned i
// set up a temporary cairo_t to measure the text extents; it would be better to compute this in the render()
// method but update() seems to be called before so we don't have the information available when we need it
- /**
- cairo_t tmp_buf;
- cairo_text_extents_t bbox;
- cairo_text_extents(&tmp_buf, cl->text, &bbox);
- **/
- item->x1 = s[Geom::X] + 0;
- item->y1 = s[Geom::Y] - cl->fontsize;
- item->x2 = s[Geom::X] + cl->fontsize * strlen(cl->text);
- item->y2 = s[Geom::Y] + cl->fontsize * 0.5; // for letters below the baseline
+ cairo_surface_t *tmp_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1, 1);
+ cairo_t* tmp_buf = cairo_create(tmp_surface);
+
+ cairo_text_extents_t extents;
+ cairo_text_extents(tmp_buf, cl->text, &extents);
+ double border = extents.height*1.5;
+
+ item->x1 = s[Geom::X] - extents.x_bearing - border;
+ item->y1 = s[Geom::Y] + extents.y_bearing - border;
+ item->x2 = s[Geom::X] + extents.width + border;
+ item->y2 = s[Geom::Y] + extents.height + border;
// adjust update region according to anchor shift
// FIXME: use the correct text extent
anchor_offset_x = arbitrary_factor * cl->fontsize * strlen(cl->text) * (cl->anchor_x + 1.0) / 2.0;
anchor_offset_y = cl->fontsize * (cl->anchor_y + 1.0) / 2.0;
+
item->x1 -= anchor_offset_x;
item->x2 -= anchor_offset_x;
item->y1 += anchor_offset_y;