summaryrefslogtreecommitdiff
path: root/src/images
diff options
context:
space:
mode:
authorAlessandro Ghedini <al3xbio@gmail.com>2012-01-21 19:14:06 +0100
committerAlessandro Ghedini <al3xbio@gmail.com>2012-01-21 19:19:46 +0100
commitc05883f47c498be4e11893e5178c5bc37ffd9f4a (patch)
treedbd3cd7ad3d7771405ad63af2f1e9d14d4ae5a35 /src/images
parent31539042f11bc210a29e923f45586779c3ad46b2 (diff)
parent60560a030fda3c539ff9dc1563b9926414a193da (diff)
Merge commit 'upstream/0.4.0'
Diffstat (limited to 'src/images')
-rw-r--r--src/images/icon.vala12
-rw-r--r--src/images/image.vala67
-rw-r--r--src/images/renderedText.vala75
-rw-r--r--src/images/themedIcon.vala2
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();
}