diff options
| author | Dan Halbert <halbert@halwitz.org> | 2021-03-04 14:40:50 -0500 |
|---|---|---|
| committer | Dan Halbert <halbert@halwitz.org> | 2021-03-04 14:40:50 -0500 |
| commit | d1184e7e947dd1146e2d0fdcd2ef7d3f407492a0 (patch) | |
| tree | 6645777a540a38ba4f1278c9afb933f0f352553a /shared-module/displayio | |
| parent | dca2989df8e2069e07f6b6ff99d8ab41fa1fa353 (diff) | |
Be cognizant of null transform for .transpose_xy
Diffstat (limited to 'shared-module/displayio')
| -rw-r--r-- | shared-module/displayio/TileGrid.c | 39 | ||||
| -rw-r--r-- | shared-module/displayio/__init__.c | 14 | ||||
| -rw-r--r-- | shared-module/displayio/area.h | 2 |
3 files changed, 43 insertions, 12 deletions
diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c index 19ea10e55..96473d4a8 100644 --- a/shared-module/displayio/TileGrid.c +++ b/shared-module/displayio/TileGrid.c @@ -74,6 +74,7 @@ void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_ self->flip_x = false; self->flip_y = false; self->transpose_xy = false; + self->absolute_transform = NULL; } @@ -104,23 +105,30 @@ bool displayio_tilegrid_get_previous_area(displayio_tilegrid_t *self, displayio_ } void _update_current_x(displayio_tilegrid_t *self) { - int16_t width; + uint16_t width; if (self->transpose_xy) { width = self->pixel_height; } else { width = self->pixel_width; } - if (self->absolute_transform->transpose_xy) { - self->current_area.y1 = self->absolute_transform->y + self->absolute_transform->dy * self->x; - self->current_area.y2 = self->absolute_transform->y + self->absolute_transform->dy * (self->x + width); + + // If there's no transform, substitute an identity transform so the calculations will work. + const displayio_buffer_transform_t* absolute_transform = + self->absolute_transform == NULL + ? &null_transform + : self->absolute_transform; + + if (absolute_transform->transpose_xy) { + self->current_area.y1 = absolute_transform->y + absolute_transform->dy * self->x; + self->current_area.y2 = absolute_transform->y + absolute_transform->dy * (self->x + width); if (self->current_area.y2 < self->current_area.y1) { int16_t temp = self->current_area.y2; self->current_area.y2 = self->current_area.y1; self->current_area.y1 = temp; } } else { - self->current_area.x1 = self->absolute_transform->x + self->absolute_transform->dx * self->x; - self->current_area.x2 = self->absolute_transform->x + self->absolute_transform->dx * (self->x + width); + self->current_area.x1 = absolute_transform->x + absolute_transform->dx * self->x; + self->current_area.x2 = absolute_transform->x + absolute_transform->dx * (self->x + width); if (self->current_area.x2 < self->current_area.x1) { int16_t temp = self->current_area.x2; self->current_area.x2 = self->current_area.x1; @@ -130,23 +138,30 @@ void _update_current_x(displayio_tilegrid_t *self) { } void _update_current_y(displayio_tilegrid_t *self) { - int16_t height; + uint16_t height; if (self->transpose_xy) { height = self->pixel_width; } else { height = self->pixel_height; } - if (self->absolute_transform->transpose_xy) { - self->current_area.x1 = self->absolute_transform->x + self->absolute_transform->dx * self->y; - self->current_area.x2 = self->absolute_transform->x + self->absolute_transform->dx * (self->y + height); + + // If there's no transform, substitute an identity transform so the calculations will work. + const displayio_buffer_transform_t* absolute_transform = + self->absolute_transform == NULL + ? &null_transform + : self->absolute_transform; + + if (absolute_transform->transpose_xy) { + self->current_area.x1 = absolute_transform->x + absolute_transform->dx * self->y; + self->current_area.x2 = absolute_transform->x + absolute_transform->dx * (self->y + height); if (self->current_area.x2 < self->current_area.x1) { int16_t temp = self->current_area.x2; self->current_area.x2 = self->current_area.x1; self->current_area.x1 = temp; } } else { - self->current_area.y1 = self->absolute_transform->y + self->absolute_transform->dy * self->y; - self->current_area.y2 = self->absolute_transform->y + self->absolute_transform->dy * (self->y + height); + self->current_area.y1 = absolute_transform->y + absolute_transform->dy * self->y; + self->current_area.y2 = absolute_transform->y + absolute_transform->dy * (self->y + height); if (self->current_area.y2 < self->current_area.y1) { int16_t temp = self->current_area.y2; self->current_area.y2 = self->current_area.y1; diff --git a/shared-module/displayio/__init__.c b/shared-module/displayio/__init__.c index a9bb3b21b..740af0570 100644 --- a/shared-module/displayio/__init__.c +++ b/shared-module/displayio/__init__.c @@ -26,6 +26,20 @@ primary_display_t displays[CIRCUITPY_DISPLAY_LIMIT]; +displayio_buffer_transform_t null_transform = { + .x = 0, + .y = 0, + .dx = 1, + .dy = 1, + .scale = 1, + .width = 0, + .height = 0, + .mirror_x = false, + .mirror_y = false, + .transpose_xy = false +}; + + #if CIRCUITPY_RGBMATRIX STATIC bool any_display_uses_this_framebuffer(mp_obj_base_t *obj) { for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) { diff --git a/shared-module/displayio/area.h b/shared-module/displayio/area.h index ec7c389b4..7ad36883c 100644 --- a/shared-module/displayio/area.h +++ b/shared-module/displayio/area.h @@ -51,6 +51,8 @@ typedef struct { bool transpose_xy; } displayio_buffer_transform_t; +extern displayio_buffer_transform_t null_transform; + void displayio_area_union(const displayio_area_t* a, const displayio_area_t* b, displayio_area_t* u); |
