From b82d35b06199357751a8f56061fb3b14bbdd6760 Mon Sep 17 00:00:00 2001 From: Rob Kendrick Date: Sat, 25 Mar 2006 23:31:42 +0000 Subject: [project @ 2006-03-25 23:31:41 by rjek] Initial GTK thumbnail rendering implementation (still gets fonts too big) svn path=/import/netsurf/; revision=2166 --- gtk/gtk_thumbnail.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 gtk/gtk_thumbnail.c (limited to 'gtk/gtk_thumbnail.c') diff --git a/gtk/gtk_thumbnail.c b/gtk/gtk_thumbnail.c new file mode 100644 index 000000000..0de132d2d --- /dev/null +++ b/gtk/gtk_thumbnail.c @@ -0,0 +1,91 @@ +/* + * This file is part of NetSurf, http://netsurf.sourceforge.net/ + * Licensed under the GNU General Public License, + * http://www.opensource.org/licenses/gpl-license + * Copyright 2006 Rob Kendrick + */ + +/** \file + * Page thumbnail creation (implementation). + * + * Thumbnails are created by setting the current drawing contexts to the + * bitmap (a gdk pixbuf) we are passed, and plotting the page at a small + * scale. + */ + +#include +#include +#include "netsurf/content/content.h" +#include "netsurf/content/url_store.h" +#include "netsurf/desktop/plotters.h" +#include "netsurf/desktop/browser.h" +#include "netsurf/image/bitmap.h" +#include "netsurf/render/font.h" +#include "netsurf/utils/log.h" +#include "netsurf/gtk/gtk_window.h" +#include "netsurf/gtk/gtk_plotters.h" + +/** + * Create a thumbnail of a page. + * + * \param content content structure to thumbnail + * \param bitmap the bitmap to draw to + * \param url the URL the thumnail belongs to, or NULL + */ +bool thumbnail_create(struct content *content, struct bitmap *bitmap, + const char *url) +{ + GdkPixbuf *pixbuf = (GdkPixbuf *) bitmap; + gint width = gdk_pixbuf_get_width(pixbuf); + gint height = gdk_pixbuf_get_height(pixbuf); + gint depth = (gdk_screen_get_system_visual(gdk_screen_get_default()))->depth; + GdkPixmap *pixmap = gdk_pixmap_new(NULL, width, height, depth); + GdkColor c = { 0, 65535, 65535, 65535 }; + float scale = 1.0; + + assert(content); + assert(bitmap); + + gdk_drawable_set_colormap(pixmap, gdk_colormap_get_system()); + + /* set the plotting functions up */ + plot = nsgtk_plotters; + + if (content->width) + scale = (float)width / (float)content->width; + nsgtk_plot_set_scale(scale); + + /* set to plot to pixmap */ + current_drawable = pixmap; + current_gc = gdk_gc_new(current_drawable); +#ifdef CAIRO_VERSION + current_cr = gdk_cairo_create(current_drawable); +#endif + + /* render the content */ + content_redraw(content, 0, 0, width, height, + 0, 0, width, height, scale, 0xFFFFFF); + + /* copy thumbnail to pixbuf we've been passed */ + gdk_pixbuf_get_from_drawable(pixbuf, pixmap, NULL, 0, 0, 0, 0, + width, height); + + /* As a debugging aid, try this to dump out a copy of the thumbnail as a PNG: + * gdk_pixbuf_save(pixbuf, "thumbnail.png", "png", NULL, NULL); + */ + + /* register the thumbnail with the URL */ + if (url) + url_store_add_thumbnail(url, bitmap); + + bitmap_modified(bitmap); + + g_object_unref(current_gc); +#ifdef CAIRO_VERSION + cairo_destroy(current_cr); +#endif + g_object_unref(pixmap); + + return true; +} + -- cgit v1.2.3