]> Repositories - hackapet/Adafruit_Blinka_Displayio.git/blobdiff - displayio/_displaycore.py
Optimize OnDiskBitMap a bit
[hackapet/Adafruit_Blinka_Displayio.git] / displayio / _displaycore.py
index d2f298a07a992fd8f232823e39285da901c9c4b9..76a5d18a1871e085e8ca65fd8fa2b3ffa4560c7a 100644 (file)
@@ -24,7 +24,7 @@ __repo__ = "https://github.com/adafruit/Adafruit_Blinka_Displayio.git"
 
 import time
 import struct
-import circuitpython_typing
+from circuitpython_typing import WriteableBuffer, ReadableBuffer
 from paralleldisplay import ParallelBus
 from ._fourwire import FourWire
 from ._group import Group
@@ -101,6 +101,7 @@ class _DisplayCore:
         if bus:
             if isinstance(bus, (FourWire, I2CDisplay, ParallelBus)):
                 self._bus_reset = bus.reset
+                self._bus_free = bus._free
                 self._begin_transaction = bus._begin_transaction
                 self._send = bus._send
                 self._end_transaction = bus._end_transaction
@@ -178,25 +179,14 @@ class _DisplayCore:
         if self.current_group is not None:
             self.current_group._update_transform(self.transform)
 
-    def show(self, root_group: Group) -> bool:
-        # pylint: disable=protected-access
-
+    def set_root_group(self, root_group: Group) -> bool:
         """
         Switches to displaying the given group of layers. When group is `None`, the
         default CircuitPython terminal will be shown.
 
         :param Optional[displayio.Group] root_group: The group to show.
         """
-
-        """
-        # TODO: Implement Supervisor
-        if root_group is None:
-            circuitpython_splash = _Supervisor().circuitpython_splash
-            if not circuitpython_splash._in_group:
-                root_group = circuitpython_splash
-            elif self.current_group == circuitpython_splash:
-                return True
-        """
+        # pylint: disable=protected-access
 
         if root_group == self.current_group:
             return True
@@ -248,8 +238,8 @@ class _DisplayCore:
     def fill_area(
         self,
         area: Area,
-        mask: circuitpython_typing.WriteableBuffer,
-        buffer: circuitpython_typing.WriteableBuffer,
+        mask: WriteableBuffer,
+        buffer: WriteableBuffer,
     ) -> bool:
         """Call the current group's fill area function"""
         if self.current_group is not None:
@@ -265,7 +255,8 @@ class _DisplayCore:
         if not overlaps:
             return False
 
-        # Expand the area if we have multiple pixels per byte and we need to byte align the bounds
+        # Expand the area if we have multiple pixels per byte and we need to byte
+        # align the bounds
         if self.colorspace.depth < 8:
             pixels_per_byte = (
                 8 // self.colorspace.depth * self.colorspace.bytes_per_cell
@@ -308,21 +299,21 @@ class _DisplayCore:
 
         # Set column
         self.begin_transaction()
+        data = bytearray([self.column_command])
         data_type = DISPLAY_DATA
         if not self.data_as_commands:
-            self.send(
-                DISPLAY_COMMAND, CHIP_SELECT_UNTOUCHED, bytes([self.column_command])
-            )
+            self.send(DISPLAY_COMMAND, CHIP_SELECT_UNTOUCHED, data)
+            data = bytearray(0)
         else:
             data_type = DISPLAY_COMMAND
 
         if self.ram_width < 0x100:  # Single Byte Bounds
-            data = struct.pack(">BB", region_x1, region_x2)
+            data += struct.pack(">BB", region_x1, region_x2)
         else:
             if self.address_little_endian:
                 region_x1 = bswap16(region_x1)
                 region_x2 = bswap16(region_x2)
-            data = struct.pack(">HH", region_x1, region_x2)
+            data += struct.pack(">HH", region_x1, region_x2)
 
         # Quirk for SH1107 "SH1107_addressing"
         #     Column lower command = 0x00, Column upper command = 0x10
@@ -347,17 +338,18 @@ class _DisplayCore:
 
         # Set row
         self.begin_transaction()
+        data = bytearray([self.row_command])
 
         if not self.data_as_commands:
-            self.send(DISPLAY_COMMAND, CHIP_SELECT_UNTOUCHED, bytes([self.row_command]))
-
+            self.send(DISPLAY_COMMAND, CHIP_SELECT_UNTOUCHED, data)
+            data = bytearray(0)
         if self.ram_width < 0x100:  # Single Byte Bounds
-            data = struct.pack(">BB", region_y1, region_y2)
+            data += struct.pack(">BB", region_y1, region_y2)
         else:
             if self.address_little_endian:
                 region_y1 = bswap16(region_y1)
                 region_y2 = bswap16(region_y2)
-            data = struct.pack(">HH", region_y1, region_y2)
+            data += struct.pack(">HH", region_y1, region_y2)
 
         # Quirk for SH1107 "SH1107_addressing"
         #     Page address command = 0xB0
@@ -376,43 +368,28 @@ class _DisplayCore:
             self.send(DISPLAY_DATA, chip_select, data[: len(data) // 2])
             self.end_transaction()
 
-        """
-        img = self._buffer.convert("RGB").crop(astuple(area))
-        img = img.rotate(360 - self._core.rotation, expand=True)
-
-        display_area = self._apply_rotation(area)
-
-        img = img.crop(astuple(display_area))
-
-        data = numpy.array(img).astype("uint16")
-        color = (
-            ((data[:, :, 0] & 0xF8) << 8)
-            | ((data[:, :, 1] & 0xFC) << 3)
-            | (data[:, :, 2] >> 3)
-        )
-
-        pixels = bytes(
-            numpy.dstack(((color >> 8) & 0xFF, color & 0xFF)).flatten().tolist()
-        )
-        """
-
     def send(
         self,
         data_type: int,
         chip_select: int,
-        data: circuitpython_typing.ReadableBuffer,
+        data: ReadableBuffer,
     ) -> None:
         """
         Send the data to the current bus
         """
-        print(data_type, chip_select, data)
         self._send(data_type, chip_select, data)
 
-    def begin_transaction(self) -> None:
+    def bus_free(self) -> bool:
+        """
+        Check if the bus is free
+        """
+        return self._bus_free()
+
+    def begin_transaction(self) -> bool:
         """
         Begin Bus Transaction
         """
-        self._begin_transaction()
+        return self._begin_transaction()
 
     def end_transaction(self) -> None:
         """