diff options
author | Alessandro Ghedini <al3xbio@gmail.com> | 2012-01-21 19:14:06 +0100 |
---|---|---|
committer | Alessandro Ghedini <al3xbio@gmail.com> | 2012-01-21 19:19:46 +0100 |
commit | c05883f47c498be4e11893e5178c5bc37ffd9f4a (patch) | |
tree | dbd3cd7ad3d7771405ad63af2f1e9d14d4ae5a35 /src/images | |
parent | 31539042f11bc210a29e923f45586779c3ad46b2 (diff) | |
parent | 60560a030fda3c539ff9dc1563b9926414a193da (diff) |
Merge commit 'upstream/0.4.0'
Diffstat (limited to 'src/images')
-rw-r--r-- | src/images/icon.vala | 12 | ||||
-rw-r--r-- | src/images/image.vala | 67 | ||||
-rw-r--r-- | src/images/renderedText.vala | 75 | ||||
-rw-r--r-- | src/images/themedIcon.vala | 2 |
4 files changed, 139 insertions, 17 deletions
diff --git a/src/images/icon.vala b/src/images/icon.vala index 1c8a9f4..81eb2d9 100644 --- a/src/images/icon.vala +++ b/src/images/icon.vala @@ -80,7 +80,17 @@ public class Icon : Image { public static string get_icon_file(string icon_name, int size) { string result = ""; - + + if (icon_name.contains("/")) { + var file = GLib.File.new_for_path(icon_name); + if(file.query_exists()) + return icon_name; + + warning("Icon \"" + icon_name + "\" not found! Using default icon..."); + icon_name = "application-default-icon"; + } + + var icon_theme = Gtk.IconTheme.get_default(); var file = icon_theme.lookup_icon(icon_name, size, 0); if (file != null) result = file.get_filename(); diff --git a/src/images/image.vala b/src/images/image.vala index 836e4e2..1d9674b 100644 --- a/src/images/image.vala +++ b/src/images/image.vala @@ -65,14 +65,39 @@ public class Image : GLib.Object { ///////////////////////////////////////////////////////////////////// public Image.from_pixbuf(Gdk.Pixbuf pixbuf) { - this.load_pixbuf(pixbuf); + if (pixbuf != null) this.load_pixbuf(pixbuf); + else this.surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, 1, 1); } - public Image.capture_screen(int posx, int posy, int width, int height) { + ///////////////////////////////////////////////////////////////////// + /// Captures a part of the screen. + ///////////////////////////////////////////////////////////////////// + + public Image.capture_screen(int posx, int posy, int width, int height, bool hide_pies = true) { Gdk.Window root = Gdk.get_default_root_window(); - Gdk.Pixbuf pixbuf = Gdk.pixbuf_get_from_drawable(null, root, null, posx, posy, 0, 0, width, height); + #if HAVE_GTK_3 + Gdk.Pixbuf pixbuf = Gdk.pixbuf_get_from_window(root, posx, posy, width, height); + #else + Gdk.Pixbuf pixbuf = Gdk.pixbuf_get_from_drawable(null, root, null, posx, posy, 0, 0, width, height); + #endif + this.load_pixbuf(pixbuf); + + if (hide_pies) { + // check for opened pies + foreach (var window in PieManager.opened_windows) { + if (window.background != null) { + int x=0, y=0, dx=0, dy=0; + window.get_position(out x, out y); + window.get_size(out dx, out dy); + + var ctx = this.context(); + ctx.translate((int)(x-posx + (dx+3)/2), (int)(y-posy + (dy+3)/2)); + window.background.paint_on(ctx); + } + } + } } ///////////////////////////////////////////////////////////////////// @@ -87,6 +112,7 @@ public class Image : GLib.Object { this.load_pixbuf(pixbuf); } else { warning("Failed to load " + filename + "!"); + this.surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, 1, 1); } } catch (GLib.Error e) { message("Error loading image file: %s", e.message); @@ -106,6 +132,7 @@ public class Image : GLib.Object { this.load_pixbuf(pixbuf); } else { warning("Failed to load " + filename + "!"); + this.surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, width, height); } } catch (GLib.Error e) { message("Error loading image file: %s", e.message); @@ -130,17 +157,39 @@ public class Image : GLib.Object { ///////////////////////////////////////////////////////////////////// public void paint_on(Cairo.Context ctx, double alpha = 1.0) { - ctx.set_source_surface(this.surface, -0.5*this.width()-1, -0.5*this.height()-1); + ctx.set_source_surface(this.surface, (int)(-0.5*this.width()-1), (int)(-0.5*this.height()-1)); if (alpha >= 1.0) ctx.paint(); else ctx.paint_with_alpha(alpha); } ///////////////////////////////////////////////////////////////////// + /// Converts the image to a Gdk.Pixbuf. + ///////////////////////////////////////////////////////////////////// + + public Gdk.Pixbuf to_pixbuf() { + var pixbuf = new Gdk.Pixbuf.from_data(surface.get_data(), Gdk.Colorspace.RGB, true, 8, + width(), height(), surface.get_stride(), null); + + pixbuf = pixbuf.copy(); + + // funny stuff here --- need to swap Red end Blue because Cairo + // and Gdk are different... + uint8* p = pixbuf.pixels; + for (int i=0; i<width()*height()*4-4; i+=4) { + var tmp = *(p + i); + *(p + i) = *(p + i + 2); + *(p + i + 2) = tmp; + } + + return pixbuf; + } + + ///////////////////////////////////////////////////////////////////// /// Returns a Cairo.Context for the Image. ///////////////////////////////////////////////////////////////////// public Cairo.Context context() { - return new Cairo.Context(this.surface);; + return new Cairo.Context(this.surface); } ///////////////////////////////////////////////////////////////////// @@ -148,7 +197,9 @@ public class Image : GLib.Object { ///////////////////////////////////////////////////////////////////// public int width() { - return this.surface.get_width(); + if (this.surface != null) + return this.surface.get_width(); + return 0; } ///////////////////////////////////////////////////////////////////// @@ -156,7 +207,9 @@ public class Image : GLib.Object { ///////////////////////////////////////////////////////////////////// public int height() { - return this.surface.get_height(); + if (this.surface != null) + return this.surface.get_height(); + return 0; } } diff --git a/src/images/renderedText.vala b/src/images/renderedText.vala index 924742a..e4bb4cb 100644 --- a/src/images/renderedText.vala +++ b/src/images/renderedText.vala @@ -55,12 +55,36 @@ public class RenderedText : Image { /// C'tor, creates a new image representation of a string. ///////////////////////////////////////////////////////////////////// - public RenderedText(string text, int width, int height, string font) { - var cached = this.cache.get("%s@%ux%u:%s".printf(text, width, height, font)); + public RenderedText(string text, int width, int height, string font, + Color color, double scale) { + + var cached = this.cache.get("%s@%ux%u@%f:%s:%f:%f:%f:%f".printf(text, width, height, scale, font, + color.r, color.g, color.b, color.a)); if (cached == null) { - this.render_text(text, width, height, font); - this.cache.set("%s@%ux%u:%s".printf(text, width, height, font), this.surface); + this.render_text(text, width, height, font, color, scale); + this.cache.set("%s@%ux%u@%f:%s:%f:%f:%f:%f".printf(text, width, height, scale, font, + color.r, color.g, color.b, color.a), this.surface); + } else { + this.surface = cached; + } + } + + ///////////////////////////////////////////////////////////////////// + /// C'tor, creates a new image representation of a string. This + /// string may contain markup information. + ///////////////////////////////////////////////////////////////////// + + public RenderedText.with_markup(string text, int width, int height, string font, + Color color, double scale) { + + var cached = this.cache.get("%s@%ux%u@%f:%s:%f:%f:%f:%f".printf(text, width, height, scale, font, + color.r, color.g, color.b, color.a)); + + if (cached == null) { + this.render_markup(text, width, height, font, color, scale); + this.cache.set("%s@%ux%u@%f:%s:%f:%f:%f:%f".printf(text, width, height, scale, font, + color.r, color.g, color.b, color.a), this.surface); } else { this.surface = cached; } @@ -70,20 +94,21 @@ public class RenderedText : Image { /// Creates a new transparent image, with text written onto. ///////////////////////////////////////////////////////////////////// - public void render_text(string text, int width, int height, string font) { + 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 as specified in the current theme - Color color = Config.global.theme.caption_color; + // 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() * Config.global.global_scale)); + font_description.set_size((int)(font_description.get_size() * scale)); layout.set_font_description(font_description); layout.set_text(text, -1); @@ -105,6 +130,40 @@ public class RenderedText : Image { Pango.cairo_update_layout(ctx, layout); Pango.cairo_show_layout(ctx, layout); } + + ///////////////////////////////////////////////////////////////////// + /// Creates a new transparent image, with text written onto. + ///////////////////////////////////////////////////////////////////// + + public void render_markup(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_markup(text, -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); + } } } diff --git a/src/images/themedIcon.vala b/src/images/themedIcon.vala index 29ae380..6c904a6 100644 --- a/src/images/themedIcon.vala +++ b/src/images/themedIcon.vala @@ -76,7 +76,7 @@ public class ThemedIcon : Image { var layers = active ? Config.global.theme.active_slice_layers : Config.global.theme.inactive_slice_layers; // get max size - int size = 0; + int size = 1; foreach (var layer in layers) { if (layer.image.width() > size) size = layer.image.width(); } |