Index: src/gtkaccount.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtkaccount.c,v retrieving revision 1.234 diff -u -p -r1.234 gtkaccount.c --- src/gtkaccount.c 11 Feb 2006 05:29:12 -0000 1.234 +++ src/gtkaccount.c 27 Mar 2006 00:43:59 -0000 @@ -194,6 +194,7 @@ set_dialog_icon(AccountPrefsDialog *dial { char *filename = gaim_buddy_icons_get_full_path(dialog->icon_path); GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(filename, NULL); + GdkPixbuf *cropped; if (pixbuf && dialog->prpl_info && (dialog->prpl_info->icon_spec.scale_rules & GAIM_ICON_SCALE_DISPLAY)) @@ -209,8 +210,10 @@ set_dialog_icon(AccountPrefsDialog *dial pixbuf = scale; } - gtk_image_set_from_pixbuf(GTK_IMAGE(dialog->icon_entry), pixbuf); + cropped = gaim_gtk_buddy_icon_crop (pixbuf); + gtk_image_set_from_pixbuf(GTK_IMAGE(dialog->icon_entry), cropped); g_object_unref(G_OBJECT(pixbuf)); + g_object_unref(G_OBJECT(cropped)); g_free(filename); } @@ -335,7 +338,7 @@ icon_preview_change_cb(GtkFileChooser *w icon_preview_change_cb(GtkTreeSelection *sel, AccountPrefsDialog *dialog) #endif /* FILECHOOSER */ { - GdkPixbuf *pixbuf, *scale; + GdkPixbuf *pixbuf, *scale, *crop; int height, width; char *basename, *markup, *size; struct stat st; @@ -377,8 +380,9 @@ icon_preview_change_cb(GtkTreeSelection basename, size, width, height); scale = gdk_pixbuf_scale_simple(pixbuf, width * 50 / height, - 50, GDK_INTERP_BILINEAR); - gtk_image_set_from_pixbuf(GTK_IMAGE(dialog->icon_preview), scale); + 50, GDK_INTERP_BILINEAR); + crop = gaim_gtk_buddy_icon_crop (scale); + gtk_image_set_from_pixbuf(GTK_IMAGE(dialog->icon_preview), crop); #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ gtk_file_chooser_set_preview_widget_active( GTK_FILE_CHOOSER(dialog->icon_filesel), TRUE); @@ -387,6 +391,7 @@ icon_preview_change_cb(GtkTreeSelection g_object_unref(G_OBJECT(pixbuf)); g_object_unref(G_OBJECT(scale)); + g_object_unref(G_OBJECT(crop)); g_free(filename); g_free(basename); g_free(size); @@ -655,8 +660,15 @@ convert_buddy_icon(GaimPlugin *plugin, c { int i; GError *error = NULL; - GdkPixbuf *scale; + GdkPixbuf *scale, *cropped; pixbuf = gdk_pixbuf_new_from_file(path, &error); + cropped = gaim_gtk_buddy_icon_crop (pixbuf); + g_object_unref(G_OBJECT(pixbuf)); + pixbuf = cropped; + + width = gdk_pixbuf_get_width(pixbuf); + height = gdk_pixbuf_get_height(pixbuf); + g_strfreev(pixbuf_formats); if (!error && (prpl_info->icon_spec.scale_rules & GAIM_ICON_SCALE_SEND) && (width < prpl_info->icon_spec.min_width || @@ -685,8 +697,8 @@ convert_buddy_icon(GaimPlugin *plugin, c } scale = gdk_pixbuf_scale_simple (pixbuf, new_width, new_height, - GDK_INTERP_HYPER); - g_object_unref(G_OBJECT(pixbuf)); + GDK_INTERP_HYPER); + g_object_unref (G_OBJECT (pixbuf)); pixbuf = scale; } if (error) { Index: src/gtkutils.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtkutils.c,v retrieving revision 1.150 diff -u -p -r1.150 gtkutils.c --- src/gtkutils.c 8 Mar 2006 22:03:22 -0000 1.150 +++ src/gtkutils.c 27 Mar 2006 00:44:00 -0000 @@ -1523,6 +1523,24 @@ gaim_dnd_file_manage(GtkSelectionData *s g_list_free(files); } +GdkPixbuf * +gaim_gtk_buddy_icon_crop (GdkPixbuf *pixbuf) +{ + GdkPixbuf *crop; + int width = gdk_pixbuf_get_width (pixbuf); + int height = gdk_pixbuf_get_height (pixbuf); + + if (width > height) { + crop = gdk_pixbuf_new_subpixbuf (pixbuf, (width- height)/2, 0, height, height); + } else if (width < height) { + crop = gdk_pixbuf_new_subpixbuf (pixbuf, 0, (height - width)/2, width, width); + } else { + g_object_ref (G_OBJECT (pixbuf)); + crop = pixbuf; + } + return crop; +} + void gaim_gtk_buddy_icon_get_scale_size(GdkPixbuf *buf, GaimBuddyIconSpec *spec, int *width, int *height) { *width = gdk_pixbuf_get_width(buf); Index: src/gtkutils.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtkutils.h,v retrieving revision 1.62 diff -u -p -r1.62 gtkutils.h --- src/gtkutils.h 8 Mar 2006 22:03:22 -0000 1.62 +++ src/gtkutils.h 27 Mar 2006 00:44:00 -0000 @@ -359,6 +359,12 @@ void gaim_gtk_treeview_popup_menu_positi */ void gaim_dnd_file_manage(GtkSelectionData *sd, GaimAccount *account, const char *who); +/** + * Crop the icon to a centered square. Returned GdkPixbuf + * must be unref'd when unused. + */ +GdkPixbuf * gaim_gtk_buddy_icon_crop (GdkPixbuf *pixbuf); + /** * Convenience wrapper for gaim_buddy_icon_get_scale_size */