summaryrefslogtreecommitdiff
path: root/src/images/image.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/images/image.vala')
-rw-r--r--src/images/image.vala95
1 files changed, 45 insertions, 50 deletions
diff --git a/src/images/image.vala b/src/images/image.vala
index 197523b..e65e34a 100644
--- a/src/images/image.vala
+++ b/src/images/image.vala
@@ -1,4 +1,4 @@
-/*
+/*
Copyright (c) 2011 by Simon Schneegans
This program is free software: you can redistribute it and/or modify it
@@ -12,78 +12,73 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along with
-this program. If not, see <http://www.gnu.org/licenses/>.
+this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace GnomePie {
-/////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////
/// A class which loads image files. It can load image files in various
-/// formats, including jpeg, png and svg.
+/// formats, including jpeg, png and svg.
/////////////////////////////////////////////////////////////////////////
public class Image : GLib.Object {
-
+
/////////////////////////////////////////////////////////////////////
/// The internally used surface.
/////////////////////////////////////////////////////////////////////
-
+
public Cairo.ImageSurface surface { public get; protected set; default=null; }
-
+
/////////////////////////////////////////////////////////////////////
/// Creates an empty Image.
/////////////////////////////////////////////////////////////////////
-
+
public Image.empty(int width, int height, Color? color = null) {
this.surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, width, height);
-
+
if (color != null) {
var ctx = this.context();
ctx.set_source_rgb(color.r, color.g, color.b);
ctx.paint();
}
}
-
+
/////////////////////////////////////////////////////////////////////
/// Creates an image from the the given filename.
/////////////////////////////////////////////////////////////////////
-
+
public Image.from_file(string filename) {
this.load_file(filename);
}
-
+
/////////////////////////////////////////////////////////////////////
/// Creates an image from the the given filename at a given size.
/////////////////////////////////////////////////////////////////////
-
+
public Image.from_file_at_size(string filename, int width, int height) {
this.load_file_at_size(filename, width, height);
}
-
+
/////////////////////////////////////////////////////////////////////
/// Creates an image from the the given Gdk.Pixbuf.
/////////////////////////////////////////////////////////////////////
-
+
public Image.from_pixbuf(Gdk.Pixbuf pixbuf) {
if (pixbuf != null) this.load_pixbuf(pixbuf);
else this.surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, 1, 1);
}
-
+
/////////////////////////////////////////////////////////////////////
/// 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();
- #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
-
+ Gdk.Pixbuf pixbuf = Gdk.pixbuf_get_from_window(root, posx, posy, width, height);
this.load_pixbuf(pixbuf);
-
+
if (hide_pies) {
// check for opened pies
foreach (var window in PieManager.opened_windows) {
@@ -93,21 +88,21 @@ public class Image : GLib.Object {
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));
+ ctx.translate((int)(x-posx + (dx+3)/2), (int)(y-posy + (dy+3)/2));
window.background.paint_on(ctx);
}
}
}
}
-
+
/////////////////////////////////////////////////////////////////////
/// Loads an image from the the given filename.
/////////////////////////////////////////////////////////////////////
-
+
public void load_file(string filename) {
try {
var pixbuf = new Gdk.Pixbuf.from_file(filename);
-
+
if (pixbuf != null) {
this.load_pixbuf(pixbuf);
} else {
@@ -119,64 +114,64 @@ public class Image : GLib.Object {
this.surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, 1, 1);
}
}
-
+
/////////////////////////////////////////////////////////////////////
/// Loads an image from the the given filename at a given size.
/////////////////////////////////////////////////////////////////////
-
+
public void load_file_at_size(string filename, int width, int height) {
try {
var pixbuf = new Gdk.Pixbuf.from_file_at_size(filename, width, height);
-
+
if (pixbuf != null) {
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);
this.surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, width, height);
}
}
-
+
/////////////////////////////////////////////////////////////////////
/// Loads an image from the the given Gdk.Pixbuf.
/////////////////////////////////////////////////////////////////////
-
+
public void load_pixbuf(Gdk.Pixbuf pixbuf) {
this.surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, pixbuf.width, pixbuf.height);
-
+
var ctx = this.context();
Gdk.cairo_set_source_pixbuf(ctx, pixbuf, 1.0, 1.0);
ctx.paint();
}
-
+
/////////////////////////////////////////////////////////////////////
/// Paints the image onto the given Cairo.Context
/////////////////////////////////////////////////////////////////////
-
+
public void paint_on(Cairo.Context ctx, double alpha = 1.0) {
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() {
if (this.surface == null || this.surface.get_data().length <= 0)
return new Gdk.Pixbuf(Gdk.Colorspace.RGB, true, 8, 1, 1);
-
- var pixbuf = new Gdk.Pixbuf.from_data(this.surface.get_data(), Gdk.Colorspace.RGB, true, 8,
+
+ var pixbuf = new Gdk.Pixbuf.from_data(this.surface.get_data(), Gdk.Colorspace.RGB, true, 8,
width(), height(), this.surface.get_stride(), null);
-
+
pixbuf = pixbuf.copy();
-
- // funny stuff here --- need to swap Red end Blue because Cairo
+
+ // 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) {
@@ -187,29 +182,29 @@ public class Image : GLib.Object {
return pixbuf;
}
-
+
/////////////////////////////////////////////////////////////////////
/// Returns a Cairo.Context for the Image.
/////////////////////////////////////////////////////////////////////
-
+
public Cairo.Context context() {
return new Cairo.Context(this.surface);
}
-
+
/////////////////////////////////////////////////////////////////////
/// Returns the width of the image in pixels.
/////////////////////////////////////////////////////////////////////
-
+
public int width() {
if (this.surface != null)
return this.surface.get_width();
return 0;
}
-
+
/////////////////////////////////////////////////////////////////////
/// Returns the height of the image in pixels.
/////////////////////////////////////////////////////////////////////
-
+
public int height() {
if (this.surface != null)
return this.surface.get_height();