comparison pidgin/gtkft.c @ 29822:25a53c299713

Allow PRPLs to specify the image formats acceptable for thumbnails (in preferred order).
author Marcus Lundblad <ml@update.uu.se>
date Mon, 15 Mar 2010 21:49:02 +0000
parents fd354d0bfbc0
children 79bb2804a19e
comparison
equal deleted inserted replaced
29821:bf0cbb79d629 29822:25a53c299713
1161 } 1161 }
1162 1162
1163 static void 1163 static void
1164 pidgin_xfer_add_thumbnail(PurpleXfer *xfer) 1164 pidgin_xfer_add_thumbnail(PurpleXfer *xfer)
1165 { 1165 {
1166 PurpleAccount *account = purple_xfer_get_account(xfer);
1167 PurpleConnection *gc = purple_account_get_connection(account);
1168 PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
1169 const char *thumbnail_format = prpl_info->thumbnail_spec.format;
1170
1166 purple_debug_info("pidgin", "creating thumbnail for transfer\n"); 1171 purple_debug_info("pidgin", "creating thumbnail for transfer\n");
1167 1172
1168 if (purple_xfer_get_size(xfer) <= PIDGIN_XFER_MAX_SIZE_IMAGE_THUMBNAIL) { 1173 if (thumbnail_format != NULL &&
1174 purple_xfer_get_size(xfer) <= PIDGIN_XFER_MAX_SIZE_IMAGE_THUMBNAIL) {
1169 GdkPixbuf *thumbnail = 1175 GdkPixbuf *thumbnail =
1170 gdk_pixbuf_new_from_file_at_size( 1176 gdk_pixbuf_new_from_file_at_size(
1171 purple_xfer_get_local_filename(xfer), 128, 128, NULL); 1177 purple_xfer_get_local_filename(xfer), 128, 128, NULL);
1172 1178
1173 if (thumbnail) { 1179 if (thumbnail) {
1180 gchar **formats = g_strsplit(thumbnail_format, ",", 0);
1174 gchar *buffer = NULL; 1181 gchar *buffer = NULL;
1175 gsize size; 1182 gsize size;
1176 char *option_keys[2] = {"compression", NULL}; 1183 char *option_keys[2] = {NULL, NULL};
1177 char *option_values[2] = {"9", NULL}; 1184 char *option_values[2] = {NULL, NULL};
1178 gdk_pixbuf_save_to_bufferv(thumbnail, &buffer, &size, "png", 1185 gboolean supports_jpeg = FALSE;
1186 gboolean supports_png = FALSE;
1187 int i;
1188 gchar *format = NULL;
1189
1190 for (i = 0 ; formats[i] ; i++) {
1191 if (purple_strequal(formats[i], "jpeg")) {
1192 supports_jpeg = TRUE;
1193 } else if (purple_strequal(formats[i], "png")) {
1194 supports_png = TRUE;
1195 }
1196 }
1197
1198 /* prefer JPEG, then PNG, otherwise try the first format given
1199 by the PRPL without options */
1200 if (supports_jpeg) {
1201 purple_debug_info("pidgin", "creating JPEG thumbnail\n");
1202 option_keys[0] = "quality";
1203 option_keys[1] = NULL;
1204 option_values[0] = "90";
1205 option_values[1] = NULL;
1206 format = "jpeg";
1207 } else if (supports_png) {
1208 purple_debug_info("pidgin", "creating PNG thumbnail\n");
1209 option_keys[0] = "compression";
1210 option_keys[1] = NULL;
1211 option_values[0] = "9";
1212 option_values[1] = NULL;
1213 format = "png";
1214 } else {
1215 purple_debug_info("pidgin",
1216 "creating thumbnail of format %s as demanded by PRPL\n",
1217 formats[0]);
1218 format = formats[0];
1219 }
1220
1221 gdk_pixbuf_save_to_bufferv(thumbnail, &buffer, &size, format,
1179 option_keys, option_values, NULL); 1222 option_keys, option_values, NULL);
1180 1223
1181 if (buffer) { 1224 if (buffer) {
1225 const gchar *mimetype = g_strdup_printf("image/%s", format);
1182 purple_debug_info("pidgin", 1226 purple_debug_info("pidgin",
1183 "created thumbnail of %" G_GSIZE_FORMAT " bytes\n", 1227 "created thumbnail of %" G_GSIZE_FORMAT " bytes\n",
1184 size); 1228 size);
1185 purple_xfer_set_thumbnail(xfer, buffer, size); 1229 purple_xfer_set_thumbnail(xfer, buffer, size, mimetype);
1186 g_free(buffer); 1230 g_free(buffer);
1231 g_free(mimetype);
1187 } 1232 }
1188 g_object_unref(thumbnail); 1233 g_object_unref(thumbnail);
1234 g_strfreev(formats);
1189 } 1235 }
1190 } 1236 }
1191 } 1237 }
1192 1238
1193 static PurpleXferUiOps ops = 1239 static PurpleXferUiOps ops =