summaryrefslogtreecommitdiff
path: root/shared-module/vectorio/VectorShape.c
diff options
context:
space:
mode:
authorwarriorofwire <3454741+WarriorOfWire@users.noreply.github.com>2020-05-08 23:03:15 -0700
committerwarriorofwire <3454741+WarriorOfWire@users.noreply.github.com>2020-05-09 22:15:51 -0700
commit4086600b61f14e043f02c1b8771e7780b82f313c (patch)
tree43845cc9eb946670ec88302d097dfccfe639995c /shared-module/vectorio/VectorShape.c
parent1c6e646f5630a46ea77e848788947c099e2c1f31 (diff)
vectorio: switch per-shape transform to Display
Rather than maintain a transform per-shape, we'll just use whatever settings are on the Display. Currently only transpose is done.
Diffstat (limited to 'shared-module/vectorio/VectorShape.c')
-rw-r--r--shared-module/vectorio/VectorShape.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/shared-module/vectorio/VectorShape.c b/shared-module/vectorio/VectorShape.c
index 985b77858..6030c1e3d 100644
--- a/shared-module/vectorio/VectorShape.c
+++ b/shared-module/vectorio/VectorShape.c
@@ -50,7 +50,7 @@ inline __attribute__((always_inline))
static void _get_screen_area(vectorio_vector_shape_t *self, displayio_area_t *out_area) {
VECTORIO_SHAPE_DEBUG("%p get_screen_area\n", self);
self->ishape.get_area(self->ishape.shape, out_area);
- if (self->transpose_xy) {
+ if (self->absolute_transform->transpose_xy) {
_transpose_area(out_area);
displayio_area_shift(out_area, self->y, self->x);
} else {
@@ -76,18 +76,32 @@ void common_hal_vectorio_vector_shape_set_dirty(void *vector_shape) {
}
+static displayio_buffer_transform_t null_transform = {
+ .x = 0,
+ .y = 0,
+ .dx = 0,
+ .dy = 0,
+ .scale = 1,
+ .width = 0,
+ .height = 0,
+ .mirror_x = false,
+ .mirror_y = false,
+ .transpose_xy = false
+};
+
+
void common_hal_vectorio_vector_shape_construct(vectorio_vector_shape_t *self,
vectorio_ishape_t ishape,
- mp_obj_t pixel_shader, uint16_t x, uint16_t y, bool transpose_xy) {
+ mp_obj_t pixel_shader, uint16_t x, uint16_t y) {
VECTORIO_SHAPE_DEBUG("%p vector_shape_construct x:%3d, y:%3d\n", self, x, y);
self->x = x;
self->y = y;
self->pixel_shader = pixel_shader;
self->ishape = ishape;
- self->transpose_xy = transpose_xy;
self->dirty = true;
_get_screen_area(self, &self->ephemeral_dirty_area);
self->ephemeral_dirty_area.next = NULL;
+ self->absolute_transform = &null_transform;
}
@@ -123,12 +137,6 @@ void common_hal_vectorio_vector_shape_set_y(vectorio_vector_shape_t *self, mp_in
}
-bool common_hal_vectorio_vector_shape_get_transpose_xy(vectorio_vector_shape_t *self) {
- VECTORIO_SHAPE_DEBUG("%p get_transpose_xy\n", self);
- return self->transpose_xy;
-}
-
-
mp_obj_t common_hal_vectorio_vector_shape_get_pixel_shader(vectorio_vector_shape_t *self) {
VECTORIO_SHAPE_DEBUG("%p get_pixel_shader\n", self);
return self->pixel_shader;
@@ -191,7 +199,7 @@ bool vectorio_vector_shape_fill_area(vectorio_vector_shape_t *self, const _displ
// Get the target pixel based on the shape's coordinate space
int16_t pixel_to_get_x;
int16_t pixel_to_get_y;
- if (self->transpose_xy) {
+ if (self->absolute_transform->transpose_xy) {
pixel_to_get_x = input_pixel.y - self->x;
pixel_to_get_y = input_pixel.x - self->y;
} else {
@@ -280,3 +288,9 @@ displayio_area_t* vectorio_vector_shape_get_refresh_areas(vectorio_vector_shape_
return tail;
}
+void vectorio_vector_shape_update_transform(vectorio_vector_shape_t *self, displayio_buffer_transform_t *group_transform) {
+ self->absolute_transform = group_transform;
+ common_hal_vectorio_vector_shape_set_dirty(self);
+}
+
+