diff options
Diffstat (limited to 'src/images/renderedText.vala')
-rw-r--r-- | src/images/renderedText.vala | 81 |
1 files changed, 51 insertions, 30 deletions
diff --git a/src/images/renderedText.vala b/src/images/renderedText.vala index 41146d6..e99d26a 100644 --- a/src/images/renderedText.vala +++ b/src/images/renderedText.vala @@ -50,39 +50,60 @@ public class RenderedText : Image { public void render_text(string text, int width, int height, string font, Color color, double scale) { - + this.surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, width, height); - var ctx = this.context(); - - // set the color - ctx.set_source_rgb(color.r, color.g, color.g); - - var layout = Pango.cairo_create_layout(ctx); - layout.set_width(Pango.units_from_double(width)); - - var font_description = Pango.FontDescription.from_string(font); - font_description.set_size((int)(font_description.get_size() * scale)); - - layout.set_font_description(font_description); - layout.set_text(text, -1); - - // add newlines at the end of each line, in order to allow ellipsizing - string broken_string = ""; - foreach (var line in layout.get_lines()) { - broken_string = broken_string.concat(text.substring(line.start_index, line.length), "\n"); + if (text != "") { + + var ctx = this.context(); + + // set the color + ctx.set_source_rgb(color.r, color.g, color.g); + + var layout = Pango.cairo_create_layout(ctx); + layout.set_width(Pango.units_from_double(width)); + + var font_description = Pango.FontDescription.from_string(font); + font_description.set_size((int)(font_description.get_size() * scale)); + + layout.set_font_description(font_description); + layout.set_text(text, -1); + + // add newlines at the end of each line, in order to allow ellipsizing + string broken_string = ""; + var lines = layout.get_lines().copy(); + + foreach (var line in lines) { + + string next_line = text.substring(line.start_index, line.length); + + if (broken_string == "") { + broken_string = next_line; + } else if (next_line != "") { + // test whether the addition of a line would cause the height to become too large + string broken_string_tmp = broken_string + "\n" + next_line; + + layout.set_text(broken_string_tmp, -1); + Pango.Rectangle extents; + layout.get_pixel_extents(null, out extents); + + if (extents.height > height) broken_string = broken_string + next_line; + else broken_string = broken_string_tmp; + } + } + + layout.set_text(broken_string, -1); + + layout.set_ellipsize(Pango.EllipsizeMode.END); + layout.set_alignment(Pango.Alignment.CENTER); + + Pango.Rectangle extents; + layout.get_pixel_extents(null, out extents); + ctx.move_to(0, (int)(0.5*(height - extents.height))); + + Pango.cairo_update_layout(ctx, layout); + Pango.cairo_show_layout(ctx, layout); } - layout.set_text(broken_string, broken_string.length-1); - - layout.set_ellipsize(Pango.EllipsizeMode.END); - layout.set_alignment(Pango.Alignment.CENTER); - - Pango.Rectangle extents; - layout.get_pixel_extents(null, out extents); - ctx.move_to(0, (int)(0.5*(height - extents.height))); - - Pango.cairo_update_layout(ctx, layout); - Pango.cairo_show_layout(ctx, layout); } ///////////////////////////////////////////////////////////////////// |