From 8e2d33d3a5d17531a36e629bcf4c0bc36cbf1cfe Mon Sep 17 00:00:00 2001 From: Mike Gabriel Date: Sun, 2 Nov 2014 20:40:40 +0100 Subject: Imported Upstream version 14.04.10 --- src/cached-image.vala | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/cached-image.vala (limited to 'src/cached-image.vala') diff --git a/src/cached-image.vala b/src/cached-image.vala new file mode 100644 index 0000000..56157a3 --- /dev/null +++ b/src/cached-image.vala @@ -0,0 +1,59 @@ +/* -*- Mode: Vala; indent-tabs-mode: nil; tab-width: 4 -*- + * + * Copyright (C) 2012 Canonical Ltd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Authors: Michael Terry + */ + +public class CachedImage : Gtk.Image +{ + private static HashTable surface_table; + + public static Cairo.Surface? get_cached_surface (Cairo.Context c, Gdk.Pixbuf pixbuf) + { + if (surface_table == null) + surface_table = new HashTable (direct_hash, direct_equal); + + var surface = surface_table.lookup (pixbuf); + if (surface == null) + { + surface = new Cairo.Surface.similar (c.get_target (), Cairo.Content.COLOR_ALPHA, pixbuf.width, pixbuf.height); + var new_c = new Cairo.Context (surface); + Gdk.cairo_set_source_pixbuf (new_c, pixbuf, 0, 0); + new_c.paint (); + surface_table.insert (pixbuf, surface); + } + return surface; + } + + public CachedImage (Gdk.Pixbuf? pixbuf) + { + Object (pixbuf: pixbuf); + } + + public override bool draw (Cairo.Context c) + { + if (pixbuf != null) + { + var cached_surface = get_cached_surface (c, pixbuf); + if (cached_surface != null) + { + c.set_source_surface (cached_surface, 0, 0); + c.paint (); + } + } + return false; + } +} -- cgit v1.2.3