]> Repositories - hackapet/Adafruit_Blinka_Displayio.git/blobdiff - displayio/_tilegrid.py
More bug fixes
[hackapet/Adafruit_Blinka_Displayio.git] / displayio / _tilegrid.py
index 72e57c006f111b5c97f486f8e7727a905583cfa7..2ee8d543f0b4e078c7ec634182117ff45389d857 100644 (file)
@@ -19,6 +19,7 @@ displayio for Blinka
 
 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
@@ -211,7 +212,11 @@ class TileGrid:
         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
@@ -330,16 +335,18 @@ class TileGrid:
                 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
@@ -400,22 +407,24 @@ class TileGrid:
             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 (
@@ -468,6 +477,21 @@ class TileGrid:
                 )
             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
@@ -478,7 +502,8 @@ class TileGrid:
     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: