import struct
from typing import Union, Optional, Tuple
+from circuitpython_typing import WriteableBuffer
from ._bitmap import Bitmap
from ._colorconverter import ColorConverter
from ._ondiskbitmap import OnDiskBitmap
image.putalpha(alpha.convert("L"))
def _fill_area(
- self, colorspace: Colorspace, area: Area, mask: bytearray, buffer: bytearray
+ self,
+ colorspace: Colorspace,
+ area: Area,
+ mask: WriteableBuffer,
+ buffer: WriteableBuffer,
) -> bool:
"""Draw onto the image"""
# pylint: disable=too-many-locals,too-many-branches,too-many-statements
else:
mask[offset // 32] |= 1 << (offset % 32)
if colorspace.depth == 16:
- buffer = (
- buffer[:offset]
- + struct.pack("H", output_pixel.pixel)
- + buffer[offset + 2 :]
+ struct.pack_into(
+ "H",
+ buffer,
+ offset * 2,
+ output_pixel.pixel,
)
elif colorspace.depth == 32:
- buffer = (
- buffer[:offset]
- + struct.pack("I", output_pixel.pixel)
- + buffer[offset + 4 :]
+ struct.pack_into(
+ "I",
+ buffer,
+ offset * 4,
+ output_pixel.pixel,
)
elif colorspace.depth == 8:
buffer[offset] = output_pixel.pixel & 0xFF
areas.append(self._previous_area)
return
- tail = areas[-1]
+ tail = areas[-1] if areas else None
# If we have an in-memory bitmap, then check it for modifications
if isinstance(self._bitmap, Bitmap):
self._bitmap._get_refresh_areas(areas) # pylint: disable=protected-access
- if tail != areas[-1]:
+ refresh_area = areas[-1] if areas else None
+ if tail != refresh_area:
# Special case a TileGrid that shows a full bitmap and use its
# dirty area. Copy it to ours so we can transform it.
if self._tiles_in_bitmap == 1:
- areas[-1].copy_into(self._dirty_area)
+ refresh_area.copy_into(self._dirty_area)
self._partial_change = True
else:
self._full_change = True
elif isinstance(self._bitmap, Shape):
self._bitmap._get_refresh_areas(areas) # pylint: disable=protected-access
- if areas[-1] != tail:
- areas[-1].copy_into(self._dirty_area)
+ refresh_area = areas[-1] if areas else None
+ if refresh_area != tail:
+ refresh_area.copy_into(self._dirty_area)
self._partial_change = True
self._full_change = self._full_change or (
)
areas.append(self._dirty_area)
+ def _set_hidden(self, hidden: bool) -> None:
+ self._hidden_tilegrid = hidden
+ self._rendered_hidden = False
+ if not hidden:
+ self._full_change = True
+
+ def _set_hidden_by_parent(self, hidden: bool) -> None:
+ self._hidden_by_parent = hidden
+ self._rendered_hidden = False
+ if not hidden:
+ self._full_change = True
+
+ def _get_rendered_hidden(self) -> bool:
+ return self._rendered_hidden
+
@property
def hidden(self) -> bool:
"""True when the TileGrid is hidden. This may be False even
def hidden(self, value: bool):
if not isinstance(value, (bool, int)):
raise ValueError("Expecting a boolean or integer value")
- self._hidden_tilegrid = bool(value)
+ value = bool(value)
+ self._set_hidden(value)
@property
def x(self) -> int: