72 lines
2.0 KiB
Python
72 lines
2.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
scenegraph.element.image
|
|
"""
|
|
|
|
|
|
# imports ####################################################################
|
|
|
|
from os.path import abspath
|
|
|
|
try:
|
|
from PIL import Image as _Image
|
|
except ImportError:
|
|
class _Image(object):
|
|
size = (0, 0)
|
|
mode = "RGBA"
|
|
|
|
@classmethod
|
|
def open(klass, href):
|
|
return _Image()
|
|
|
|
def tobytes(self):
|
|
return b""
|
|
|
|
def convert(self, img_format):
|
|
raise NotImplementedError
|
|
|
|
# from ...opengl.utils import create_texture
|
|
from ..paint import Color, _Texture
|
|
from .rectangle import Rectangle
|
|
|
|
|
|
# image ######################################################################
|
|
|
|
class Image(Rectangle):
|
|
tag = "image"
|
|
|
|
_state_attributes = Rectangle._state_attributes + [
|
|
"href",
|
|
]
|
|
|
|
fill = Color.white
|
|
|
|
def __init__(self, href, width=None, height=None, **attributes):
|
|
href = abspath(href)
|
|
pil_image = _Image.open(href)
|
|
if pil_image.mode not in ["RGB", "RGBA"]:
|
|
pil_image = pil_image.convert("RGBA")
|
|
iw, ih = pil_image.size
|
|
if width is None:
|
|
width = iw
|
|
if height is None:
|
|
height = ih
|
|
super(Image, self).__init__(width=width, height=height,
|
|
**attributes)
|
|
self.href = "file://%s" % href
|
|
|
|
self._texture_args = (pil_image.size,
|
|
pil_image.tobytes(),
|
|
pil_image.mode)
|
|
|
|
def _render(self, transform, inheriteds, context):
|
|
(width, height), data, texture_format = self._texture_args
|
|
del self._texture_args
|
|
|
|
# self.fill = _Texture(create_texture(width, height, data, texture_format), self.fill)
|
|
assert False # call to opengl code removed but there doesn't seem to be a cairo implementation
|
|
self._attributes.remove("fill")
|
|
|
|
super(Image, self)._render(transform, inheriteds, context)
|