summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRui Matos <tiagomatos@gmail.com>2015-01-07 15:16:53 +0100
committerRui Matos <tiagomatos@gmail.com>2015-01-07 16:15:46 +0100
commit8b5bc7375e031fe1f6faec8c45d54d0b84bc4ef5 (patch)
tree4c67b1ebc09929cfc17ace22f528ddadc4b7f3c8
parent75f6a4667dea50aeaeb2776906f6adacfebf21c4 (diff)
um-crop-area: Fix background rendering around the picture
Instead of trying to fill the displayed pixbuf with the background color (and failing at that), just make the pixbuf be an aspect correct scaled size of the original picture and draw it at the correct offset on the draw vfunc. This allows us to get rid of deprecated gtk+ API usage and fixes the background around the picture ending up black despite de code's intent. https://bugzilla.gnome.org/show_bug.cgi?id=742530
-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);