@@ -302,7 +302,7 @@ inline
302
302
void render_stage (uint16_t x0 , uint16_t y0 , uint16_t x1 , uint16_t y1 ,
303
303
mp_obj_t * layers , size_t layers_size ,
304
304
uint16_t * buffer , size_t buffer_size ,
305
- mp_obj_t spi ) {
305
+ mp_obj_t spi , uint8_t scale ) {
306
306
307
307
// TODO(deshipu): Do a collision check of each layer with the
308
308
// rectangle, and only process the layers that overlap with it.
@@ -312,27 +312,31 @@ void render_stage(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1,
312
312
313
313
size_t index = 0 ;
314
314
for (uint16_t y = y0 ; y < y1 ; ++ y ) {
315
- for (uint16_t x = x0 ; x < x1 ; ++ x ) {
316
- for (size_t layer = 0 ; layer < layers_size ; ++ layer ) {
315
+ for (uint8_t yscale = 0 ; yscale < scale ; ++ yscale ) {
316
+ for (uint16_t x = x0 ; x < x1 ; ++ x ) {
317
317
uint16_t c = TRANSPARENT ;
318
- layer_obj_t * obj = MP_OBJ_TO_PTR (layers [layer ]);
319
- if (obj -> base .type == & mp_type_layer ) {
320
- c = get_layer_pixel (obj , x , y );
321
- } else if (obj -> base .type == & mp_type_text ) {
322
- c = get_text_pixel ((text_obj_t * )obj , x , y );
318
+ for (size_t layer = 0 ; layer < layers_size ; ++ layer ) {
319
+ layer_obj_t * obj = MP_OBJ_TO_PTR (layers [layer ]);
320
+ if (obj -> base .type == & mp_type_layer ) {
321
+ c = get_layer_pixel (obj , x , y );
322
+ } else if (obj -> base .type == & mp_type_text ) {
323
+ c = get_text_pixel ((text_obj_t * )obj , x , y );
324
+ }
325
+ if (c != TRANSPARENT ) {
326
+ break ;
327
+ }
323
328
}
324
- if ( c != TRANSPARENT ) {
329
+ for ( uint8_t xscale = 0 ; xscale < scale ; ++ xscale ) {
325
330
buffer [index ] = c ;
326
- break ;
331
+ index += 1 ;
332
+ // The buffer is full, send it.
333
+ if (index >= buffer_size ) {
334
+ spi_p -> transfer (s , buffer_size * 2 ,
335
+ (const uint8_t * )buffer , NULL );
336
+ index = 0 ;
337
+ }
327
338
}
328
339
}
329
- index += 1 ;
330
- // The buffer is full, send it.
331
- if (index >= buffer_size ) {
332
- spi_p -> transfer (s , buffer_size * 2 ,
333
- (const uint8_t * )buffer , NULL );
334
- index = 0 ;
335
- }
336
340
}
337
341
}
338
342
// Send the remaining data.
@@ -363,12 +367,17 @@ STATIC mp_obj_t stage_render(size_t n_args, const mp_obj_t *args) {
363
367
if (type -> protocol == NULL ) {
364
368
mp_raise_ValueError ("SPI protocol required" );
365
369
}
370
+ uint8_t scale = 1 ;
371
+ if (n_args >= 8 ) {
372
+ scale = mp_obj_get_int (args [7 ]);
373
+ }
366
374
367
- render_stage (x0 , y0 , x1 , y1 , layers , layers_size , buffer , buffer_size , spi );
375
+ render_stage (x0 , y0 , x1 , y1 , layers , layers_size ,
376
+ buffer , buffer_size , spi , scale );
368
377
369
378
return mp_const_none ;
370
379
}
371
- MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (stage_render_obj , 7 , 7 , stage_render );
380
+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (stage_render_obj , 7 , 8 , stage_render );
372
381
373
382
374
383
STATIC const mp_rom_map_elem_t stage_module_globals_table [] = {
0 commit comments