Merge pull request #4876 from t-ikegami/fix_TileGrid_refresh_areas

Fix partial refresh of displayio.TileGrid
This commit is contained in:
Scott Shawcroft 2021-06-21 15:28:34 -07:00 committed by GitHub
commit 0f54124e08
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -583,19 +583,36 @@ displayio_area_t *displayio_tilegrid_get_refresh_areas(displayio_tilegrid_t *sel
}
if (self->partial_change) {
if (self->transpose_xy != self->absolute_transform->transpose_xy) {
int16_t x1 = self->dirty_area.x1;
self->dirty_area.x1 = self->absolute_transform->x + self->absolute_transform->dx * (self->y + self->dirty_area.y1);
self->dirty_area.y1 = self->absolute_transform->y + self->absolute_transform->dy * (self->x + x1);
int16_t x2 = self->dirty_area.x2;
self->dirty_area.x2 = self->absolute_transform->x + self->absolute_transform->dx * (self->y + self->dirty_area.y2);
self->dirty_area.y2 = self->absolute_transform->y + self->absolute_transform->dy * (self->x + x2);
} else {
self->dirty_area.x1 = self->absolute_transform->x + self->absolute_transform->dx * (self->x + self->dirty_area.x1);
self->dirty_area.y1 = self->absolute_transform->y + self->absolute_transform->dy * (self->y + self->dirty_area.y1);
self->dirty_area.x2 = self->absolute_transform->x + self->absolute_transform->dx * (self->x + self->dirty_area.x2);
self->dirty_area.y2 = self->absolute_transform->y + self->absolute_transform->dy * (self->y + self->dirty_area.y2);
int16_t x = self->x;
int16_t y = self->y;
if (self->absolute_transform->transpose_xy) {
int16_t temp = y;
y = x;
x = temp;
}
int16_t x1 = self->dirty_area.x1;
int16_t x2 = self->dirty_area.x2;
if (self->flip_x) {
x1 = self->pixel_width - x1;
x2 = self->pixel_width - x2;
}
int16_t y1 = self->dirty_area.y1;
int16_t y2 = self->dirty_area.y2;
if (self->flip_y) {
y1 = self->pixel_height - y1;
y2 = self->pixel_height - y2;
}
if (self->transpose_xy != self->absolute_transform->transpose_xy) {
int16_t temp1 = y1, temp2 = y2;
y1 = x1;
x1 = temp1;
y2 = x2;
x2 = temp2;
}
self->dirty_area.x1 = self->absolute_transform->x + self->absolute_transform->dx * (x + x1);
self->dirty_area.y1 = self->absolute_transform->y + self->absolute_transform->dy * (y + y1);
self->dirty_area.x2 = self->absolute_transform->x + self->absolute_transform->dx * (x + x2);
self->dirty_area.y2 = self->absolute_transform->y + self->absolute_transform->dy * (y + y2);
if (self->dirty_area.y2 < self->dirty_area.y1) {
int16_t temp = self->dirty_area.y2;
self->dirty_area.y2 = self->dirty_area.y1;