summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libcheese/um-crop-area.c62
1 files changed, 27 insertions, 35 deletions
diff --git a/libcheese/um-crop-area.c b/libcheese/um-crop-area.c
index 531408c9..b8bc6627 100644
--- a/libcheese/um-crop-area.c
+++ b/libcheese/um-crop-area.c
@@ -131,15 +131,21 @@ update_pixbufs (UmCropArea *area)
gint height;
GtkAllocation allocation;
gdouble scale;
- GdkRGBA color;
- guint32 pixel;
- gint dest_x, dest_y, dest_width, dest_height;
+ gint dest_width, dest_height;
GtkWidget *widget;
- GtkStyleContext *context;
widget = GTK_WIDGET (area);
gtk_widget_get_allocation (widget, &allocation);
- context = gtk_widget_get_style_context (widget);
+
+ width = gdk_pixbuf_get_width (priv->browse_pixbuf);
+ height = gdk_pixbuf_get_height (priv->browse_pixbuf);
+
+ scale = allocation.height / (gdouble)height;
+ if (scale * width > allocation.width)
+ scale = allocation.width / (gdouble)width;
+
+ dest_width = width * scale;
+ dest_height = height * scale;
if (priv->pixbuf == NULL ||
gdk_pixbuf_get_width (priv->pixbuf) != allocation.width ||
@@ -149,31 +155,14 @@ update_pixbufs (UmCropArea *area)
priv->pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
gdk_pixbuf_get_has_alpha (priv->browse_pixbuf),
8,
- allocation.width, allocation.height);
-
- gtk_style_context_get_background_color (context, gtk_style_context_get_state (context), &color);
- pixel = (((gint)(color.red * 1.0)) << 16) |
- (((gint)(color.green * 1.0)) << 8) |
- ((gint)(color.blue * 1.0));
- gdk_pixbuf_fill (priv->pixbuf, pixel);
-
- width = gdk_pixbuf_get_width (priv->browse_pixbuf);
- height = gdk_pixbuf_get_height (priv->browse_pixbuf);
-
- scale = allocation.height / (gdouble)height;
- if (scale * width > allocation.width)
- scale = allocation.width / (gdouble)width;
-
- dest_width = width * scale;
- dest_height = height * scale;
- dest_x = (allocation.width - dest_width) / 2;
- dest_y = (allocation.height - dest_height) / 2,
+ dest_width, dest_height);
+ gdk_pixbuf_fill (priv->pixbuf, 0x0);
gdk_pixbuf_scale (priv->browse_pixbuf,
priv->pixbuf,
- dest_x, dest_y,
+ 0, 0,
dest_width, dest_height,
- dest_x, dest_y,
+ 0, 0,
scale, scale,
GDK_INTERP_BILINEAR);
@@ -199,8 +188,8 @@ update_pixbufs (UmCropArea *area)
}
priv->scale = scale;
- priv->image.x = dest_x;
- priv->image.y = dest_y;
+ priv->image.x = (allocation.width - dest_width) / 2;
+ priv->image.y = (allocation.height - dest_height) / 2;
priv->image.width = dest_width;
priv->image.height = dest_height;
}
@@ -269,7 +258,7 @@ um_crop_area_draw (GtkWidget *widget,
UmCropArea *area = UM_CROP_AREA (widget);
UmCropAreaPrivate *priv = um_crop_area_get_instance_private (area);
GdkRectangle crop;
- gint width, height;
+ gint width, height, ix, iy;
if (priv->browse_pixbuf == NULL)
return FALSE;
@@ -280,14 +269,17 @@ um_crop_area_draw (GtkWidget *widget,
height = gdk_pixbuf_get_height (priv->pixbuf);
crop_to_widget (area, &crop);
- gdk_cairo_set_source_pixbuf (cr, priv->color_shifted, 0, 0);
- cairo_rectangle (cr, 0, 0, width, crop.y);
- cairo_rectangle (cr, 0, crop.y, crop.x, crop.height);
- cairo_rectangle (cr, crop.x + crop.width, crop.y, width - crop.x - crop.width, crop.height);
- cairo_rectangle (cr, 0, crop.y + crop.height, width, height - crop.y - crop.height);
+ ix = priv->image.x;
+ iy = priv->image.y;
+
+ gdk_cairo_set_source_pixbuf (cr, priv->color_shifted, ix, iy);
+ cairo_rectangle (cr, ix, iy, width, crop.y - iy);
+ cairo_rectangle (cr, ix, crop.y, crop.x - ix, crop.height);
+ cairo_rectangle (cr, crop.x + crop.width, crop.y, width - crop.width - (crop.x - ix), crop.height);
+ cairo_rectangle (cr, ix, crop.y + crop.height, width, height - crop.height - (crop.y - iy));
cairo_fill (cr);
- gdk_cairo_set_source_pixbuf (cr, priv->pixbuf, 0, 0);
+ gdk_cairo_set_source_pixbuf (cr, priv->pixbuf, ix, iy);
cairo_rectangle (cr, crop.x, crop.y, crop.width, crop.height);
cairo_fill (cr);