diff options
| author | Felipe Corr??a da Silva Sanches <juca@members.fsf.org> | 2011-06-21 09:09:08 +0000 |
|---|---|---|
| committer | Felipe C. da S. Sanches <juca@members.fsf.org> | 2011-06-21 09:09:08 +0000 |
| commit | d7855fbb9be54daf2b8f3b9bfe15b9e2b9afe7d8 (patch) | |
| tree | 9744fdf9a098dd5a97243a55712a19759aa8d05d /src | |
| parent | address sissue with measure tool described here: (diff) | |
| download | inkscape-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')
| -rw-r--r-- | src/display/canvas-text.cpp | 45 | ||||
| -rw-r--r-- | src/display/canvas-text.h | 4 | ||||
| -rw-r--r-- | src/measure-context.cpp | 8 |
3 files changed, 45 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; diff --git a/src/display/canvas-text.h b/src/display/canvas-text.h index a621e655c..bd3bd18d4 100644 --- a/src/display/canvas-text.h +++ b/src/display/canvas-text.h @@ -27,6 +27,10 @@ struct SPCanvasText : public SPCanvasItem { SPItem *item; // the item to which this line belongs in some sense; may be NULL for some users guint32 rgba; guint32 rgba_stroke; + guint32 rgba_background; + bool outline; + bool background; + SPDesktop *desktop; // the desktop to which this text is attached; needed for coordinate transforms (TODO: these should be eliminated) gchar* text; diff --git a/src/measure-context.cpp b/src/measure-context.cpp index 75cb0d589..dc2bb09e3 100644 --- a/src/measure-context.cpp +++ b/src/measure-context.cpp @@ -342,6 +342,10 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv SPCanvasItem *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop), desktop, desktop->dt2doc(measure_text_pos), measure_str); sp_canvastext_set_fontsize (SP_CANVASTEXT(canvas_tooltip), fontsize); + SP_CANVASTEXT(canvas_tooltip)->rgba = 0xffffffff; + SP_CANVASTEXT(canvas_tooltip)->rgba_background = 0x0000007f; + SP_CANVASTEXT(canvas_tooltip)->outline = false; + SP_CANVASTEXT(canvas_tooltip)->background = true; measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0)); free(measure_str); @@ -353,6 +357,10 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv SPCanvasItem *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop), desktop, end_point + desktop->w2d(Geom::Point(5*fontsize,0)), angle_str); sp_canvastext_set_fontsize (SP_CANVASTEXT(canvas_tooltip), fontsize); sp_canvastext_set_rgba32 (SP_CANVASTEXT(canvas_tooltip), 0x337f33ff, 0xffffffff); + SP_CANVASTEXT(canvas_tooltip)->rgba = 0xffffffff; + SP_CANVASTEXT(canvas_tooltip)->rgba_background = 0x337f337f; + SP_CANVASTEXT(canvas_tooltip)->outline = false; + SP_CANVASTEXT(canvas_tooltip)->background = true; measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0)); free(angle_str); |
