From 2a2fdd05d381fec92606ee648138c3093dfadc29 Mon Sep 17 00:00:00 2001 From: lclausen Date: Sat, 25 Nov 2006 21:26:43 +0000 Subject: [PATCH] More text_line happiness --- ChangeLog | 9 +++++++ lib/diagdkrenderer.c | 30 +++++---------------- lib/dialibartrenderer.c | 71 +++++++++++++++++++++---------------------------- 3 files changed, 47 insertions(+), 63 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4d393f89..d40bb5db 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2006-11-25 Lars Clausen + * lib/diagdkrenderer.c: Make highlighted area match text area, and + use text_line in get_text_width. These should later be + superfluous due to increased use of text_line at higher levels. + + * lib/dialibartrenderer.c: Implement text_line based rendering of + text. Works. Also get_text_width uses a text_line. Text + bounding box is still a little off, but that will help once + text_line is used in the text system. + * lib/arrows.c (arrow_get_name_from_type): Function to get arrow names, and proper error messages when a loaded diagram has bad arrows. Finally fixes bug #144394, thanks to both Pontus Pihlgren diff --git a/lib/diagdkrenderer.c b/lib/diagdkrenderer.c index 40a45175..4ad67140 100644 --- a/lib/diagdkrenderer.c +++ b/lib/diagdkrenderer.c @@ -598,15 +598,6 @@ fill_ellipse (DiaRenderer *object, Point *center, fill_arc(object, center, width, height, 0.0, 360.0, color); } -static gint -get_layout_first_baseline(PangoLayout* layout) -{ - PangoLayoutIter* iter = pango_layout_get_iter(layout); - gint result = pango_layout_iter_get_baseline(iter) / PANGO_SCALE; - pango_layout_iter_free(iter); - return result; -} - /* Draw a highlighted version of a string. */ static void @@ -633,7 +624,6 @@ draw_string (DiaRenderer *object, Color *color) { TextLine *text_line = text_line_new(text, object->font, object->font_height); - real width = text_line_get_width(text_line); Point realigned_pos = *pos; realigned_pos.x -= text_line_get_alignment_adjustment(text_line, alignment); draw_text_line(object, text_line, &realigned_pos, color); @@ -685,7 +675,6 @@ draw_text_line (DiaRenderer *object, TextLine *text_line, { DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); GdkColor gdkcolor; - Alignment alignment = ALIGN_LEFT; int x,y; Point start_pos; PangoLayout* layout = NULL; @@ -738,11 +727,11 @@ draw_text_line (DiaRenderer *object, TextLine *text_line, layout = dia_font_build_layout(text, text_line->font, dia_transform_length(renderer->transform, text_line->height)/20.0); + text_line_adjust_layout_line(text_line, pango_layout_get_line(layout, 0), + scale/20.0); if (renderer->highlight_color != NULL) { draw_highlighted_string(renderer, layout, x, y, &gdkcolor); } else { - text_line_adjust_layout_line(text_line, pango_layout_get_line(layout, 0), - scale/20.0); #if defined HAVE_FREETYPE { FT_Bitmap ftbitmap; @@ -833,6 +822,7 @@ get_text_width(DiaRenderer *object, { DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); real result; + TextLine *text_line; if (length != strlen(text)) { char *othertx; @@ -843,18 +833,12 @@ get_text_width(DiaRenderer *object, g_warning ("Text at char %d not valid\n", length); } othertx = g_strndup(text, ulen); - result = dia_font_scaled_string_width( - othertx,object->font, - object->font_height, - dia_transform_length (renderer->transform, 10.0) / 10.0); - g_free(othertx); + text_line = text_line_new(othertx, object->font, object->font_height); } else { - result = - dia_font_scaled_string_width( - text,object->font, - object->font_height, - dia_transform_length (renderer->transform, 10.0) / 10.0); + text_line = text_line_new(text, object->font, object->font_height); } + result = text_line_get_width(text_line); + text_line_destroy(text_line); return result; } diff --git a/lib/dialibartrenderer.c b/lib/dialibartrenderer.c index fd967b22..80a9b655 100644 --- a/lib/dialibartrenderer.c +++ b/lib/dialibartrenderer.c @@ -29,6 +29,7 @@ #include "intl.h" #include "dia_image.h" #include "object.h" +#include "textline.h" #ifdef HAVE_LIBART @@ -1060,12 +1061,9 @@ draw_highlighted_string(DiaLibartRenderer *renderer, art_svp_free( svp ); } - static void -draw_string (DiaRenderer *self, - const gchar *text, - Point *pos, Alignment alignment, - Color *color) +draw_text_line(DiaRenderer *self, TextLine *text_line, + Point *pos, Color *color) { DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); /* Not working with Pango */ @@ -1078,7 +1076,8 @@ draw_string (DiaRenderer *self, double affine[6], tmpaffine[6]; guint32 rgba; int rowstride; - double font_height; + gchar *text = text_line_get_string(text_line); + real scale = dia_transform_length(renderer->transform, 1.0); point_copy(&start_pos,pos); @@ -1092,34 +1091,18 @@ draw_string (DiaRenderer *self, old_zoom = ddisp->zoom_factor; ddisp->zoom_factor = ddisp->zoom_factor; */ - switch (alignment) { - case ALIGN_LEFT: - break; - case ALIGN_CENTER: - start_pos.x -= dia_font_scaled_string_width( - text, self->font, - self->font_height, - dia_transform_length(renderer->transform, 1.0))/2; - break; - case ALIGN_RIGHT: - start_pos.x -= dia_font_scaled_string_width( - text, self->font, - self->font_height, - dia_transform_length(renderer->transform, 1.0)); - break; - } - font_height = dia_transform_length(renderer->transform, self->font_height); + start_pos.y -= text_line_get_ascent(text_line); - start_pos.y -= dia_font_scaled_ascent(text, self->font, - self->font_height, - dia_transform_length(renderer->transform, 1.0)); dia_transform_coords_double(renderer->transform, start_pos.x, start_pos.y, &x, &y); - layout = dia_font_scaled_build_layout( - text, self->font, self->font_height, - dia_transform_length(renderer->transform, 1.0)); + layout = dia_font_build_layout(text, text_line->font, + dia_transform_length(renderer->transform, + text_line_get_height(text_line)) / 20.0); + + text_line_adjust_layout_line(text_line, pango_layout_get_line(layout, 0), + scale/20.0); if (renderer->highlight_color != NULL) { draw_highlighted_string(renderer, layout, start_pos.x, start_pos.y, rgba); @@ -1130,7 +1113,6 @@ draw_string (DiaRenderer *self, /* ddisp->zoom_factor = old_zoom; */ - pango_layout_get_pixel_size(layout, &width, &height); /* Pango doesn't have a 'render to raw bits' function, so we have * to render based on what other engines are available. @@ -1225,6 +1207,19 @@ draw_string (DiaRenderer *self, #undef DEPTH } +static void +draw_string (DiaRenderer *self, + const gchar *text, + Point *pos, Alignment alignment, + Color *color) +{ + TextLine *text_line = text_line_new(text, self->font, self->font_height); + Point realigned_pos = *pos; + realigned_pos.x -= text_line_get_alignment_adjustment(text_line, alignment); + draw_text_line(self, text_line, &realigned_pos, color); +} + + /* Get the width of the given text in cm */ static real get_text_width(DiaRenderer *object, @@ -1232,6 +1227,7 @@ get_text_width(DiaRenderer *object, { DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (object); real result; + TextLine *text_line; if (length != strlen(text)) { char *othertx; @@ -1242,18 +1238,12 @@ get_text_width(DiaRenderer *object, g_warning ("Text at char %d not valid\n", length); } othertx = g_strndup(text, ulen); - result = dia_font_scaled_string_width( - othertx,object->font, - object->font_height, - dia_transform_length (renderer->transform, 10.0) / 10.0); - g_free(othertx); + text_line = text_line_new(othertx, object->font, object->font_height); } else { - result = - dia_font_scaled_string_width( - text,object->font, - object->font_height, - dia_transform_length (renderer->transform, 10.0) / 10.0); + text_line = text_line_new(text, object->font, object->font_height); } + result = text_line_get_width(text_line); + text_line_destroy(text_line); return result; } @@ -1446,6 +1436,7 @@ dia_libart_renderer_class_init (DiaLibartRendererClass *klass) renderer_class->fill_bezier = fill_bezier; renderer_class->draw_string = draw_string; + renderer_class->draw_text_line = draw_text_line; renderer_class->draw_image = draw_image; -- 2.11.4.GIT