@@ -81,19 +81,21 @@ void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) {
8181
8282 uint16_t total_tiles = width_in_tiles * height_in_tiles ;
8383
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+ }
9290 }
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+ }
9696 }
97+ uint8_t * tiles = (uint8_t * ) tilegrid_tiles -> ptr ;
98+
9799 grid -> y = tall ? blinka_bitmap .height : 0 ;
98100 grid -> x = tall ? 0 : blinka_bitmap .width ;
99101 grid -> top_left_y = 0 ;
@@ -120,28 +122,17 @@ void supervisor_stop_terminal(void) {
120122 if (tilegrid_tiles != NULL ) {
121123 free_memory (tilegrid_tiles );
122124 tilegrid_tiles = NULL ;
123- supervisor_terminal_text_grid .inline_tiles = false;
124125 supervisor_terminal_text_grid .tiles = NULL ;
125126 }
126127 #endif
127128}
128129
129130void supervisor_display_move_memory (void ) {
130131 #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 ;
145136 }
146137 #endif
147138
0 commit comments