@@ -28,34 +28,39 @@ static int32_t max(int32_t a, int32_t b) {
28
28
}
29
29
30
30
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
-
49
31
inline __attribute__((always_inline ))
50
32
static 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
+ );
52
37
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 );
53
39
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 ;
56
46
} 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 ;
58
62
}
63
+ VECTORIO_SHAPE_DEBUG (" out:{(%5d,%5d), (%5d,%5d)}\n" , out_area -> x1 , out_area -> y1 , out_area -> x2 , out_area -> y2 );
59
64
}
60
65
61
66
@@ -79,8 +84,8 @@ void common_hal_vectorio_vector_shape_set_dirty(void *vector_shape) {
79
84
static displayio_buffer_transform_t null_transform = {
80
85
.x = 0 ,
81
86
.y = 0 ,
82
- .dx = 0 ,
83
- .dy = 0 ,
87
+ .dx = 1 ,
88
+ .dy = 1 ,
84
89
.scale = 1 ,
85
90
.width = 0 ,
86
91
.height = 0 ,
@@ -99,9 +104,9 @@ void common_hal_vectorio_vector_shape_construct(vectorio_vector_shape_t *self,
99
104
self -> pixel_shader = pixel_shader ;
100
105
self -> ishape = ishape ;
101
106
self -> dirty = true;
107
+ self -> absolute_transform = & null_transform ; // Critical to have a valid transform before getting screen area.
102
108
_get_screen_area (self , & self -> ephemeral_dirty_area );
103
109
self -> ephemeral_dirty_area .next = NULL ;
104
- self -> absolute_transform = & null_transform ;
105
110
}
106
111
107
112
@@ -156,9 +161,7 @@ bool vectorio_vector_shape_fill_area(vectorio_vector_shape_t *self, const _displ
156
161
// Pixels are drawn on the screen_area (shifted) coordinate space, while pixels are _determined_ from
157
162
// the shape_area (unshifted) space.
158
163
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)}" ,
162
165
self , self -> dirty ,
163
166
area -> x1 , area -> y1 , area -> x2 , area -> y2 ,
164
167
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
200
203
int16_t pixel_to_get_x ;
201
204
int16_t pixel_to_get_y ;
202
205
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 ;
205
208
} 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 ;
208
211
}
209
212
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 );
210
213
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_
289
292
}
290
293
291
294
void 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 ;
293
296
common_hal_vectorio_vector_shape_set_dirty (self );
294
297
}
295
298
0 commit comments