--- /dev/null
+import os
+import sys
+
+try:
+ from pkg_resources import resource_filename
+except ImportError:
+ # OK, we're most likely running under py2exe, so this is safe
+ # (for values of safe that are unconcerned about py2exe being involved)
+ def resource_filename(mod, path):
+ # There are better ways of doing this, but I've spent too much
+ # time going down this rabbithole already
+ return os.path.join(os.path.dirname(__file__), '..', '..', 'data',
+ path)
+import pygame
+
+
+class ResourceNotFound(Exception):
+ pass
+
+
+class Loader(object):
+ CONVERT_ALPHA = True
+
+ def __init__(self, resource_module, language=None):
+ self.resource_module = resource_module
+ self.lang_dialect = language
+ self.language = language.split('_', 1)[0] if language else None
+ self._cache = {}
+
+ def create_resource_path(self, *path_fragments):
+ return resource_filename(self.resource_module,
+ os.path.join(*path_fragments))
+
+ def get_resource_path(self, *path_fragments):
+ for mod, full_path_fragments in self.lang_locations(path_fragments):
+ path = resource_filename(mod, os.path.join(*full_path_fragments))
+ if os.path.exists(path):
+ return path
+ raise ResourceNotFound(os.path.join(*path_fragments))
+
+ def lang_locations(self, path_fragments):
+ '''
+ For each resource module, yield:
+ * (<module>, (<lang>_<dialect>, <path>))
+ * (<module>, (<lang>, <path>))
+ * (<module>, (<path>, ))
+ '''
+ for module in (self.resource_module,):
+ if self.lang_dialect:
+ yield (module, (self.lang_dialect,) + path_fragments)
+ if self.language != self.lang_dialect:
+ yield (module, (self.language,) + path_fragments)
+ yield (module, path_fragments)
+
+ def get_file(self, *path_fragments, **kw):
+ mode = kw.get('mode', "rU")
+ try:
+ path = self.get_resource_path(*path_fragments)
+ except ResourceNotFound:
+ if 'w' in mode:
+ path = self.create_resource_path(*path_fragments)
+ else:
+ raise
+ return file(path, mode)
+
+ def get_image(self, *name_fragments, **kw):
+ transforms = kw.get('transforms', ())
+ basedir = kw.get('basedir', 'images')
+
+ path = (basedir,) + name_fragments
+
+ if path not in self._cache:
+ fn = self.get_resource_path(*path)
+ image = pygame.image.load(fn)
+ if self.CONVERT_ALPHA:
+ if not pygame.display.get_init():
+ print >> sys.stderr, ("Display not initialized, "
+ "image '%s' not loaded."
+ % os.path.join(*path))
+ return
+ image = image.convert_alpha(pygame.display.get_surface())
+ self._cache[path] = image
+
+ key = (path, transforms)
+ if key not in self._cache:
+ image = self._cache[path]
+ for mutator in transforms:
+ image = mutator(image)
+ self._cache[key] = image
+
+ return self._cache[key]
+
+ def get_font(self, file_name, font_size):
+ basedir = 'fonts'
+ key = (basedir, file_name, font_size)
+
+ if key not in self._cache:
+ fn = self.get_resource_path(basedir, file_name)
+ self._cache[key] = pygame.font.Font(fn, font_size)
+
+ return self._cache[key]