static gboolean qr_avatar_render_hook(gpointer source, gpointer data) { AvatarRender *ar = (AvatarRender *)source; GtkWidget *image = NULL; gchar * text; QRcode *qrcode; unsigned char * qrdata; GdkPixbuf *pixbuf, *pixbuf_scaled; int i, j, k, rowstride, channels; guchar *pixel; debug_print("qr-avatar qr_avatar_render_hook() invoked\n"); if ((text = procmsg_msginfo_get_avatar(ar->full_msginfo, QR_AVATAR_QR_AVATAR)) != NULL) { if ((qrcode = QRcode_encodeString8bit(text, 0, QR_ECLEVEL_L)) == NULL) return FALSE; qrdata = qrcode->data; pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, qrcode->width, qrcode->width); pixel = gdk_pixbuf_get_pixels(pixbuf); rowstride = gdk_pixbuf_get_rowstride(pixbuf); channels = gdk_pixbuf_get_n_channels(pixbuf); gdk_pixbuf_fill(pixbuf, 0xffffffff); for (i = 0; i < qrcode->width; i++) for (j = 0; j < qrcode->width; j++) { for (k = 0; k < channels; k++) pixel[i * rowstride + j * channels + k] = !(*qrdata & 0x1) * 0xff; qrdata++; } /* claws-mail is limited to avatar with 48x48 pixels * TODO: skip scaling as soon as different sizes are supported */ pixbuf_scaled = gdk_pixbuf_scale_simple(pixbuf, QR_AVATAR_SIZE, QR_AVATAR_SIZE, GDK_INTERP_BILINEAR); QRcode_free(qrcode); g_object_unref(pixbuf); image = gtk_image_new_from_pixbuf(pixbuf_scaled); g_object_unref(pixbuf_scaled); if (ar->image != NULL) /* previous plugin set one */ gtk_widget_destroy(ar->image); ar->image = image; return TRUE; } return FALSE; /* keep rendering */ }
static gboolean libravatar_image_render_hook(gpointer source, gpointer data) { AvatarRender *ar = (AvatarRender *)source; GtkWidget *image = NULL; gchar *a = NULL, *url = NULL; gchar md5sum[33]; debug_print("libravatar avatar_image_render invoked\n"); a = procmsg_msginfo_get_avatar(ar->full_msginfo, AVATAR_LIBRAVATAR); if (a != NULL) { gchar *base; md5_hex_digest(md5sum, a); /* try missing cache */ if (is_missing_md5(libravatarmisses, md5sum)) { return FALSE; } /* try disk cache */ image = image_widget_from_cached_md5(md5sum); if (image != NULL) { if (ar->image) /* previous plugin set one */ gtk_widget_destroy(ar->image); ar->image = image; ar->type = AVATAR_LIBRAVATAR; return FALSE; } /* not cached copy: try network */ if (prefs_common_get_prefs()->work_offline) { debug_print("working off-line: libravatar network retrieval skipped\n"); return FALSE; } base = federated_base_url_from_address(a); url = libravatar_url_for_md5(base, md5sum); if (url != NULL) { image = image_widget_from_url(url, md5sum); g_free(url); if (image != NULL) { if (ar->image) /* previous plugin set one */ gtk_widget_destroy(ar->image); ar->image = image; ar->type = AVATAR_LIBRAVATAR; } } g_free(base); return TRUE; } return FALSE; /* keep rendering */ }