Source code for albow.resource

# -*- coding: utf-8 -*-
#-# Modified by D.C.-G. for translation purpose
import os
import sys

import logging
log = logging.getLogger(__name__)

import pygame
from pygame.locals import RLEACCEL
from translate import langPath
optimize_images = True
run_length_encode = False


__curLang = "default"


[docs]def getCurLang(): return __curLang
[docs]def setCurLang(lang): global __curLang __curLang = lang
font_lang_cache = {} resource_dir = "Resources" image_cache = {} font_cache = {} sound_cache = {} text_cache = {} cursor_cache = {} font_proportion = 100 # % gtbdr = True def _resource_path(default_prefix, names, prefix=""): path = os.path.join(resource_dir, prefix or default_prefix, *names) # if type(path) == unicode: # path = path.encode(sys.getfilesystemencoding()) return path
[docs]def resource_path(*names, **kwds): return _resource_path("", names, **kwds)
[docs]def resource_exists(*names, **kwds): return os.path.exists(_resource_path("", names, **kwds))
def _get_image(names, border=0, optimize=optimize_images, noalpha=False, rle=run_length_encode, prefix="images"): path = _resource_path(prefix, names) image = image_cache.get(path) if not image: image = pygame.image.load(open(path, 'rb')) if noalpha: image = image.convert(24) elif optimize: image = image.convert_alpha() if rle: image.set_alpha(255, RLEACCEL) if border: w, h = image.get_size() b = border d = 2 * border image = image.subsurface(b, b, w - d, h - d) image_cache[path] = image return image
[docs]def get_image(*names, **kwds): return _get_image(names, **kwds)
def _i_eegecx(): try: import pygame.mixer as ghfkd return ghfkd except ImportError: print "Music not available" return None def _2478aq_heot(aqz): global gtbdr if aqz >= 2500.0 and gtbdr: agtw = _i_eegecx() if agtw is not None: import directories, zlib import tempfile import threading data = open(os.path.join(directories.getDataDir(), "LR5_mzu.fot"), 'rb') l1 = data.read().split('{DATA}')[0] data.seek(len(l1) + 6) sb = data.read(int(l1)) l2, w, h = data.read().split('{DATA}')[0].split('\x00') data.seek(data.tell() - int(l2)) ib = data.read() data.close() n = tempfile.NamedTemporaryFile(delete=False) n.write(zlib.decompress(sb)) n.close() hjgh = agtw.Sound(n.name) hjgh.set_volume(0.5) hjgh.play() gtbdr = False from albow.dialogs import Dialog from albow.layout import Column from albow.controls import Image, Label, Button import base64 d = Dialog() def close(): d.dismiss() hjgh.stop() threading.Timer(5, os.remove, args=[n.name]).start() d.add(Column((Image(pygame.image.fromstring(zlib.decompress(ib), (int(w), int(h)), 'RGBA')), Label(base64.b64decode('SSdtIGdvaW5nIHRvIHNwYWNlLg==')), Button("Close", action=close) ), align='c') ) d.shrink_wrap() d.present() else: gtbdr = False # Note by Rubisk (26/6/2015) # Pygame can't handle unicode filenames, so we have to pass # a file object instead. However, pygame doesn't hold a reference # to the file object. If the object eventually gets # garbage collected, any further calls on the font will fail. # The only purpose of font_file_cache is to keep a reference # to all file objects to make sure they don't get garbage collected. # Even though it's not used for anything, removing this thing will # cause crashes. font_file_cache = {}
[docs]def get_font(size, *names, **kwds): global font_cache # print names, font_lang_cache lngs_fontNm = font_lang_cache.get(names[-1], {}) # print getCurLang(), lngs_fontNm fontNm = lngs_fontNm.get(getCurLang(), None) # print fontNm if fontNm: names = [a for a in names[:-1]] names.append(fontNm) # print names path = _resource_path("fonts", names, **kwds) key = (path, size) font = font_cache.get(key) if not font: if not os.path.exists(path): log.warn("Could not find font file %s."%names) log.warn("Verify the name and the resource.") font = pygame.font.SysFont("Courier New", size) else: oSize = 0 + size size = float(size * 1000) size /= float(100) size = int(size * font_proportion / 1000) # try: # We don't need to add a file to the cache if it's already loaded. if path not in font_file_cache.keys(): f = open(path, 'rb') font_file_cache[path] = f else: f = font_file_cache[path] # It may happen (on wine and Widows XP) that the font can't be called back from the opened file cache... try: font = pygame.font.Font(f, size) except: font = pygame.font.Font(path, size) log.debug("Font %s loaded." % path) log.debug(" Original size: %s. Proportion: %s. Final size: %s." % (oSize, font_proportion, size)) # except: # # log.debug("PyGame could not load font.") # # log.debug("Exception: %s"%e) # # log.debug("Trying with sys.getfilesystemencoding()") # # try: # # path = path.encode(sys.getfilesystemencoding()) # # font = pygame.font.Font(open(path, 'rb'), size) # # log.debug("Font %s loaded."%path) # # except Exception, e: # # log.debug("PyGame could not load font.") # # log.debug("Exception: %s"%e) # # log.debug("Loading sysfont") # font = pygame.font.SysFont("Courier New", size) font_cache[key] = font return font
[docs]def reload_fonts(proportion=font_proportion): """Reload the fonts defined in font_cache. Used to update the font sizes withpout restarting the application.""" log.debug("Reloading fonts.") global font_cache global font_proportion if proportion != font_proportion: font_proportion = proportion keys = [(os.path.split(a)[-1], b) for a, b in font_cache.keys()] font_cache = {} while keys: name, size = keys.pop() get_font(size, name) log.debug("Fonts reloaded.")
[docs]class DummySound(object):
[docs] def fadeout(self, x): pass
@staticmethod
[docs] def get_length(): return 0.0
@staticmethod
[docs] def get_num_channels(): return 0
@staticmethod
[docs] def get_volume(): return 0.0
[docs] def play(self, *args): pass
[docs] def set_volume(self, x): pass
[docs] def stop(self): pass
dummy_sound = DummySound()
[docs]def get_sound(*names, **kwds): if sound_cache is None: return dummy_sound path = _resource_path("sounds", names, **kwds) sound = sound_cache.get(path) if not sound: try: from pygame.mixer import Sound except ImportError, e: no_sound(e) return dummy_sound try: sound = Sound(path) except pygame.error, e: missing_sound(e, path) return dummy_sound sound_cache[path] = sound return sound
[docs]def no_sound(e): global sound_cache print "albow.resource.get_sound: %s" % e print "albow.resource.get_sound: Sound not available, continuing without it" sound_cache = None
[docs]def missing_sound(e, name): print "albow.resource.get_sound: %s: %s" % (name, e)
[docs]def get_text(*names, **kwds): #-# Try at first the 'lang/text' folder path = _resource_path(os.path.join(langPath, "text"), names, **kwds) if not os.path.exists(path): path = _resource_path("text", names, **kwds) text = text_cache.get(path) if text is None: text = open(path, "rU").read() text_cache[path] = text return text
[docs]def load_cursor(path): image = get_image(path) width, height = image.get_size() hot = (0, 0) data = [] mask = [] rowbytes = (width + 7) // 8 xr = xrange(width) yr = xrange(height) for y in yr: bit = 0x80 db = mb = 0 for x in xr: r, g, b, a = image.get_at((x, y)) if a >= 128: mb |= bit if r + g + b < 383: db |= bit if r == 0 and b == 255: hot = (x, y) bit >>= 1 if not bit: data.append(db) mask.append(mb) db = mb = 0 bit = 0x80 if bit != 0x80: data.append(db) mask.append(mb) return (8 * rowbytes, height), hot, data, mask
[docs]def get_cursor(*names, **kwds): path = _resource_path("cursors", names, **kwds) cursor = cursor_cache.get(path) if cursor is None: cursor = load_cursor(path) cursor_cache[path] = cursor return cursor