summaryrefslogtreecommitdiffstats
path: root/src
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
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')
-rw-r--r--src/display/canvas-text.cpp45
-rw-r--r--src/display/canvas-text.h4
-rw-r--r--src/measure-context.cpp8
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);