Mercurial > touhou
view pytouhou/ui/texture.pyx @ 368:71cd4461bb7f
Minor optimizations
author | Thibaut Girka <thib@sitedethib.com> |
---|---|
date | Wed, 11 Jul 2012 15:19:44 +0200 |
parents | 98c64ffcbdff |
children | 45e1a9a37e66 |
line wrap: on
line source
# -*- encoding: utf-8 -*- ## ## Copyright (C) 2011 Thibaut Girka <thib@sitedethib.com> ## ## 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; version 3 only. ## ## 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. ## from libc.stdlib cimport malloc, free import pyglet from pyglet.gl import (glTexParameteri, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MAG_FILTER, GL_LINEAR) import os cdef class TextureManager: def __init__(self, loader=None): self.loader = loader self.textures = {} def __getitem__(self, key): if not key in self.textures: self.textures[key] = self.load_texture(key) return self.textures[key] def preload(self, anm_wrapper): try: anms = anm_wrapper.anm_files except AttributeError: anms = anm_wrapper for anm in anms: key = anm.first_name, anm.secondary_name texture = self[key] def load_texture(self, key): cdef bytes data, alpha_data cdef char *new_data cdef unsigned int i, width, height, pixels first_name, secondary_name = key image_file = pyglet.image.load(first_name, file=self.loader.get_file(os.path.basename(first_name))) if secondary_name: alpha_file = pyglet.image.load(secondary_name, file=self.loader.get_file(os.path.basename(secondary_name))) assert (image_file.width, image_file.height) == (alpha_file.width, image_file.height) width, height = image_file.width, image_file.height pixels = width * height data = image_file.get_data('RGB', width * 3) alpha_data = alpha_file.get_data('RGB', width * 3) # TODO: further optimizations new_data = <char *>malloc(pixels * 4) for i in range(pixels): new_data[i*4] = (<char *>data)[i*3] new_data[i*4+1] = (<char *>data)[i*3+1] new_data[i*4+2] = (<char *>data)[i*3+2] new_data[i*4+3] = (<char *>alpha_data)[i*3] image_file = pyglet.image.ImageData(width, height, 'RGBA', new_data[:(pixels * 4)]) free(new_data) texture = image_file.get_texture() glTexParameteri(texture.target, GL_TEXTURE_MAG_FILTER, GL_LINEAR) glTexParameteri(texture.target, GL_TEXTURE_MIN_FILTER, GL_LINEAR) return texture