diff options
Diffstat (limited to 'src/images/image.vala')
-rw-r--r-- | src/images/image.vala | 67 |
1 files changed, 60 insertions, 7 deletions
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; } } |