summaryrefslogtreecommitdiff
path: root/shared-module/displayio/TileGrid.h
diff options
context:
space:
mode:
authorDan Halbert <halbert@adafruit.com>2019-06-13 08:29:12 -0400
committerGitHub <noreply@github.com>2019-06-13 08:29:12 -0400
commit6be7cf7440acb827d4b0f767b6083a859499b045 (patch)
tree55834cab63123bb95a2b7d329ff78442f34cfe6b /shared-module/displayio/TileGrid.h
parenta06a97e2cba36233d229ba44c3acd9007affe1c9 (diff)
parent6f6dcafd906b2ac49291f4220f3fcc7cea6112e1 (diff)
Merge pull request #1940 from tannewt/dirty_area
Add partial display update support.
Diffstat (limited to 'shared-module/displayio/TileGrid.h')
-rw-r--r--shared-module/displayio/TileGrid.h33
1 files changed, 29 insertions, 4 deletions
diff --git a/shared-module/displayio/TileGrid.h b/shared-module/displayio/TileGrid.h
index 6157dfbe8..4d97eccc2 100644
--- a/shared-module/displayio/TileGrid.h
+++ b/shared-module/displayio/TileGrid.h
@@ -37,7 +37,10 @@ typedef struct {
mp_obj_base_t base;
mp_obj_t bitmap;
mp_obj_t pixel_shader;
- displayio_area_t area;
+ int16_t x;
+ int16_t y;
+ uint16_t pixel_width;
+ uint16_t pixel_height;
uint16_t bitmap_width_in_tiles;
uint16_t width_in_tiles;
uint16_t height_in_tiles;
@@ -46,12 +49,34 @@ typedef struct {
uint16_t top_left_x;
uint16_t top_left_y;
uint8_t* tiles;
- bool needs_refresh;
+ const displayio_buffer_transform_t* absolute_transform;
+ displayio_area_t dirty_area; // Stored as a relative area until the refresh area is fetched.
+ displayio_area_t previous_area; // Stored as an absolute area.
+ displayio_area_t current_area; // Stored as an absolute area so it applies across frames.
+ bool partial_change;
+ bool full_change;
+ bool first_draw;
+ bool moved;
bool inline_tiles;
+ bool in_group;
+ bool flip_x;
+ bool flip_y;
+ bool transpose_xy;
} displayio_tilegrid_t;
-bool displayio_tilegrid_get_area(displayio_tilegrid_t *self, displayio_buffer_transform_t* transform, displayio_area_t* area, uint32_t* mask, uint32_t *buffer);
-bool displayio_tilegrid_needs_refresh(displayio_tilegrid_t *self);
+// Updating the screen is a three stage process.
+
+// The first stage is used to determine i
+displayio_area_t* displayio_tilegrid_get_refresh_areas(displayio_tilegrid_t *self, displayio_area_t* tail);
+
+// Area is always in absolute screen coordinates. Update transform is used to inform TileGrids how
+// they relate to it.
+bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, const displayio_area_t* area, uint32_t* mask, uint32_t *buffer);
+void displayio_tilegrid_update_transform(displayio_tilegrid_t *group, const displayio_buffer_transform_t* parent_transform);
+
+// Fills in area with the maximum bounds of all related pixels in the last rendered frame. Returns
+// false if the tilegrid wasn't rendered in the last frame.
+bool displayio_tilegrid_get_previous_area(displayio_tilegrid_t *self, displayio_area_t* area);
void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self);
#endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_TILEGRID_H