1 # SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
 
   2 # SPDX-FileCopyrightText: 2021 James Carr
 
   4 # SPDX-License-Identifier: MIT
 
   8 ================================================================================
 
  10 Area for Blinka Displayio
 
  12 **Software and Dependencies:**
 
  15   https://github.com/adafruit/Adafruit_Blinka/releases
 
  17 * Author(s): James Carr, Melissa LeBlanc-Williams
 
  21 from __future__ import annotations
 
  23 __version__ = "0.0.0+auto.0"
 
  24 __repo__ = "https://github.com/adafruit/Adafruit_Blinka_Displayio.git"
 
  28     """Area Class to represent an area to be updated."""
 
  30     # pylint: disable=invalid-name
 
  31     def __init__(self, x1: int = 0, y1: int = 0, x2: int = 0, y2: int = 0):
 
  39         return f"Area TL({self.x1},{self.y1}) BR({self.x2},{self.y2})"
 
  41     def copy_into(self, dst) -> None:
 
  42         """Copy the area into another area."""
 
  48     def scale(self, scale: int) -> None:
 
  49         """Scale the area by scale."""
 
  55     def shift(self, dx: int, dy: int) -> None:
 
  56         """Shift the area by dx and dy."""
 
  62     def compute_overlap(self, other, overlap) -> bool:
 
  63         """Compute the overlap between two areas. Returns True if there is an overlap."""
 
  65         overlap.x1 = max(a.x1, other.x1)
 
  66         overlap.x2 = min(a.x2, other.x2)
 
  68         if overlap.x1 >= overlap.x2:
 
  71         overlap.y1 = max(a.y1, other.y1)
 
  72         overlap.y2 = min(a.y2, other.y2)
 
  74         return overlap.y1 < overlap.y2
 
  77         """Return True if the area is empty."""
 
  78         return (self.x1 == self.x2) or (self.y1 == self.y2)
 
  81         """Make sure the area is in canonical form."""
 
  83             self.x1, self.x2 = self.x2, self.x1
 
  85             self.y1, self.y2 = self.y2, self.y1
 
  87     def union(self, other, union):
 
  88         """Combine this area along with another into union"""
 
  93             other.copy_into(union)
 
  96         union.x1 = min(self.x1, other.x1)
 
  97         union.y1 = min(self.y1, other.y1)
 
  98         union.x2 = max(self.x2, other.x2)
 
  99         union.y2 = max(self.y2, other.y2)
 
 101     def width(self) -> int:
 
 102         """Return the width of the area."""
 
 103         return self.x2 - self.x1
 
 105     def height(self) -> int:
 
 106         """Return the height of the area."""
 
 107         return self.y2 - self.y1
 
 109     def size(self) -> int:
 
 110         """Return the size of the area."""
 
 111         return self.width() * self.height()
 
 113     def __eq__(self, other):
 
 114         if not isinstance(other, Area):
 
 119             and self.y1 == other.y1
 
 120             and self.x2 == other.x2
 
 121             and self.y2 == other.y2
 
 125     def transform_within(
 
 133         """Transform an area within a larger area."""
 
 134         # pylint: disable=too-many-arguments
 
 135         # Original and whole must be in the same coordinate space.
 
 137             transformed.x1 = whole.x1 + (whole.x2 - original.x2)
 
 138             transformed.x2 = whole.x2 - (original.x1 - whole.x1)
 
 140             transformed.x1 = original.x1
 
 141             transformed.x2 = original.x2
 
 144             transformed.y1 = whole.y1 + (whole.y2 - original.y2)
 
 145             transformed.y2 = whole.y2 - (original.y1 - whole.y1)
 
 147             transformed.y1 = original.y1
 
 148             transformed.y2 = original.y2
 
 153             transformed.y1 = whole.y1 + (transformed.x1 - whole.x1)
 
 154             transformed.y2 = whole.y1 + (transformed.x2 - whole.x1)
 
 155             transformed.x1 = whole.x1 + (y1 - whole.y1)
 
 156             transformed.x2 = whole.x1 + (y2 - whole.y1)