@@ -74,6 +74,7 @@ void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_
74
74
self -> flip_x = false;
75
75
self -> flip_y = false;
76
76
self -> transpose_xy = false;
77
+ self -> absolute_transform = NULL ;
77
78
}
78
79
79
80
@@ -110,17 +111,24 @@ void _update_current_x(displayio_tilegrid_t *self) {
110
111
} else {
111
112
width = self -> pixel_width ;
112
113
}
113
- if (self -> absolute_transform -> transpose_xy ) {
114
- self -> current_area .y1 = self -> absolute_transform -> y + self -> absolute_transform -> dy * self -> x ;
115
- self -> current_area .y2 = self -> absolute_transform -> y + self -> absolute_transform -> dy * (self -> x + width );
114
+
115
+ // If there's no transform, substitute an identity transform so the calculations will work.
116
+ const displayio_buffer_transform_t * absolute_transform =
117
+ self -> absolute_transform == NULL
118
+ ? & null_transform
119
+ : self -> absolute_transform ;
120
+
121
+ if (absolute_transform -> transpose_xy ) {
122
+ self -> current_area .y1 = absolute_transform -> y + absolute_transform -> dy * self -> x ;
123
+ self -> current_area .y2 = absolute_transform -> y + absolute_transform -> dy * (self -> x + width );
116
124
if (self -> current_area .y2 < self -> current_area .y1 ) {
117
125
int16_t temp = self -> current_area .y2 ;
118
126
self -> current_area .y2 = self -> current_area .y1 ;
119
127
self -> current_area .y1 = temp ;
120
128
}
121
129
} else {
122
- self -> current_area .x1 = self -> absolute_transform -> x + self -> absolute_transform -> dx * self -> x ;
123
- self -> current_area .x2 = self -> absolute_transform -> x + self -> absolute_transform -> dx * (self -> x + width );
130
+ self -> current_area .x1 = absolute_transform -> x + absolute_transform -> dx * self -> x ;
131
+ self -> current_area .x2 = absolute_transform -> x + absolute_transform -> dx * (self -> x + width );
124
132
if (self -> current_area .x2 < self -> current_area .x1 ) {
125
133
int16_t temp = self -> current_area .x2 ;
126
134
self -> current_area .x2 = self -> current_area .x1 ;
@@ -136,17 +144,24 @@ void _update_current_y(displayio_tilegrid_t *self) {
136
144
} else {
137
145
height = self -> pixel_height ;
138
146
}
139
- if (self -> absolute_transform -> transpose_xy ) {
140
- self -> current_area .x1 = self -> absolute_transform -> x + self -> absolute_transform -> dx * self -> y ;
141
- self -> current_area .x2 = self -> absolute_transform -> x + self -> absolute_transform -> dx * (self -> y + height );
147
+
148
+ // If there's no transform, substitute an identity transform so the calculations will work.
149
+ const displayio_buffer_transform_t * absolute_transform =
150
+ self -> absolute_transform == NULL
151
+ ? & null_transform
152
+ : self -> absolute_transform ;
153
+
154
+ if (absolute_transform -> transpose_xy ) {
155
+ self -> current_area .x1 = absolute_transform -> x + absolute_transform -> dx * self -> y ;
156
+ self -> current_area .x2 = absolute_transform -> x + absolute_transform -> dx * (self -> y + height );
142
157
if (self -> current_area .x2 < self -> current_area .x1 ) {
143
158
int16_t temp = self -> current_area .x2 ;
144
159
self -> current_area .x2 = self -> current_area .x1 ;
145
160
self -> current_area .x1 = temp ;
146
161
}
147
162
} else {
148
- self -> current_area .y1 = self -> absolute_transform -> y + self -> absolute_transform -> dy * self -> y ;
149
- self -> current_area .y2 = self -> absolute_transform -> y + self -> absolute_transform -> dy * (self -> y + height );
163
+ self -> current_area .y1 = absolute_transform -> y + absolute_transform -> dy * self -> y ;
164
+ self -> current_area .y2 = absolute_transform -> y + absolute_transform -> dy * (self -> y + height );
150
165
if (self -> current_area .y2 < self -> current_area .y1 ) {
151
166
int16_t temp = self -> current_area .y2 ;
152
167
self -> current_area .y2 = self -> current_area .y1 ;
0 commit comments