4117c9576b8c3885c5bca7b4e60419450863da81tavmjong-free * SVGPreview: Preview cache
266cb2780f78d3355dcf6b7ae2f128106e01032abryce * Lauris Kaplinski <lauris@kaplinski.com>
266cb2780f78d3355dcf6b7ae2f128106e01032abryce * Bryce Harrington <brycehar@bryceharrington.org>
266cb2780f78d3355dcf6b7ae2f128106e01032abryce * bulia byak <buliabyak@users.sf.net>
266cb2780f78d3355dcf6b7ae2f128106e01032abryce * Copyright (C) 2001-2005 authors
266cb2780f78d3355dcf6b7ae2f128106e01032abryce * Copyright (C) 2001 Ximian, Inc.
266cb2780f78d3355dcf6b7ae2f128106e01032abryce * Copyright (C) 2004 John Cliff
266cb2780f78d3355dcf6b7ae2f128106e01032abryce * Released under GNU GPL, read the file 'COPYING' for more information
70437cc91faa1eab599e62436155e99446836690Krzysztof KosińskiGdkPixbuf* render_pixbuf(Inkscape::Drawing &drawing, double scale_factor, Geom::Rect const &dbox, unsigned psize)
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen Geom::Affine t(Geom::Scale(scale_factor, scale_factor));
3a3365c39fe3932d005ae1aa4324ef48606f5e18Krzysztof Kosiński drawing.root()->setTransform(Geom::Scale(scale_factor));
ed422cc32e064690397f1e4aeb526ebda5fbca77Krzysztof Kosiński Geom::IntRect ibox = (dbox * Geom::Scale(scale_factor)).roundOutwards();
266cb2780f78d3355dcf6b7ae2f128106e01032abryce /* Find visible area */
266cb2780f78d3355dcf6b7ae2f128106e01032abryce dx = (dx - width)/2; // watch out for size, since 'unsigned'-'signed' can cause problems if the result is negative
ed422cc32e064690397f1e4aeb526ebda5fbca77Krzysztof Kosiński Geom::IntRect area = Geom::IntRect::from_xywh(
ed422cc32e064690397f1e4aeb526ebda5fbca77Krzysztof Kosiński ibox.min() - Geom::IntPoint(dx, dy), Geom::IntPoint(psize, psize));
266cb2780f78d3355dcf6b7ae2f128106e01032abryce /* Render */
173b40b9fe58992580c16917b2d9bc6bca066b24Krzysztof Kosiński cairo_surface_t *s = cairo_image_surface_create(
58ba7163a5ee19414f3357a7c84d93989cb7498cmathog drawing.render(dc, area, Inkscape::DrawingItem::RENDER_BYPASS_CACHE);
70437cc91faa1eab599e62436155e99446836690Krzysztof Kosiński GdkPixbuf* pixbuf = ink_pixbuf_create_from_cairo_surface(s);
70437cc91faa1eab599e62436155e99446836690Krzysztof Kosiński for (std::map<Glib::ustring, GdkPixbuf *>::iterator i = _pixmap_cache.begin();
6f808bed60362652003a94cd51fea129009d58cfbryceGlib::ustring SvgPreview::cache_key(gchar const *uri, gchar const *name, unsigned psize) const {
ce7d19d224a8f5885856f909e4edaa5a14d33b78bryceGdkPixbuf* SvgPreview::get_preview_from_cache(const Glib::ustring& key) {
ce7d19d224a8f5885856f909e4edaa5a14d33b78bryce std::map<Glib::ustring, GdkPixbuf *>::iterator found = _pixmap_cache.find(key);
ce7d19d224a8f5885856f909e4edaa5a14d33b78brycevoid SvgPreview::set_preview_in_cache(const Glib::ustring& key, GdkPixbuf* px) {
d1bde559850436556ebee2e70e10f1cfc8aff636Krzysztof KosińskiGdkPixbuf* SvgPreview::get_preview(const gchar* uri, const gchar* id, Inkscape::DrawingItem */*root*/,
ce7d19d224a8f5885856f909e4edaa5a14d33b78bryce // First try looking up the cached preview in the cache map
ce7d19d224a8f5885856f909e4edaa5a14d33b78bryce px = render_pixbuf(root, scale_factor, dbox, psize);
ce7d19d224a8f5885856f909e4edaa5a14d33b78bryce set_preview_in_cache(key, px);
5918336f232770abf2da7efea2e1b35096105034John Smithvoid SvgPreview::remove_preview_from_cache(const Glib::ustring& key) {
5918336f232770abf2da7efea2e1b35096105034John Smith std::map<Glib::ustring, GdkPixbuf *>::iterator found = _pixmap_cache.find(key);
ed422cc32e064690397f1e4aeb526ebda5fbca77Krzysztof Kosiński Local Variables:
ed422cc32e064690397f1e4aeb526ebda5fbca77Krzysztof Kosiński c-file-style:"stroustrup"
ed422cc32e064690397f1e4aeb526ebda5fbca77Krzysztof Kosiński c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
ed422cc32e064690397f1e4aeb526ebda5fbca77Krzysztof Kosiński indent-tabs-mode:nil
ed422cc32e064690397f1e4aeb526ebda5fbca77Krzysztof Kosiński fill-column:99
ed422cc32e064690397f1e4aeb526ebda5fbca77Krzysztof Kosiński// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :