@@ -81,19 +81,21 @@ void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) {
81
81
82
82
uint16_t total_tiles = width_in_tiles * height_in_tiles ;
83
83
84
- // First try to allocate outside the heap. This will fail when the VM is running.
85
- tilegrid_tiles = allocate_memory (align32_size (total_tiles ), false, false);
86
- uint8_t * tiles ;
87
- if (tilegrid_tiles == NULL ) {
88
- tiles = m_malloc (total_tiles , true);
89
- MP_STATE_VM (terminal_tilegrid_tiles ) = tiles ;
90
- } else {
91
- tiles = (uint8_t * ) tilegrid_tiles -> ptr ;
84
+ // Reuse the previous allocation if possible
85
+ if (tilegrid_tiles ) {
86
+ if (get_allocation_length (tilegrid_tiles ) != align32_size (total_tiles )) {
87
+ free_memory (tilegrid_tiles );
88
+ tilegrid_tiles = NULL ;
89
+ }
92
90
}
93
-
94
- if (tiles == NULL ) {
95
- return ;
91
+ if (!tilegrid_tiles ) {
92
+ tilegrid_tiles = allocate_memory (align32_size (total_tiles ), false, true);
93
+ if (!tilegrid_tiles ) {
94
+ return ;
95
+ }
96
96
}
97
+ uint8_t * tiles = (uint8_t * ) tilegrid_tiles -> ptr ;
98
+
97
99
grid -> y = tall ? blinka_bitmap .height : 0 ;
98
100
grid -> x = tall ? 0 : blinka_bitmap .width ;
99
101
grid -> top_left_y = 0 ;
@@ -120,28 +122,17 @@ void supervisor_stop_terminal(void) {
120
122
if (tilegrid_tiles != NULL ) {
121
123
free_memory (tilegrid_tiles );
122
124
tilegrid_tiles = NULL ;
123
- supervisor_terminal_text_grid .inline_tiles = false;
124
125
supervisor_terminal_text_grid .tiles = NULL ;
125
126
}
126
127
#endif
127
128
}
128
129
129
130
void supervisor_display_move_memory (void ) {
130
131
#if CIRCUITPY_TERMINALIO
131
- displayio_tilegrid_t * grid = & supervisor_terminal_text_grid ;
132
- if (MP_STATE_VM (terminal_tilegrid_tiles ) != NULL &&
133
- grid -> tiles == MP_STATE_VM (terminal_tilegrid_tiles )) {
134
- uint16_t total_tiles = grid -> width_in_tiles * grid -> height_in_tiles ;
135
-
136
- tilegrid_tiles = allocate_memory (align32_size (total_tiles ), false, false);
137
- if (tilegrid_tiles != NULL ) {
138
- memcpy (tilegrid_tiles -> ptr , grid -> tiles , total_tiles );
139
- grid -> tiles = (uint8_t * ) tilegrid_tiles -> ptr ;
140
- } else {
141
- grid -> tiles = NULL ;
142
- grid -> inline_tiles = false;
143
- }
144
- MP_STATE_VM (terminal_tilegrid_tiles ) = NULL ;
132
+ if (tilegrid_tiles != NULL ) {
133
+ supervisor_terminal_text_grid .tiles = (uint8_t * ) tilegrid_tiles -> ptr ;
134
+ } else {
135
+ supervisor_terminal_text_grid .tiles = NULL ;
145
136
}
146
137
#endif
147
138
0 commit comments