]> Repositories - hackapet/Adafruit_Blinka_Displayio.git/commitdiff
adding blit implementation to Bitmap
authorfoamyguy <foamyguy@gmail.com>
Fri, 7 Oct 2022 22:29:11 +0000 (17:29 -0500)
committerfoamyguy <foamyguy@gmail.com>
Fri, 7 Oct 2022 22:29:11 +0000 (17:29 -0500)
displayio/_bitmap.py

index 9d06a6364a4ae632a0827849b308b22223c91d9e..12e20afb48ea07c552d16d53cc1238173a2f1e55 100644 (file)
@@ -131,7 +131,46 @@ class Bitmap:
     ) -> None:
         # pylint: disable=unnecessary-pass, invalid-name
         """Inserts the source_bitmap region defined by rectangular boundaries"""
-        pass
+        if x2 is None:
+            x2 = source_bitmap.width
+        if y2 is None:
+            y2 = source_bitmap.height
+
+        # Rearrange so that x1 < x2 and y1 < y2
+        if x1 > x2:
+            x1, x2 = x2, x1
+        if y1 > y2:
+            y1, y2 = y2, y1
+
+        # Ensure that x2 and y2 are within source bitmap size
+        x2 = min(x2, source_bitmap.width)
+        y2 = min(y2, source_bitmap.height)
+
+        for y_count in range(y2 - y1):
+            for x_count in range(x2 - x1):
+                x_placement = x + x_count
+                y_placement = y + y_count
+
+                if (self.width > x_placement >= 0) and (
+                    self.height > y_placement >= 0
+                ):  # ensure placement is within target bitmap
+
+                    # get the palette index from the source bitmap
+                    this_pixel_color = source_bitmap[
+                        y1
+                        + (
+                            y_count * source_bitmap.width
+                        )  # Direct index into a bitmap array is speedier than [x,y] tuple
+                        + x1
+                        + x_count
+                    ]
+
+                    if (skip_index is None) or (this_pixel_color != skip_index):
+                        self[  # Direct index into a bitmap array is speedier than [x,y] tuple
+                            y_placement * self.width + x_placement
+                        ] = this_pixel_color
+                elif y_placement > self.height:
+                    break
 
     def dirty(self, x1: int = 0, y1: int = 0, x2: int = -1, y2: int = -1) -> None:
         # pylint: disable=unnecessary-pass, invalid-name