Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/port/pixbuf.py
diff options
context:
space:
mode:
Diffstat (limited to 'port/pixbuf.py')
-rw-r--r--port/pixbuf.py213
1 files changed, 0 insertions, 213 deletions
diff --git a/port/pixbuf.py b/port/pixbuf.py
deleted file mode 100644
index ba6d0f5..0000000
--- a/port/pixbuf.py
+++ /dev/null
@@ -1,213 +0,0 @@
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# 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, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""gtk.gdk.Pixbuf extensions"""
-
-import re
-import os
-import cStringIO
-import gtk
-import rsvg
-import cairo
-import logging
-
-from sugar.graphics.xocolor import XoColor
-from sugar.util import LRU
-
-def to_file(pixbuf):
- """Convert pixbuf object to file object"""
-
- def push(pixbuf, buffer):
- buffer.write(pixbuf)
-
- buffer = cStringIO.StringIO()
- pixbuf.save_to_callback(push, 'png', user_data=buffer)
- buffer.seek(0)
-
- return buffer
-
-def to_str(pixbuf):
- """Convert pixbuf object to string"""
- return to_file(pixbuf).getvalue()
-
-def from_str(str):
- """Convert string to pixbuf object"""
-
- loader = gtk.gdk.pixbuf_loader_new_with_mime_type('image/png')
- loader.write(str)
- loader.close()
-
- return loader.get_pixbuf()
-
-def from_svg_at_size(filename=None, width=None, height=None, handle=None,
- keep_ratio=True):
- """Scale and load SVG into pixbuf"""
-
- if not handle:
- handle = rsvg.Handle(filename)
-
- dimensions = handle.get_dimension_data()
- icon_width = dimensions[0]
- icon_height = dimensions[1]
-
- if icon_width != width or icon_height != height:
- ratio_width = float(width) / icon_width
- ratio_height = float(height) / icon_height
-
- if keep_ratio:
- ratio = min(ratio_width, ratio_height)
- if ratio_width != ratio:
- ratio_width = ratio
- width = int(icon_width * ratio)
- elif ratio_height != ratio:
- ratio_height = ratio
- height = int(icon_height * ratio)
- else:
- ratio_width = 1
- ratio_height = 1
-
- surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
- context = cairo.Context(surface)
- context.scale(ratio_width, ratio_height)
- handle.render_cairo(context)
-
- loader = gtk.gdk.pixbuf_loader_new_with_mime_type('image/png')
- surface.write_to_png(loader)
- loader.close()
-
- return loader.get_pixbuf()
-
-def sugar_icon(file_name=None, icon_name=None,
- width=None, height=None,
- color=None,
- insensitive_widget=None):
- """Load sugar icon into pixbuf
-
- NOTE: Function can load all image formats but makes sense only for SVG
- (due to color argument, see load_svg())
-
- NOTE: Function caches results
-
- Arguments:
- file_name path to filename with image
- (mutually exclusive for icon_name)
- icon_name name of icon
- (mutually exclusive for icon_name)
- width width of final image
- height height of final image
- color defines stroke and fill colors for final SVG image
- in string notion, could be:
- * tuple of (stroke_color, fill_color)
- * XoColor
- * scalar value for stroke and fill colors
- insensitive_widget render icon in insensitive mode
- """
- def load_svg():
- entities = {}
- if fill_color:
- entities['fill_color'] = fill_color
- if stroke_color:
- entities['stroke_color'] = stroke_color
-
- f = open(icon_filename, 'r')
- icon = f.read()
- f.close()
-
- for entity, value in entities.items():
- xml = '<!ENTITY %s "%s">' % (entity, value)
- icon = re.sub('<!ENTITY %s .*>' % entity, xml, icon)
-
- return rsvg.Handle(data=icon)
-
- def get_insensitive_pixbuf():
- if not (insensitive_widget and insensitive_widget.style):
- return pixbuf
-
- icon_source = gtk.IconSource()
- # Special size meaning "don't touch"
- icon_source.set_size(-1)
- icon_source.set_pixbuf(pixbuf)
- icon_source.set_state(gtk.STATE_INSENSITIVE)
- icon_source.set_direction_wildcarded(False)
- icon_source.set_size_wildcarded(False)
-
- # Please note that the pixbuf returned by this function is leaked
- # with current stable versions of pygtk. The relevant bug is
- # http://bugzilla.gnome.org/show_bug.cgi?id=502871
- # -- 2007-12-14 Benjamin Berg
- pixbuf = insensitive_widget.style.render_icon(icon_source,
- insensitive_widget.get_direction(), gtk.STATE_INSENSITIVE, -1,
- insensitive_widget, "sugar-icon")
-
- return pixbuf
-
- def get_cache_key():
- return (icon_filename, fill_color, stroke_color, width, height,
- insensitive_widget is None)
-
- if isinstance(color, XoColor):
- stroke_color = color.get_stroke_color()
- fill_color = color.get_fill_color()
- elif isinstance(color, tuple):
- stroke_color = color[0]
- fill_color = color[1]
- else:
- stroke_color = color
- fill_color = color
-
- if file_name:
- icon_filename = file_name
- elif icon_name:
- theme = gtk.icon_theme_get_default()
- info = theme.lookup_icon(icon_name, width or 50, 0)
- if info:
- icon_filename = info.get_filename()
- del info
- else:
- logging.warning('No icon with the name %s '
- 'was found in the theme.' % icon_name)
- else:
- return None
-
- cache_key = get_cache_key()
- if cache_key in _sugar_icon_cache:
- return _sugar_icon_cache[cache_key]
-
- logging.debug('sugar_icon: file_name=%s icon_name=%s width=%s height=%s ' \
- 'color=%s' % (file_name, icon_name, width, height, color))
-
- is_svg = icon_filename.endswith('.svg')
-
- if is_svg:
- handle = load_svg()
- if width and height:
- pixbuf = from_svg_at_size(handle=handle, width=width, height=height,
- keep_ratio=True)
- else:
- pixbuf = handle.get_pixbuf()
- else:
- if width and height:
- pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(icon_filename,
- width, height)
- else:
- pixbuf = gtk.gdk.pixbuf_new_from_file(icon_filename)
-
- if insensitive_widget:
- pixbuf = get_insensitive_pixbuf()
-
- _sugar_icon_cache[cache_key] = pixbuf
-
- return pixbuf
-
-_sugar_icon_cache = LRU(50)