120 lines
3.6 KiB
Python
120 lines
3.6 KiB
Python
'''
|
|
Pygame: Pygame image loader
|
|
|
|
.. warning::
|
|
|
|
Pygame has been deprecated and will be removed in the release after Kivy
|
|
1.11.0.
|
|
'''
|
|
|
|
__all__ = ('ImageLoaderPygame', )
|
|
|
|
from kivy.logger import Logger
|
|
from kivy.core.image import ImageLoaderBase, ImageData, ImageLoader
|
|
from os.path import isfile
|
|
from kivy.utils import deprecated
|
|
|
|
try:
|
|
import pygame
|
|
except:
|
|
raise
|
|
|
|
|
|
class ImageLoaderPygame(ImageLoaderBase):
|
|
'''Image loader based on the PIL library'''
|
|
|
|
@deprecated(
|
|
msg='Pygame has been deprecated and will be removed after 1.11.0')
|
|
def __init__(self, *largs, **kwargs):
|
|
super(ImageLoaderPygame, self).__init__(*largs, **kwargs)
|
|
|
|
@staticmethod
|
|
def extensions():
|
|
'''Return accepted extensions for this loader'''
|
|
# under OS X, i got with "pygame.error: File is not a Windows BMP
|
|
# file". documentation said: The image module is a required dependency
|
|
# of Pygame, but it only optionally supports any extended file formats.
|
|
# By default it can only load uncompressed BMP image
|
|
if pygame.image.get_extended() == 0:
|
|
return ('bmp', )
|
|
return ('jpg', 'jpeg', 'jpe', 'png', 'bmp', 'pcx', 'tga', 'tiff',
|
|
'tif', 'lbm', 'pbm', 'ppm', 'xpm')
|
|
|
|
@staticmethod
|
|
def can_save(fmt, is_bytesio):
|
|
if is_bytesio:
|
|
return False
|
|
return fmt in ('png', 'jpg')
|
|
|
|
@staticmethod
|
|
def can_load_memory():
|
|
return True
|
|
|
|
def load(self, filename):
|
|
if not filename:
|
|
import traceback
|
|
traceback.print_stack()
|
|
return
|
|
try:
|
|
im = None
|
|
if self._inline:
|
|
im = pygame.image.load(filename, 'x.{}'.format(self._ext))
|
|
elif isfile(filename):
|
|
with open(filename, 'rb') as fd:
|
|
im = pygame.image.load(fd)
|
|
elif isinstance(filename, bytes):
|
|
try:
|
|
fname = filename.decode()
|
|
if isfile(fname):
|
|
with open(fname, 'rb') as fd:
|
|
im = pygame.image.load(fd)
|
|
except UnicodeDecodeError:
|
|
pass
|
|
if im is None:
|
|
im = pygame.image.load(filename)
|
|
except:
|
|
# Logger.warning(type(filename)('Image: Unable to load image <%s>')
|
|
# % filename)
|
|
raise
|
|
|
|
fmt = ''
|
|
if im.get_bytesize() == 3 and not im.get_colorkey():
|
|
fmt = 'rgb'
|
|
elif im.get_bytesize() == 4:
|
|
fmt = 'rgba'
|
|
|
|
# image loader work only with rgb/rgba image
|
|
if fmt not in ('rgb', 'rgba'):
|
|
try:
|
|
imc = im.convert(32)
|
|
fmt = 'rgba'
|
|
except:
|
|
try:
|
|
imc = im.convert_alpha()
|
|
fmt = 'rgba'
|
|
except:
|
|
Logger.warning(
|
|
'Image: Unable to convert image %r to rgba (was %r)' %
|
|
(filename, im.fmt))
|
|
raise
|
|
im = imc
|
|
|
|
# update internals
|
|
if not self._inline:
|
|
self.filename = filename
|
|
data = pygame.image.tostring(im, fmt.upper())
|
|
return [ImageData(im.get_width(), im.get_height(),
|
|
fmt, data, source=filename)]
|
|
|
|
@staticmethod
|
|
def save(filename, width, height, pixelfmt, pixels, flipped,
|
|
imagefmt=None):
|
|
surface = pygame.image.fromstring(
|
|
pixels, (width, height), pixelfmt.upper(), flipped)
|
|
pygame.image.save(surface, filename)
|
|
return True
|
|
|
|
|
|
# register
|
|
ImageLoader.register(ImageLoaderPygame)
|