diff options
| author | Scott Shawcroft <scott@tannewt.org> | 2019-06-06 15:11:02 -0700 |
|---|---|---|
| committer | Scott Shawcroft <scott@tannewt.org> | 2019-06-12 11:32:39 -0700 |
| commit | eb21fc3e31790cee094d5c11811b55a57625340a (patch) | |
| tree | e45c5dac67e7369dbff9c56c444d4c50984e7c27 /shared-module/displayio/area.h | |
| parent | a06a97e2cba36233d229ba44c3acd9007affe1c9 (diff) | |
Add partial display update support.
Different operations to the display tree have different costs. Be
aware of these costs when optimizing your code.
* Changing tiles indices in a TileGrid will update an area
covering them all.
* Changing a palette will refresh every object that references it.
* Moving a TileGrid will update both where it was and where it moved to.
* Adding something to a Group will refresh each individual area it
covers.
* Removing things from a Group will refresh one area that covers all
previous locations. (Not separate areas like add.)
* Setting a new top level Group will refresh the entire display.
Only TileGrid moves are optimized for overlap. All other overlaps
cause sending of duplicate pixels.
This also adds flip_x, flip_y and transpose_xy to TileGrid. They
change the direction of the pixels but not the location.
Fixes #1169. Fixes #1705. Fixes #1923.
Diffstat (limited to 'shared-module/displayio/area.h')
| -rw-r--r-- | shared-module/displayio/area.h | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/shared-module/displayio/area.h b/shared-module/displayio/area.h index 9db57e13f..ec7c389b4 100644 --- a/shared-module/displayio/area.h +++ b/shared-module/displayio/area.h @@ -28,23 +28,35 @@ #define MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_AREA_H // Implementations are in __init__.c +typedef struct _displayio_area_t displayio_area_t; -typedef struct { +struct _displayio_area_t { int16_t x1; int16_t y1; int16_t x2; // Second point is exclusive. int16_t y2; -} displayio_area_t; + const displayio_area_t* next; // Next area in the linked list. +}; typedef struct { + uint16_t x; + uint16_t y; + int8_t dx; + int8_t dy; + uint8_t scale; uint16_t width; uint16_t height; - uint8_t scale; bool mirror_x; bool mirror_y; bool transpose_xy; } displayio_buffer_transform_t; +void displayio_area_union(const displayio_area_t* a, + const displayio_area_t* b, + displayio_area_t* u); +void displayio_area_expand(displayio_area_t* original, const displayio_area_t* addition); +void displayio_area_copy(const displayio_area_t* src, displayio_area_t* dst); +void displayio_area_scale(displayio_area_t* area, uint16_t scale); void displayio_area_shift(displayio_area_t* area, int16_t dx, int16_t dy); bool displayio_area_compute_overlap(const displayio_area_t* a, const displayio_area_t* b, @@ -53,5 +65,9 @@ uint16_t displayio_area_width(const displayio_area_t* area); uint16_t displayio_area_height(const displayio_area_t* area); uint32_t displayio_area_size(const displayio_area_t* area); bool displayio_area_equal(const displayio_area_t* a, const displayio_area_t* b); +void displayio_area_transform_within(bool mirror_x, bool mirror_y, bool transpose_xy, + const displayio_area_t* original, + const displayio_area_t* whole, + displayio_area_t* transformed); #endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_AREA_H |
