summaryrefslogtreecommitdiff
path: root/shared-module
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2021-03-15 20:19:45 -0500
committerJeff Epler <jepler@unpythonic.net>2021-03-15 20:36:44 -0500
commit542fb58673954be992e274b065425e4de2aea178 (patch)
tree64c4976aee30b21f5cb70c053c25a00fc6392cee /shared-module
parentb33d77bfe86d2ae5ef86ab0153a55e903cd1134b (diff)
add arrayblit
Diffstat (limited to 'shared-module')
-rw-r--r--shared-module/bitmaptools/__init__.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/shared-module/bitmaptools/__init__.c b/shared-module/bitmaptools/__init__.c
index 199707651..e18b8b177 100644
--- a/shared-module/bitmaptools/__init__.c
+++ b/shared-module/bitmaptools/__init__.c
@@ -339,7 +339,37 @@ void common_hal_bitmaptools_draw_line(displayio_bitmap_t *destination,
}
}
+void common_hal_bitmaptools_arrayblit(displayio_bitmap_t *self, void *data, int element_size, int x1, int y1, int x2, int y2, bool skip_specified, uint32_t skip_value) {
+ uint32_t mask = (1 << common_hal_displayio_bitmap_get_bits_per_value(self)) - 1;
+
+ for (int y=y1; y<y2; y++) {
+ for (int x=x1; x<x2; x++) {
+ uint32_t value;
+ switch(element_size) {
+ default:
+ case 1:
+ value = *(uint8_t*) data;
+ data = (void*)((uint8_t*)data + 1);
+ break;
+ case 2:
+ value = *(uint16_t*) data;
+ data = (void*)((uint16_t*)data + 1);
+ break;
+ case 4:
+ value = *(uint32_t*) data;
+ data = (void*)((uint32_t*)data + 1);
+ break;
+ }
+ if (!skip_specified || value != skip_value) {
+ displayio_bitmap_write_pixel(self, x, y, value & mask);
+ }
+ }
+ }
+}
+
void common_hal_bitmaptools_readinto(displayio_bitmap_t *self, pyb_file_obj_t* file, int element_size, int bits_per_pixel, bool reverse_pixels_in_element, bool swap_bytes) {
+ uint32_t mask = (1 << common_hal_displayio_bitmap_get_bits_per_value(self)) - 1;
+
if (self->read_only) {
mp_raise_RuntimeError(translate("Read-only object"));
}
@@ -418,7 +448,7 @@ void common_hal_bitmaptools_readinto(displayio_bitmap_t *self, pyb_file_obj_t* f
break;
}
- displayio_bitmap_write_pixel(self, x, y, value);
+ displayio_bitmap_write_pixel(self, x, y, value & mask);
}
}