示例#1
0
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 */
}
示例#2
0
文件: libravatar.c 项目: ctubio/claws
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 */
}