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)