self._flip_y = False
self._top_left_x = 0
self._top_left_y = 0
- if tile_width is None:
+ if tile_width is None or tile_width == 0:
tile_width = bitmap_width
- if tile_height is None:
+ if tile_height is None or tile_width == 0:
tile_height = bitmap_height
- if tile_width > 0 and bitmap_width % tile_width != 0:
+ if tile_width < 1:
+ tile_width = 1
+ if tile_height < 1:
+ tile_height = 1
+ if bitmap_width % tile_width != 0:
raise ValueError("Tile width must exactly divide bitmap width")
self._tile_width = tile_width
- if tile_height > 0 and bitmap_height % tile_height != 0:
+ if bitmap_height % tile_height != 0:
raise ValueError("Tile height must exactly divide bitmap height")
self._tile_height = tile_height
if not 0 <= default_tile <= 255:
)
image.putalpha(alpha.convert("L"))
- # pylint: disable=too-many-locals
+ # pylint: disable=too-many-locals,too-many-branches
def _fill_area(self, buffer):
"""Draw onto the image"""
if self._hidden:
return
+ if self._bitmap.width <= 0 or self._bitmap.height <= 0:
+ return
+
image = Image.new(
"RGBA",
(self._width * self._tile_width, self._height * self._tile_height),
y *= self._absolute_transform.dy
x += self._absolute_transform.x
y += self._absolute_transform.y
- buffer.alpha_composite(image, (x, y))
- # pylint: enable=too-many-locals
+ source_x = source_y = 0
+ if x < 0:
+ source_x = round(0 - x)
+ x = 0
+ if y < 0:
+ source_y = round(0 - y)
+ y = 0
+
+ x = round(x)
+ y = round(y)
+
+ if (
+ x <= buffer.width
+ and y <= buffer.height
+ and source_x <= image.width
+ and source_y <= image.height
+ ):
+ buffer.alpha_composite(image, (x, y), source=(source_x, source_y))
+
+ # pylint: enable=too-many-locals,too-many-branches
@property
def hidden(self):