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
409428void 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
486505void 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