| 443 #endif |
447 #endif |
| 444 |
448 |
| 445 static void |
449 static void |
| 446 convert_and_set_buddy_icon(GaimAccount *account, const char *path) |
450 convert_and_set_buddy_icon(GaimAccount *account, const char *path) |
| 447 { |
451 { |
| 448 #if GTK_CHECK_VERSION(2,4,0) |
452 #if GTK_CHECK_VERSION(2,2,0) |
| 449 int width, height; |
453 int width, height; |
| 450 char **pixbuf_formats; |
454 char **pixbuf_formats = NULL; |
| 451 GdkPixbufFormat *format; |
455 GdkPixbufFormat *format; |
| |
456 GdkPixbuf *pixbuf; |
| 452 GaimPluginProtocolInfo *prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gaim_find_prpl(account->protocol_id)); |
457 GaimPluginProtocolInfo *prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gaim_find_prpl(account->protocol_id)); |
| 453 char **prpl_formats = g_strsplit (prpl_info->icon_spec.format,",",0); |
458 char **prpl_formats = g_strsplit (prpl_info->icon_spec.format,",",0); |
| 454 |
459 #if !GTK_CHECK_VERSION(2,4,0) |
| |
460 GdkPixbufLoader *loader; |
| |
461 FILE *file; |
| |
462 struct stat st; |
| |
463 void *data = NULL; |
| |
464 #endif |
| |
465 |
| |
466 #if GTK_CHECK_VERSION(2,4,0) |
| 455 format = gdk_pixbuf_get_file_info (path, &width, &height); |
467 format = gdk_pixbuf_get_file_info (path, &width, &height); |
| |
468 #else |
| |
469 loader = gdk_pixbuf_loader_new(); |
| |
470 if (!stat(path, &st) && (file = fopen(path, "rb")) != NULL) { |
| |
471 data = g_malloc(st.st_size); |
| |
472 fread(data, 1, st.st_size, file); |
| |
473 fclose(file); |
| |
474 gdk_pixbuf_loader_write(loader, data, st.st_size, NULL); |
| |
475 g_free(data); |
| |
476 } |
| |
477 pixbuf = gdk_pixbuf_loader_get_pixbuf(loader); |
| |
478 width = gdk_pixbuf_get_width(pixbuf); |
| |
479 height = gdk_pixbuf_get_height(pixbuf); |
| |
480 format = gdk_pixbuf_loader_get_format(loader); |
| |
481 gdk_pixbuf_loader_close(loader, NULL); |
| |
482 g_object_unref(G_OBJECT(pixbuf)); |
| |
483 #endif |
| 456 pixbuf_formats = gdk_pixbuf_format_get_extensions(format); |
484 pixbuf_formats = gdk_pixbuf_format_get_extensions(format); |
| 457 |
485 |
| 458 if (str_array_match(pixbuf_formats, prpl_formats) && /* This is an acceptable format AND */ |
486 if (str_array_match(pixbuf_formats, prpl_formats) && /* This is an acceptable format AND */ |
| 459 (!(prpl_info->icon_spec.scale_rules & GAIM_ICON_SCALE_SEND) || /* The prpl doesn't scale before it sends OR */ |
487 (!(prpl_info->icon_spec.scale_rules & GAIM_ICON_SCALE_SEND) || /* The prpl doesn't scale before it sends OR */ |
| 460 (prpl_info->icon_spec.min_width <= width && |
488 (prpl_info->icon_spec.min_width <= width && |
| 461 prpl_info->icon_spec.max_width >= width && |
489 prpl_info->icon_spec.max_width >= width && |
| 462 prpl_info->icon_spec.min_height <= height && |
490 prpl_info->icon_spec.min_height <= height && |
| 463 prpl_info->icon_spec.max_height >= height))) { /* The icon is the correct size */ |
491 prpl_info->icon_spec.max_height >= height))) { /* The icon is the correct size */ |
| 464 #endif |
492 #endif |
| 465 gaim_account_set_buddy_icon(account, path); |
493 gaim_account_set_buddy_icon(account, path); |
| 466 #if GTK_CHECK_VERSION(2,4,0) |
494 #if GTK_CHECK_VERSION(2,2,0) |
| 467 } else { |
495 } else { |
| 468 int i; |
496 int i; |
| 469 GError *error = NULL; |
497 GError *error = NULL; |
| 470 GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(path, &error); |
|
| 471 GdkPixbuf *scale; |
498 GdkPixbuf *scale; |
| 472 char *random = g_strdup_printf("%x", g_random_int()); |
499 char *random = g_strdup_printf("%x", g_random_int()); |
| 473 const char *dirname = gaim_buddy_icons_get_cache_dir(); |
500 const char *dirname = gaim_buddy_icons_get_cache_dir(); |
| 474 char *filename = g_build_filename(dirname, random, NULL); |
501 char *filename = g_build_filename(dirname, random, NULL); |
| |
502 pixbuf = gdk_pixbuf_new_from_file(path, &error); |
| 475 if (!error && prpl_info->icon_spec.scale_rules & GAIM_ICON_SCALE_SEND) { |
503 if (!error && prpl_info->icon_spec.scale_rules & GAIM_ICON_SCALE_SEND) { |
| 476 int new_width = gdk_pixbuf_get_width(pixbuf); |
504 int new_width = gdk_pixbuf_get_width(pixbuf); |
| 477 int new_height = gdk_pixbuf_get_height(pixbuf); |
505 int new_height = gdk_pixbuf_get_height(pixbuf); |
| 478 |
506 |
| 479 if(new_width > prpl_info->icon_spec.max_width) |
507 if(new_width > prpl_info->icon_spec.max_width) |
| 485 else if(new_height < prpl_info->icon_spec.min_height) |
513 else if(new_height < prpl_info->icon_spec.min_height) |
| 486 new_height = prpl_info->icon_spec.min_height; |
514 new_height = prpl_info->icon_spec.min_height; |
| 487 |
515 |
| 488 scale = gdk_pixbuf_scale_simple (pixbuf, new_width, new_height, |
516 scale = gdk_pixbuf_scale_simple (pixbuf, new_width, new_height, |
| 489 GDK_INTERP_HYPER); |
517 GDK_INTERP_HYPER); |
| 490 gdk_pixbuf_unref(pixbuf); |
518 g_object_unref(G_OBJECT(pixbuf)); |
| 491 pixbuf = scale; |
519 pixbuf = scale; |
| 492 } |
520 } |
| 493 if (error) { |
521 if (error) { |
| 494 g_free(filename); |
522 g_free(filename); |
| 495 g_free(random); |
523 g_free(random); |
| 496 gaim_debug_error("buddyicon", "Could not open icon for conversion: %s\n", error->message); |
524 gaim_debug_error("buddyicon", "Could not open icon for conversion: %s\n", error->message); |
| |
525 g_error_free(error); |
| 497 return; |
526 return; |
| 498 } |
527 } |
| 499 for (i = 0; prpl_formats[i]; i++) { |
528 for (i = 0; prpl_formats[i]; i++) { |
| 500 gaim_debug_info("buddyicon", "Converting buddy icon to %s as %s\n", prpl_formats[i], filename); |
529 gaim_debug_info("buddyicon", "Converting buddy icon to %s as %s\n", prpl_formats[i], filename); |
| 501 if (gdk_pixbuf_save (pixbuf, filename, prpl_formats[i], &error, NULL) == FALSE) |
530 if (gdk_pixbuf_save (pixbuf, filename, prpl_formats[i], &error, NULL) == FALSE) |