2929#include <string.h>
3030
3131#include "py/mpstate.h"
32+ #include "shared-bindings/displayio/Bitmap.h"
3233#include "shared-bindings/displayio/Group.h"
3334#include "shared-bindings/displayio/Palette.h"
3435#include "shared-bindings/displayio/TileGrid.h"
@@ -48,23 +49,28 @@ extern size_t blinka_bitmap_data[];
4849extern displayio_bitmap_t blinka_bitmap ;
4950extern displayio_group_t circuitpython_splash ;
5051
52+ #if CIRCUITPY_TERMINALIO
5153static supervisor_allocation * tilegrid_tiles = NULL ;
54+ #endif
5255
5356void supervisor_start_terminal (uint16_t width_px , uint16_t height_px ) {
57+ // Default the scale to 2 because we may show blinka without the terminal for
58+ // languages that don't have font support.
59+ uint8_t scale = 2 ;
60+
61+ #if CIRCUITPY_TERMINALIO
5462 displayio_tilegrid_t * grid = & supervisor_terminal_text_grid ;
5563 uint16_t width_in_tiles = (width_px - blinka_bitmap .width ) / grid -> tile_width ;
5664 // determine scale based on h
57- uint8_t scale = 1 ;
58- if (width_in_tiles > 80 ) {
59- scale = 2 ;
65+ if (width_in_tiles < 80 ) {
66+ scale = 1 ;
6067 }
6168 width_in_tiles = (width_px - blinka_bitmap .width * scale ) / (grid -> tile_width * scale );
6269 uint16_t height_in_tiles = height_px / (grid -> tile_height * scale );
6370 uint16_t remaining_pixels = height_px % (grid -> tile_height * scale );
6471 if (remaining_pixels > 0 ) {
6572 height_in_tiles += 1 ;
6673 }
67- circuitpython_splash .scale = scale ;
6874
6975 uint16_t total_tiles = width_in_tiles * height_in_tiles ;
7076
@@ -94,34 +100,42 @@ void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) {
94100 grid -> full_change = true;
95101
96102 common_hal_terminalio_terminal_construct (& supervisor_terminal , grid , & supervisor_terminal_font );
103+ #endif
104+
105+ circuitpython_splash .scale = scale ;
97106}
98107
99108void supervisor_stop_terminal (void ) {
109+ #if CIRCUITPY_TERMINALIO
100110 if (tilegrid_tiles != NULL ) {
101111 free_memory (tilegrid_tiles );
102112 tilegrid_tiles = NULL ;
103113 supervisor_terminal_text_grid .inline_tiles = false;
104114 supervisor_terminal_text_grid .tiles = NULL ;
105115 }
116+ #endif
106117}
107118
108119void supervisor_display_move_memory (void ) {
109- #if CIRCUITPY_DISPLAYIO
120+ #if CIRCUITPY_TERMINALIO
110121 displayio_tilegrid_t * grid = & supervisor_terminal_text_grid ;
111- if (MP_STATE_VM (terminal_tilegrid_tiles ) == NULL || grid -> tiles != MP_STATE_VM (terminal_tilegrid_tiles )) {
112- return ;
113- }
114- uint16_t total_tiles = grid -> width_in_tiles * grid -> height_in_tiles ;
122+ if (MP_STATE_VM (terminal_tilegrid_tiles ) != NULL &&
123+ grid -> tiles == MP_STATE_VM (terminal_tilegrid_tiles )) {
124+ uint16_t total_tiles = grid -> width_in_tiles * grid -> height_in_tiles ;
115125
116- tilegrid_tiles = allocate_memory (align32_size (total_tiles ), false);
117- if (tilegrid_tiles != NULL ) {
118- memcpy (tilegrid_tiles -> ptr , grid -> tiles , total_tiles );
119- grid -> tiles = (uint8_t * ) tilegrid_tiles -> ptr ;
120- } else {
121- grid -> tiles = NULL ;
122- grid -> inline_tiles = false;
126+ tilegrid_tiles = allocate_memory (align32_size (total_tiles ), false);
127+ if (tilegrid_tiles != NULL ) {
128+ memcpy (tilegrid_tiles -> ptr , grid -> tiles , total_tiles );
129+ grid -> tiles = (uint8_t * ) tilegrid_tiles -> ptr ;
130+ } else {
131+ grid -> tiles = NULL ;
132+ grid -> inline_tiles = false;
133+ }
134+ MP_STATE_VM (terminal_tilegrid_tiles ) = NULL ;
123135 }
124- MP_STATE_VM (terminal_tilegrid_tiles ) = NULL ;
136+ #endif
137+
138+ #if CIRCUITPY_DISPLAYIO
125139 for (uint8_t i = 0 ; i < CIRCUITPY_DISPLAY_LIMIT ; i ++ ) {
126140 #if CIRCUITPY_RGBMATRIX
127141 if (displays [i ].rgbmatrix .base .type == & rgbmatrix_RGBMatrix_type ) {
@@ -254,18 +268,26 @@ displayio_tilegrid_t blinka_sprite = {
254268 .in_group = true
255269};
256270
271+ #if CIRCUITPY_TERMINALIO
272+ #define CHILD_COUNT 2
257273displayio_group_child_t splash_children [2 ] = {
258274 {& blinka_sprite , & blinka_sprite },
259275 {& supervisor_terminal_text_grid , & supervisor_terminal_text_grid }
260276};
277+ #else
278+ #define CHILD_COUNT 1
279+ displayio_group_child_t splash_children [1 ] = {
280+ {& blinka_sprite , & blinka_sprite },
281+ };
282+ #endif
261283
262284displayio_group_t circuitpython_splash = {
263285 .base = {.type = & displayio_group_type },
264286 .x = 0 ,
265287 .y = 0 ,
266288 .scale = 2 ,
267- .size = 2 ,
268- .max_size = 2 ,
289+ .size = CHILD_COUNT ,
290+ .max_size = CHILD_COUNT ,
269291 .children = splash_children ,
270292 .item_removed = false,
271293 .in_group = false,
0 commit comments