diff options
-rw-r--r-- | libcheese/um-crop-area.c | 62 |
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); |