X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fdisplay%2Fcanvas-text.cpp;h=e2bc096793967eb9247481e379efbb330083130e;hb=0dc33d4ce43e0bb49c63aa53b826ec4a1ff68e28;hp=c38d16d65fa7b5a9f39b3af9b08e9e664731d053;hpb=045dbd46344e3ca3c53f678c2d3b4087fbbcacb7;p=inkscape.git diff --git a/src/display/canvas-text.cpp b/src/display/canvas-text.cpp index c38d16d65..e2bc09679 100644 --- a/src/display/canvas-text.cpp +++ b/src/display/canvas-text.cpp @@ -13,25 +13,25 @@ * Released under GNU GPL, read the file 'COPYING' for more information */ -#include "display-forward.h" #include "sp-canvas-util.h" #include "canvas-text.h" #include "display/inkscape-cairo.h" #include +#include +#include "desktop.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif #include -#include #include static void sp_canvastext_class_init (SPCanvasTextClass *klass); static void sp_canvastext_init (SPCanvasText *canvastext); static void sp_canvastext_destroy (GtkObject *object); -static void sp_canvastext_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int flags); +static void sp_canvastext_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags); static void sp_canvastext_render (SPCanvasItem *item, SPCanvasBuf *buf); static SPCanvasItemClass *parent_class_ct; @@ -43,7 +43,7 @@ sp_canvastext_get_type (void) if (!type) { GtkTypeInfo info = { - "SPCanvasText", + (gchar *)"SPCanvasText", sizeof (SPCanvasText), sizeof (SPCanvasTextClass), (GtkClassInitFunc) sp_canvastext_class_init, @@ -72,11 +72,13 @@ sp_canvastext_class_init (SPCanvasTextClass *klass) static void sp_canvastext_init (SPCanvasText *canvastext) { - canvastext->rgba = 0x0000ff7f; - canvastext->s[NR::X] = canvastext->s[NR::Y] = 0.0; - canvastext->affine = NR::identity(); + canvastext->rgba = 0x33337fff; + canvastext->rgba_stroke = 0xffffffff; + canvastext->s[Geom::X] = canvastext->s[Geom::Y] = 0.0; + canvastext->affine = Geom::identity(); canvastext->fontsize = 10.0; canvastext->item = NULL; + canvastext->desktop = NULL; canvastext->text = NULL; } @@ -88,14 +90,16 @@ sp_canvastext_destroy (GtkObject *object) SPCanvasText *canvastext = SP_CANVASTEXT (object); - canvastext->item=NULL; + g_free(canvastext->text); + canvastext->text = NULL; + canvastext->item = NULL; if (GTK_OBJECT_CLASS (parent_class_ct)->destroy) (* GTK_OBJECT_CLASS (parent_class_ct)->destroy) (object); } // FIXME: remove this as soon as we know how to correctly determine the text extent -static const double arbitrary_factor = 0.7; +static const double arbitrary_factor = 0.8; // these are set in sp_canvastext_update() and then re-used in sp_canvastext_render(), which is called afterwards static double anchor_offset_x = 0; @@ -109,25 +113,27 @@ sp_canvastext_render (SPCanvasItem *item, SPCanvasBuf *buf) if (!buf->ct) return; - guint32 rgba = cl->rgba; - cairo_set_source_rgba(buf->ct, SP_RGBA32_B_F(rgba), SP_RGBA32_G_F(rgba), SP_RGBA32_R_F(rgba), SP_RGBA32_A_F(rgba)); - - NR::Point s = cl->s * cl->affine; - double offsetx = s[NR::X] - buf->rect.x0; - double offsety = s[NR::Y] - buf->rect.y0; + Geom::Point s = cl->s * cl->affine; + double offsetx = s[Geom::X] - buf->rect.x0; + double offsety = s[Geom::Y] - buf->rect.y0; offsetx -= anchor_offset_x; offsety += anchor_offset_y; cairo_move_to(buf->ct, offsetx, offsety); cairo_set_font_size(buf->ct, cl->fontsize); - cairo_show_text(buf->ct, cl->text); - cairo_stroke(buf->ct); + cairo_text_path(buf->ct, cl->text); + + cairo_set_source_rgba(buf->ct, SP_RGBA32_B_F(cl->rgba_stroke), SP_RGBA32_G_F(cl->rgba_stroke), SP_RGBA32_R_F(cl->rgba_stroke), SP_RGBA32_A_F(cl->rgba_stroke)); + cairo_set_line_width (buf->ct, 2.0); + cairo_stroke_preserve(buf->ct); + cairo_set_source_rgba(buf->ct, SP_RGBA32_B_F(cl->rgba), SP_RGBA32_G_F(cl->rgba), SP_RGBA32_R_F(cl->rgba), SP_RGBA32_A_F(cl->rgba)); + cairo_fill(buf->ct); cairo_new_path(buf->ct); } static void -sp_canvastext_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int flags) +sp_canvastext_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags) { SPCanvasText *cl = SP_CANVASTEXT (item); @@ -140,7 +146,7 @@ sp_canvastext_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int cl->affine = affine; - NR::Point s = cl->s * affine; + Geom::Point s = cl->s * affine; // 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 @@ -149,10 +155,10 @@ sp_canvastext_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int cairo_text_extents_t bbox; cairo_text_extents(&tmp_buf, cl->text, &bbox); **/ - item->x1 = s[NR::X] + 0; - item->y1 = s[NR::Y] - cl->fontsize; - item->x2 = s[NR::X] + cl->fontsize * strlen(cl->text); - item->y2 = s[NR::Y] + cl->fontsize * 0.5; // for letters below the baseline + 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 // adjust update region according to anchor shift // FIXME: use the correct text extent @@ -167,12 +173,14 @@ sp_canvastext_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int } SPCanvasItem * -sp_canvastext_new(SPCanvasGroup *parent, Geom::Point pos, char *new_text) +sp_canvastext_new(SPCanvasGroup *parent, SPDesktop *desktop, Geom::Point pos, gchar const *new_text) { SPCanvasItem *item = sp_canvas_item_new(parent, SP_TYPE_CANVASTEXT, NULL); SPCanvasText *ct = SP_CANVASTEXT(item); + ct->desktop = desktop; + ct->s = pos; g_free(ct->text); ct->text = g_strdup(new_text); @@ -184,18 +192,17 @@ sp_canvastext_new(SPCanvasGroup *parent, Geom::Point pos, char *new_text) void -sp_canvastext_set_rgba32 (SPCanvasText *ct, guint32 rgba) +sp_canvastext_set_rgba32 (SPCanvasText *ct, guint32 rgba, guint32 rgba_stroke) { g_return_if_fail (ct != NULL); g_return_if_fail (SP_IS_CANVASTEXT (ct)); - if (rgba != ct->rgba) { - SPCanvasItem *item; + if (rgba != ct->rgba || rgba_stroke != ct->rgba_stroke) { ct->rgba = rgba; - item = SP_CANVAS_ITEM (ct); - sp_canvas_request_redraw (item->canvas, (int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2); + ct->rgba_stroke = rgba_stroke; + SPCanvasItem *item = SP_CANVAS_ITEM (ct); + sp_canvas_item_request_update( item ); } - sp_canvas_item_request_update (SP_CANVAS_ITEM (ct)); } #define EPSILON 1e-6 @@ -204,25 +211,26 @@ sp_canvastext_set_rgba32 (SPCanvasText *ct, guint32 rgba) void sp_canvastext_set_coords (SPCanvasText *ct, gdouble x0, gdouble y0) { + sp_canvastext_set_coords(ct, Geom::Point(x0, y0)); +} + +void +sp_canvastext_set_coords (SPCanvasText *ct, const Geom::Point start) +{ + Geom::Point pos = ct->desktop->doc2dt(start); + g_return_if_fail (ct != NULL); g_return_if_fail (SP_IS_CANVASTEXT (ct)); - if (DIFFER (x0, ct->s[NR::X]) || DIFFER (y0, ct->s[NR::Y])) { - ct->s[NR::X] = x0; - ct->s[NR::Y] = y0; + if (DIFFER (pos[0], ct->s[Geom::X]) || DIFFER (pos[1], ct->s[Geom::Y])) { + ct->s[Geom::X] = pos[0]; + ct->s[Geom::Y] = pos[1]; sp_canvas_item_request_update (SP_CANVAS_ITEM (ct)); } - sp_canvas_item_request_update (SP_CANVAS_ITEM (ct)); -} - -void -sp_canvastext_set_coords (SPCanvasText *ct, const NR::Point start) -{ - sp_canvastext_set_coords(ct, start[0], start[1]); } void -sp_canvastext_set_text (SPCanvasText *ct, const char* new_text) +sp_canvastext_set_text (SPCanvasText *ct, gchar const * new_text) { g_free (ct->text); ct->text = g_strdup(new_text); @@ -250,6 +258,7 @@ sp_canvastext_set_anchor (SPCanvasText *ct, double anchor_x, double anchor_y) ct->anchor_y = anchor_y; } + /* Local Variables: mode:c++ @@ -259,4 +268,4 @@ sp_canvastext_set_anchor (SPCanvasText *ct, double anchor_x, double anchor_y) fill-column:99 End: */ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :