Skip to content

Commit cf2712d

Browse files
committed
transposing and mirroring work
* fix absolute_transform dirtying early instead of after the change, missing the draw * fix transpose and mirror. (0,0) -> location in all vector shapes now in all rotations.
1 parent 7eece7d commit cf2712d

File tree

1 file changed

+37
-18
lines changed

1 file changed

+37
-18
lines changed

shared-module/vectorio/VectorShape.c

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@
1414
#include "shared-bindings/vectorio/Rectangle.h"
1515

1616
// Lifecycle actions.
17-
// #define VECTORIO_SHAPE_DEBUG(...) (void)0
18-
#define VECTORIO_SHAPE_DEBUG(...) mp_printf(&mp_plat_print, __VA_ARGS__)
17+
#define VECTORIO_SHAPE_DEBUG(...) (void)0
18+
// #define VECTORIO_SHAPE_DEBUG(...) mp_printf(&mp_plat_print, __VA_ARGS__)
1919

2020

2121
// Used in both logging and ifdefs, for extra variables
2222
// #define VECTORIO_PERF(...) mp_printf(&mp_plat_print, __VA_ARGS__)
2323

2424

2525
// Really verbose.
26-
// #define VECTORIO_SHAPE_PIXEL_DEBUG(...) (void)0
27-
#define VECTORIO_SHAPE_PIXEL_DEBUG(...) mp_printf(&mp_plat_print, __VA_ARGS__)
26+
#define VECTORIO_SHAPE_PIXEL_DEBUG(...) (void)0
27+
// #define VECTORIO_SHAPE_PIXEL_DEBUG(...) mp_printf(&mp_plat_print, __VA_ARGS__)
2828

2929
#define U32_TO_BINARY_FMT "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c"
3030
#define U32_TO_BINARY(u32) \
@@ -96,8 +96,19 @@ static void _get_screen_area(vectorio_vector_shape_t *self, displayio_area_t *ou
9696
if (self->absolute_transform->transpose_xy) {
9797
x = self->absolute_transform->x + self->absolute_transform->dx * self->y;
9898
y = self->absolute_transform->y + self->absolute_transform->dy * self->x;
99+
if (self->absolute_transform->dx < 1) {
100+
out_area->y1 = out_area->y1 * -1 + 1;
101+
out_area->y2 = out_area->y2 * -1 + 1;
102+
}
103+
if (self->absolute_transform->dy < 1) {
104+
out_area->x1 = out_area->x1 * -1 + 1;
105+
out_area->x2 = out_area->x2 * -1 + 1;
106+
}
99107
area_transpose(out_area);
100108
} else {
109+
x = self->absolute_transform->x + self->absolute_transform->dx * self->x;
110+
y = self->absolute_transform->y + self->absolute_transform->dy * self->y;
111+
101112
if (self->absolute_transform->dx < 1) {
102113
out_area->x1 = out_area->x1 * -1 + 1;
103114
out_area->x2 = out_area->x2 * -1 + 1;
@@ -106,8 +117,6 @@ static void _get_screen_area(vectorio_vector_shape_t *self, displayio_area_t *ou
106117
out_area->y1 = out_area->y1 * -1 + 1;
107118
out_area->y2 = out_area->y2 * -1 + 1;
108119
}
109-
x = self->absolute_transform->x + self->absolute_transform->dx * self->x;
110-
y = self->absolute_transform->y + self->absolute_transform->dy * self->y;
111120
}
112121
displayio_area_canon(out_area);
113122
displayio_area_shift(out_area, x, y);
@@ -307,25 +316,35 @@ bool vectorio_vector_shape_fill_area(vectorio_vector_shape_t *self, const _displ
307316
if (self->absolute_transform->transpose_xy) {
308317
pixel_to_get_x = input_pixel.y - self->absolute_transform->y - self->absolute_transform->dy * self->x;
309318
pixel_to_get_y = input_pixel.x - self->absolute_transform->x - self->absolute_transform->dx * self->y;
310-
VECTORIO_SHAPE_PIXEL_DEBUG(" a(%3d, %3d)", pixel_to_get_x, pixel_to_get_y);
311319

312-
if (self->absolute_transform->mirror_x) {
313-
pixel_to_get_y = shape_area.y2 - 1 - pixel_to_get_y;
320+
VECTORIO_SHAPE_PIXEL_DEBUG(" a(%3d, %3d)", pixel_to_get_x, pixel_to_get_y);
321+
if (self->absolute_transform->dx < 1) {
322+
pixel_to_get_y *= -1;
314323
}
315-
if (self->absolute_transform->mirror_y) {
316-
pixel_to_get_x = shape_area.x2 - 1 - pixel_to_get_x;
324+
if (self->absolute_transform->dy < 1) {
325+
pixel_to_get_x *= -1;
317326
}
327+
VECTORIO_SHAPE_PIXEL_DEBUG(" b(%3d, %3d)", pixel_to_get_x, pixel_to_get_y);
318328
} else {
319329
pixel_to_get_x = input_pixel.x - self->absolute_transform->x - self->absolute_transform->dx * self->x;
320330
pixel_to_get_y = input_pixel.y - self->absolute_transform->y - self->absolute_transform->dy * self->y;
321-
VECTORIO_SHAPE_PIXEL_DEBUG(" a(%3d, %3d)", pixel_to_get_x, pixel_to_get_y);
322331

323-
if (self->absolute_transform->mirror_x) {
324-
pixel_to_get_x = (shape_area.x2 - shape_area.x1) - (pixel_to_get_x + shape_area.x1) + shape_area.x1 - 1;
332+
VECTORIO_SHAPE_PIXEL_DEBUG(" a(%3d, %3d)", pixel_to_get_x, pixel_to_get_y);
333+
if (self->absolute_transform->dx < 1) {
334+
pixel_to_get_x *= -1;
325335
}
326-
if (self->absolute_transform->mirror_y) {
327-
pixel_to_get_y = (shape_area.y2 - shape_area.y1) - (pixel_to_get_y + shape_area.y1) + +shape_area.y1 - 1;
336+
if (self->absolute_transform->dy < 1) {
337+
pixel_to_get_y *= -1;
328338
}
339+
VECTORIO_SHAPE_PIXEL_DEBUG(" b(%3d, %3d)", pixel_to_get_x, pixel_to_get_y);
340+
341+
// It's mirrored via dx. Maybe we need to add support for also separately mirroring?
342+
// if (self->absolute_transform->mirror_x) {
343+
// pixel_to_get_x = (shape_area.x2 - shape_area.x1) - (pixel_to_get_x - shape_area.x1) + shape_area.x1 - 1;
344+
// }
345+
// if (self->absolute_transform->mirror_y) {
346+
// pixel_to_get_y = (shape_area.y2 - shape_area.y1) - (pixel_to_get_y - shape_area.y1) + +shape_area.y1 - 1;
347+
// }
329348
}
330349

331350
VECTORIO_SHAPE_PIXEL_DEBUG(" get_pixel %p (%3d, %3d) -> ( %3d, %3d )", self->ishape.shape, input_pixel.x, input_pixel.y, pixel_to_get_x, pixel_to_get_y);
@@ -407,7 +426,7 @@ bool vectorio_vector_shape_fill_area(vectorio_vector_shape_t *self, const _displ
407426

408427

409428
void vectorio_vector_shape_finish_refresh(vectorio_vector_shape_t *self) {
410-
if (displayio_area_empty(&self->ephemeral_dirty_area)) {
429+
if (displayio_area_empty(&self->ephemeral_dirty_area) && !self->current_area_dirty) {
411430
return;
412431
}
413432
VECTORIO_SHAPE_DEBUG("%p finish_refresh was:{(%3d,%3d), (%3d,%3d)}\n", self, self->ephemeral_dirty_area.x1, self->ephemeral_dirty_area.y1, self->ephemeral_dirty_area.x2, self->ephemeral_dirty_area.y2);
@@ -484,6 +503,6 @@ displayio_area_t *vectorio_vector_shape_get_refresh_areas(vectorio_vector_shape_
484503
}
485504

486505
void vectorio_vector_shape_update_transform(vectorio_vector_shape_t *self, displayio_buffer_transform_t *group_transform) {
487-
common_hal_vectorio_vector_shape_set_dirty(self);
488506
self->absolute_transform = group_transform == NULL ? &null_transform : group_transform;
507+
common_hal_vectorio_vector_shape_set_dirty(self);
489508
}

0 commit comments

Comments
 (0)