diff options
| author | Bryce Harrington <bryce@bryceharrington.org> | 2007-02-20 07:28:05 +0000 |
|---|---|---|
| committer | bryce <bryce@users.sourceforge.net> | 2007-02-20 07:28:05 +0000 |
| commit | a883506dfc9b0f30197d82354d5332446e4325ba (patch) | |
| tree | 2009a2a33fabb45afe958b804bae63d2d567c490 /src/ui/cache/svg_preview_cache.cpp | |
| parent | Partial fix for bug 980157. (diff) | |
| download | inkscape-a883506dfc9b0f30197d82354d5332446e4325ba.tar.gz inkscape-a883506dfc9b0f30197d82354d5332446e4325ba.zip | |
Moving functions from svg_preview_cache.h to a new .cpp
(bzr r2402)
Diffstat (limited to 'src/ui/cache/svg_preview_cache.cpp')
| -rw-r--r-- | src/ui/cache/svg_preview_cache.cpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/ui/cache/svg_preview_cache.cpp b/src/ui/cache/svg_preview_cache.cpp new file mode 100644 index 000000000..6b3bc3930 --- /dev/null +++ b/src/ui/cache/svg_preview_cache.cpp @@ -0,0 +1,100 @@ +/** \file + * SPIcon: Generic icon widget + */ +/* + * Authors: + * Lauris Kaplinski <lauris@kaplinski.com> + * Bryce Harrington <brycehar@bryceharrington.org> + * bulia byak <buliabyak@users.sf.net> + * + * Copyright (C) 2001-2005 authors + * Copyright (C) 2001 Ximian, Inc. + * Copyright (C) 2004 John Cliff + * + * Released under GNU GPL, read the file 'COPYING' for more information + * + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <glib/gmem.h> +#include <gtk/gtk.h> +#include "sp-namedview.h" +#include "selection.h" +#include "inkscape.h" +#include "inkscape-stock.h" +#include "sp-rect.h" +#include "document-private.h" +#include "display/nr-arena.h" +#include "display/nr-arena-item.h" + +#include "ui/cache/svg_preview_cache.h" + +GdkPixbuf* render_pixbuf(NRArenaItem* root, double scale_factor, const NR::Rect& dbox, unsigned psize) { + NRGC gc(NULL); + NRMatrix t; + + nr_matrix_set_scale(&t, scale_factor, scale_factor); + nr_arena_item_set_transform(root, &t); + + nr_matrix_set_identity(&gc.transform); + nr_arena_item_invoke_update( root, NULL, &gc, + NR_ARENA_ITEM_STATE_ALL, + NR_ARENA_ITEM_STATE_NONE ); + + /* Item integer bbox in points */ + NRRectL ibox; + ibox.x0 = (int) floor(scale_factor * dbox.min()[NR::X] + 0.5); + ibox.y0 = (int) floor(scale_factor * dbox.min()[NR::Y] + 0.5); + ibox.x1 = (int) floor(scale_factor * dbox.max()[NR::X] + 0.5); + ibox.y1 = (int) floor(scale_factor * dbox.max()[NR::Y] + 0.5); + + /* Find visible area */ + int width = ibox.x1 - ibox.x0; + int height = ibox.y1 - ibox.y0; + int dx = psize; + int dy = psize; + dx = (dx - width)/2; // watch out for size, since 'unsigned'-'signed' can cause problems if the result is negative + dy = (dy - height)/2; + + NRRectL area; + area.x0 = ibox.x0 - dx; + area.y0 = ibox.y0 - dy; + area.x1 = area.x0 + psize; + area.y1 = area.y0 + psize; + + /* Actual renderable area */ + NRRectL ua; + ua.x0 = std::max(ibox.x0, area.x0); + ua.y0 = std::max(ibox.y0, area.y0); + ua.x1 = std::min(ibox.x1, area.x1); + ua.y1 = std::min(ibox.y1, area.y1); + + /* Set up pixblock */ + guchar *px = g_new(guchar, 4 * psize * psize); + memset(px, 0x00, 4 * psize * psize); + + /* Render */ + NRPixBlock B; + nr_pixblock_setup_extern( &B, NR_PIXBLOCK_MODE_R8G8B8A8N, + ua.x0, ua.y0, ua.x1, ua.y1, + px + 4 * psize * (ua.y0 - area.y0) + + 4 * (ua.x0 - area.x0), + 4 * psize, FALSE, FALSE ); + nr_arena_item_invoke_render( root, &ua, &B, + NR_ARENA_ITEM_RENDER_NO_CACHE ); + nr_pixblock_release(&B); + + GdkPixbuf* pixbuf = gdk_pixbuf_new_from_data(px, + GDK_COLORSPACE_RGB, + TRUE, + 8, psize, psize, psize * 4, + (GdkPixbufDestroyNotify)g_free, + NULL); + + return pixbuf; +} + + |
