@@ -494,6 +494,58 @@ STATIC mp_obj_t framebuf_text(size_t n_args, const mp_obj_t *args) {
494
494
}
495
495
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (framebuf_text_obj , 4 , 5 , framebuf_text );
496
496
497
+ STATIC mp_obj_t framebuf_text_scaled (size_t n_args , const mp_obj_t * args ) {
498
+ // extract arguments
499
+ mp_obj_framebuf_t * self = MP_OBJ_TO_PTR (args [0 ]);
500
+ const char * str = mp_obj_str_get_str (args [1 ]);
501
+ mp_int_t x0 = mp_obj_get_int (args [2 ]);
502
+ mp_int_t y0 = mp_obj_get_int (args [3 ]);
503
+
504
+ mp_int_t scale = 1 ;
505
+ if (n_args >= 5 ) {
506
+ scale = mp_obj_get_int (args [4 ]);
507
+ }
508
+
509
+ mp_int_t col = 1 ;
510
+ if (n_args >= 6 ) {
511
+ col = mp_obj_get_int (args [5 ]);
512
+ }
513
+
514
+ // loop over chars
515
+ for (; * str ; ++ str ) {
516
+ // get char and make sure its in range of font
517
+ int chr = * (uint8_t * )str ;
518
+ if (chr < 32 || chr > 127 ) {
519
+ chr = 127 ;
520
+ }
521
+ // get char data
522
+ const uint8_t * chr_data = & font_petme128_8x8 [(chr - 32 ) * 8 ];
523
+ // loop over char data
524
+ mp_int_t xs = 0 ;
525
+ mp_int_t ys = 0 ;
526
+ for (int j = 0 ; j < 8 ; j ++ , x0 += scale ) {
527
+ uint vline_data = chr_data [j ]; // each byte is a column of 8 pixels, LSB at top
528
+ for (int y = y0 ; vline_data ; vline_data >>= 1 , y += scale ) { // scan over vertical column
529
+ if (vline_data & 1 ) { // only draw if pixel set
530
+ for (int sx = 0 ; sx < scale ; sx ++ ) {
531
+ xs = x0 + sx ;
532
+ if (0 <= xs && xs < self -> width ) { // clip x
533
+ for (int sy = 0 ; sy < scale ; sy ++ ) {
534
+ ys = y + sy ;
535
+ if (0 <= ys && ys < self -> height ) { // clip y
536
+ setpixel (self , xs , ys , col );
537
+ }
538
+ }
539
+ }
540
+ }
541
+ }
542
+ }
543
+ }
544
+ }
545
+ return mp_const_none ;
546
+ }
547
+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (framebuf_text_scaled_obj , 5 , 6 , framebuf_text_scaled );
548
+
497
549
STATIC const mp_rom_map_elem_t framebuf_locals_dict_table [] = {
498
550
{ MP_ROM_QSTR (MP_QSTR_fill ), MP_ROM_PTR (& framebuf_fill_obj ) },
499
551
{ MP_ROM_QSTR (MP_QSTR_fill_rect ), MP_ROM_PTR (& framebuf_fill_rect_obj ) },
@@ -505,6 +557,7 @@ STATIC const mp_rom_map_elem_t framebuf_locals_dict_table[] = {
505
557
{ MP_ROM_QSTR (MP_QSTR_blit ), MP_ROM_PTR (& framebuf_blit_obj ) },
506
558
{ MP_ROM_QSTR (MP_QSTR_scroll ), MP_ROM_PTR (& framebuf_scroll_obj ) },
507
559
{ MP_ROM_QSTR (MP_QSTR_text ), MP_ROM_PTR (& framebuf_text_obj ) },
560
+ { MP_ROM_QSTR (MP_QSTR_text_scaled ), MP_ROM_PTR (& framebuf_text_scaled_obj ) },
508
561
};
509
562
STATIC MP_DEFINE_CONST_DICT (framebuf_locals_dict , framebuf_locals_dict_table );
510
563
0 commit comments