# THE SOFTWARE.
"""
-`displayio`
+`displayio.display`
================================================================================
displayio for Blinka
import threading
from PIL import Image
import numpy
-from displayio import Rectangle
-from displayio import displays
+from recordclass import recordclass
__version__ = "0.0.0-auto.0"
__repo__ = "https://github.com/adafruit/Adafruit_Blinka_displayio.git"
+Transform = recordclass("Transform", "x y dx dy scale transpose_xy mirror_x mirror_y")
+Rectangle = recordclass("Rectangle", "x1 y1 x2 y2")
+displays = []
+
# pylint: disable=unnecessary-pass, unused-argument
# pylint: disable=too-many-instance-attributes
self._height = height
self._colstart = colstart
self._rowstart = rowstart
- self._rotation = rotation
+ self._rotation = 0
self._auto_brightness = auto_brightness
self._brightness = brightness
self._auto_refresh = auto_refresh
self._subrectangles = []
self._bounds_encoding = ">BB" if single_byte_bounds else ">HH"
self._current_group = None
+ self.rotation = rotation
displays.append(self)
self._refresh_thread = None
if self._auto_refresh:
self._current_group._fill_area(buffer) # pylint: disable=protected-access
# save image to buffer (or probably refresh buffer so we can compare)
self._buffer.paste(buffer)
- time.sleep(1)
+
# Eventually calculate dirty rectangles here
self._subrectangles.append(Rectangle(0, 0, self._width, self._height))
def _refresh_display_area(self, rectangle):
"""Loop through dirty rectangles and redraw that area."""
- data = numpy.array(self._buffer.crop(rectangle).convert("RGB")).astype("uint16")
+
+ img = self._buffer.convert("RGB").crop(rectangle)
+ img = img.rotate(self._rotation, expand=True)
+
+ display_rectangle = self._apply_rotation(rectangle)
+ img = img.crop(self._clip(display_rectangle))
+
+ data = numpy.array(img).astype("uint16")
color = (
((data[:, :, 0] & 0xF8) << 8)
| ((data[:, :, 1] & 0xFC) << 3)
self._write(
self._set_column_command,
self._encode_pos(
- rectangle.x1 + self._colstart, rectangle.x2 + self._colstart
+ display_rectangle.x1 + self._colstart,
+ display_rectangle.x2 + self._colstart - 1,
),
)
self._write(
self._set_row_command,
self._encode_pos(
- rectangle.y1 + self._rowstart, rectangle.y2 + self._rowstart
+ display_rectangle.y1 + self._rowstart,
+ display_rectangle.y2 + self._rowstart - 1,
),
)
+
self._write(self._write_ram_command, pixels)
+ def _clip(self, rectangle):
+ if self._rotation in (90, 270):
+ width, height = self._height, self._width
+ else:
+ width, height = self._width, self._height
+
+ if rectangle.x1 < 0:
+ rectangle.x1 = 0
+ if rectangle.y1 < 0:
+ rectangle.y1 = 0
+ if rectangle.x2 > width:
+ rectangle.x2 = width
+ if rectangle.y2 > height:
+ rectangle.y2 = height
+
+ return rectangle
+
+ def _apply_rotation(self, rectangle):
+ """Adjust the rectangle coordinates based on rotation"""
+ if self._rotation == 90:
+ return Rectangle(
+ self._height - rectangle.y2,
+ rectangle.x1,
+ self._height - rectangle.y1,
+ rectangle.x2,
+ )
+ if self._rotation == 180:
+ return Rectangle(
+ self._width - rectangle.x2,
+ self._height - rectangle.y2,
+ self._width - rectangle.x1,
+ self._height - rectangle.y1,
+ )
+ if self._rotation == 270:
+ return Rectangle(
+ rectangle.y1,
+ self._width - rectangle.x2,
+ rectangle.y2,
+ self._width - rectangle.x1,
+ )
+ return rectangle
+
def _encode_pos(self, x, y):
"""Encode a postion into bytes."""
return struct.pack(self._bounds_encoding, x, y)