diff options
| author | Bryce Harrington <bryce@bryceharrington.org> | 2007-02-20 06:01:42 +0000 |
|---|---|---|
| committer | bryce <bryce@users.sourceforge.net> | 2007-02-20 06:01:42 +0000 |
| commit | 3378ccec49e794417fb8c2dfc81f32cebd8f9dfd (patch) | |
| tree | 6c75be35b9e5105f93480a1e4efae59eb05157dc /src/ui/cache/svg_preview_cache.h | |
| parent | fix the order of searching for linked image file to match that of inkscape it... (diff) | |
| download | inkscape-3378ccec49e794417fb8c2dfc81f32cebd8f9dfd.tar.gz inkscape-3378ccec49e794417fb8c2dfc81f32cebd8f9dfd.zip | |
Partial fix for bug 980157.
This commit disables the code that prevents stock markers from appearing
at the top of the marker menu, as discussed in the bug report.
Additionally, this patch factors out the pixmap rendering code, which is
nearly identical to the rendering code in icon.cpp (and perhaps
elsewhere).
(bzr r2401)
Diffstat (limited to 'src/ui/cache/svg_preview_cache.h')
| -rw-r--r-- | src/ui/cache/svg_preview_cache.h | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/ui/cache/svg_preview_cache.h b/src/ui/cache/svg_preview_cache.h new file mode 100644 index 000000000..7b802fee3 --- /dev/null +++ b/src/ui/cache/svg_preview_cache.h @@ -0,0 +1,78 @@ +/** \file + * SPIcon: Generic icon widget + */ +/* + * Copyright (C) 2007 Bryce W. Harrington <bryce@bryceharrington.org> + * + * Released under GNU GPL, read the file 'COPYING' for more information + * + */ + +GdkPixbuf* get_pixbuf(GdkPixbuf* pixbuf) { + return pixbuf; +} + +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; +} |
