summaryrefslogtreecommitdiff
path: root/src/images/renderedText.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/images/renderedText.vala')
-rw-r--r--src/images/renderedText.vala81
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);
}
/////////////////////////////////////////////////////////////////////