@@ -28,34 +28,39 @@ static int32_t max(int32_t a, int32_t b) {
2828}
2929
3030
31- inline __attribute__((always_inline ))
32- static void _transpose_area (displayio_area_t * out_area ) {
33- int16_t swap = out_area -> x1 ;
34- out_area -> x1 = out_area -> y1 ;
35- out_area -> y1 = swap ;
36- swap = out_area -> x2 ;
37- out_area -> x2 = out_area -> y2 ;
38- out_area -> y2 = swap ;
39- }
40-
41-
42- inline __attribute__((always_inline ))
43- static void _get_shape_area (vectorio_vector_shape_t * self , displayio_area_t * out_area ) {
44- VECTORIO_SHAPE_DEBUG ("%p get_area\n" , self );
45- self -> ishape .get_area (self -> ishape .shape , out_area );
46- }
47-
48-
4931inline __attribute__((always_inline ))
5032static void _get_screen_area (vectorio_vector_shape_t * self , displayio_area_t * out_area ) {
51- VECTORIO_SHAPE_DEBUG ("%p get_screen_area\n" , self );
33+ VECTORIO_SHAPE_DEBUG ("%p get_screen_area tform:{x:%d y:%d dx:%d dy:%d scl:%d w:%d h:%d mx:%d my:%d tr:%d}" , self ,
34+ self -> absolute_transform -> x , self -> absolute_transform -> y , self -> absolute_transform -> dx , self -> absolute_transform -> dy , self -> absolute_transform -> scale ,
35+ self -> absolute_transform -> width , self -> absolute_transform -> height , self -> absolute_transform -> mirror_x , self -> absolute_transform -> mirror_y , self -> absolute_transform -> transpose_xy
36+ );
5237 self -> ishape .get_area (self -> ishape .shape , out_area );
38+ VECTORIO_SHAPE_DEBUG (" in:{(%5d,%5d), (%5d,%5d)}" , out_area -> x1 , out_area -> y1 , out_area -> x2 , out_area -> y2 );
5339 if (self -> absolute_transform -> transpose_xy ) {
54- _transpose_area (out_area );
55- displayio_area_shift (out_area , self -> y , self -> x );
40+ int16_t swap = out_area -> x1 ;
41+ out_area -> x1 = (out_area -> y1 + self -> y ) * self -> absolute_transform -> dx + self -> absolute_transform -> x ;
42+ out_area -> y1 = (swap + self -> x ) * self -> absolute_transform -> dy + self -> absolute_transform -> y ;
43+ swap = out_area -> x2 ;
44+ out_area -> x2 = (out_area -> y2 + self -> y ) * self -> absolute_transform -> dx + self -> absolute_transform -> x ;
45+ out_area -> y2 = (swap + self -> x ) * self -> absolute_transform -> dy + self -> absolute_transform -> y ;
5646 } else {
57- displayio_area_shift (out_area , self -> x , self -> y );
47+ out_area -> x1 = (out_area -> x1 + self -> x ) * self -> absolute_transform -> dx + self -> absolute_transform -> x ;
48+ out_area -> y1 = (out_area -> y1 + self -> y ) * self -> absolute_transform -> dy + self -> absolute_transform -> y ;
49+ out_area -> x2 = (out_area -> x2 + self -> x ) * self -> absolute_transform -> dx + self -> absolute_transform -> x ;
50+ out_area -> y2 = (out_area -> y2 + self -> y ) * self -> absolute_transform -> dy + self -> absolute_transform -> y ;
51+ }
52+ // We might have mirrored due to dx
53+ if (out_area -> x2 < out_area -> x1 ) {
54+ int16_t swap = out_area -> x1 ;
55+ out_area -> x1 = out_area -> x2 ;
56+ out_area -> x2 = swap ;
57+ }
58+ if (out_area -> y2 < out_area -> y1 ) {
59+ int16_t swap = out_area -> y1 ;
60+ out_area -> y1 = out_area -> y2 ;
61+ out_area -> y2 = swap ;
5862 }
63+ VECTORIO_SHAPE_DEBUG (" out:{(%5d,%5d), (%5d,%5d)}\n" , out_area -> x1 , out_area -> y1 , out_area -> x2 , out_area -> y2 );
5964}
6065
6166
@@ -79,8 +84,8 @@ void common_hal_vectorio_vector_shape_set_dirty(void *vector_shape) {
7984static displayio_buffer_transform_t null_transform = {
8085 .x = 0 ,
8186 .y = 0 ,
82- .dx = 0 ,
83- .dy = 0 ,
87+ .dx = 1 ,
88+ .dy = 1 ,
8489 .scale = 1 ,
8590 .width = 0 ,
8691 .height = 0 ,
@@ -99,9 +104,9 @@ void common_hal_vectorio_vector_shape_construct(vectorio_vector_shape_t *self,
99104 self -> pixel_shader = pixel_shader ;
100105 self -> ishape = ishape ;
101106 self -> dirty = true;
107+ self -> absolute_transform = & null_transform ; // Critical to have a valid transform before getting screen area.
102108 _get_screen_area (self , & self -> ephemeral_dirty_area );
103109 self -> ephemeral_dirty_area .next = NULL ;
104- self -> absolute_transform = & null_transform ;
105110}
106111
107112
@@ -156,9 +161,7 @@ bool vectorio_vector_shape_fill_area(vectorio_vector_shape_t *self, const _displ
156161 // Pixels are drawn on the screen_area (shifted) coordinate space, while pixels are _determined_ from
157162 // the shape_area (unshifted) space.
158163 displayio_area_t overlap ;
159- displayio_area_t shape_area ;
160- _get_shape_area (self , & shape_area );
161- VECTORIO_SHAPE_DEBUG ("%p fill_area dirty:%d fill: {(%3d,%3d), (%3d,%3d)} dirty: {(%3d,%3d), (%3d,%3d)}" ,
164+ VECTORIO_SHAPE_DEBUG ("%p fill_area dirty:%d fill: {(%5d,%5d), (%5d,%5d)} dirty: {(%5d,%5d), (%5d,%5d)}" ,
162165 self , self -> dirty ,
163166 area -> x1 , area -> y1 , area -> x2 , area -> y2 ,
164167 self -> ephemeral_dirty_area .x1 , self -> ephemeral_dirty_area .y1 , self -> ephemeral_dirty_area .x2 , self -> ephemeral_dirty_area .y2
@@ -200,11 +203,11 @@ bool vectorio_vector_shape_fill_area(vectorio_vector_shape_t *self, const _displ
200203 int16_t pixel_to_get_x ;
201204 int16_t pixel_to_get_y ;
202205 if (self -> absolute_transform -> transpose_xy ) {
203- pixel_to_get_x = input_pixel .y - self -> x ;
204- pixel_to_get_y = input_pixel .x - self -> y ;
206+ pixel_to_get_x = ( input_pixel .y - self -> absolute_transform -> dy * self -> x - self -> absolute_transform -> y ) / self -> absolute_transform -> dy ;
207+ pixel_to_get_y = ( input_pixel .x - self -> absolute_transform -> dx * self -> y - self -> absolute_transform -> x ) / self -> absolute_transform -> dx ;
205208 } else {
206- pixel_to_get_x = input_pixel .x - self -> x ;
207- pixel_to_get_y = input_pixel .y - self -> y ;
209+ pixel_to_get_x = ( input_pixel .x - self -> absolute_transform -> dx * self -> x ) / self -> absolute_transform -> dx ;
210+ pixel_to_get_y = ( input_pixel .y - self -> absolute_transform -> dy * self -> y ) / self -> absolute_transform -> dy ;
208211 }
209212 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 );
210213 input_pixel .pixel = self -> ishape .get_pixel (self -> ishape .shape , pixel_to_get_x , pixel_to_get_y );
@@ -289,7 +292,7 @@ displayio_area_t* vectorio_vector_shape_get_refresh_areas(vectorio_vector_shape_
289292}
290293
291294void vectorio_vector_shape_update_transform (vectorio_vector_shape_t * self , displayio_buffer_transform_t * group_transform ) {
292- self -> absolute_transform = group_transform ;
295+ self -> absolute_transform = group_transform == NULL ? & null_transform : group_transform ;
293296 common_hal_vectorio_vector_shape_set_dirty (self );
294297}
295298
0 commit comments