X-Git-Url: https://git.ayoreis.com/hackapet/Adafruit_Blinka_Displayio.git/blobdiff_plain/61075a985e341a2f48344e71f5ccd15899dcc875..b598e8fe55aac339ba7d5a3c9b6eac56507bccb5:/vectorio/_rectangle.py diff --git a/vectorio/_rectangle.py b/vectorio/_rectangle.py new file mode 100644 index 0000000..e4c5952 --- /dev/null +++ b/vectorio/_rectangle.py @@ -0,0 +1,104 @@ +# SPDX-FileCopyrightText: 2020 Melissa LeBlanc-Williams for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +""" +`vectorio.rectangle` +================================================================================ + +vectorio Rectangle for Blinka + +**Software and Dependencies:** + +* Adafruit Blinka: + https://github.com/adafruit/Adafruit_Blinka/releases + +* Author(s): Melissa LeBlanc-Williams + +""" + +from typing import Union +from displayio._colorconverter import ColorConverter +from displayio._palette import Palette +from displayio._area import Area +from ._vectorshape import _VectorShape + +__version__ = "0.0.0+auto.0" +__repo__ = "https://github.com/adafruit/Adafruit_Blinka_displayio.git" + + +class Rectangle(_VectorShape): + """Vectorio Rectangle""" + + def __init__( + self, + *, + pixel_shader: Union[ColorConverter, Palette], + width: int, + height: int, + x: int, + y: int, + ): + """Represents a rectangle by defining its bounds + + :param Union[~displayio.ColorConverter,~displayio.Palette] pixel_shader: + The pixel shader that produces colors from values + :param int width: The number of pixels wide + :param int height: The number of pixels high + :param int x: Initial x position of the top left corner. + :param int y: Initial y position of the top left corner. + :param int color_index: Initial color_index to use when selecting color from the palette. + """ + self._width = 1 + self._height = 1 + self._color_index = 1 + + super().__init__(pixel_shader, x, y) + self.width = width + self.height = height + + @property + def width(self) -> int: + """The width of the rectangle in pixels""" + return self._width + + @width.setter + def width(self, value: int) -> None: + if value < 1: + raise ValueError("width must be >= 1") + + self._width = abs(value) + self._shape_set_dirty() + + @property + def height(self) -> int: + """The height of the rectangle in pixels""" + return self._height + + @height.setter + def height(self, value: int) -> None: + if value < 1: + raise ValueError("height must be >= 1") + self._height = abs(value) + self._shape_set_dirty() + + @property + def color_index(self) -> int: + """The color_index of the rectangle as 0 based index of the palette.""" + return self._color_index - 1 + + @color_index.setter + def color_index(self, value: int) -> None: + self._color_index = abs(value + 1) + self._shape_set_dirty() + + def _get_pixel(self, x: int, y: int) -> int: + if 0 <= x < self._width and 0 <= y < self._height: + return self._color_index + return 0 + + def _get_area(self, out_area: Area) -> None: + out_area.x1 = 0 + out_area.y1 = 0 + out_area.x2 = self._width + out_area.y2 = self._height