aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-04-23 17:16:39 +0200
committerBad Diode <bd@badd10de.dev>2023-04-23 17:16:39 +0200
commita4092c4a6b1ad1589552c06b29a72d868ef778f1 (patch)
treed08027606a4d490a85798cb09a5d7631366426b9
parentff6e784e7c5ebe223666c6c631305397ad358289 (diff)
downloadstepper-a4092c4a6b1ad1589552c06b29a72d868ef778f1.tar.gz
stepper-a4092c4a6b1ad1589552c06b29a72d868ef778f1.zip
Fix small font rendering and sprite drawing
-rw-r--r--src/assets.c8
-rw-r--r--src/drawing.c258
-rw-r--r--src/main.c3
-rw-r--r--src/renderer.c73
-rw-r--r--src/renderer_m0.c19
5 files changed, 153 insertions, 208 deletions
diff --git a/src/assets.c b/src/assets.c
index 74d27d2..64a2265 100644
--- a/src/assets.c
+++ b/src/assets.c
@@ -104,10 +104,10 @@ u32 ch_btn_sprite[] = {
104}; 104};
105 105
106static const u32 default_wave_buttons[] = { 106static const u32 default_wave_buttons[] = {
107 0xff013149, 0x850101ff, 0x3f202028, 0x2423203f, 107 0x493101ff, 0xff010185, 0x2820203f, 0x3f202324,
108 0xff016151, 0x49c501ff, 0x3f202c2a, 0x2928203f, 108 0x516101ff, 0xff01c549, 0x2a2c203f, 0x3f202829,
109 0xff017d45, 0x45c501ff, 0x3f202828, 0x282f203f, 109 0x457d01ff, 0xff01c545, 0x2828203f, 0x3f202f28,
110 0xff014911, 0x812501ff, 0x3f202128, 0x2420203f, 110 0x114901ff, 0xff012581, 0x2821203f, 0x3f202024,
111}; 111};
112 112
113// 113//
diff --git a/src/drawing.c b/src/drawing.c
index 4f08e39..b790595 100644
--- a/src/drawing.c
+++ b/src/drawing.c
@@ -157,7 +157,7 @@ void
157draw_bank_buttons() { 157draw_bank_buttons() {
158 size_t x = BANK_START_X; 158 size_t x = BANK_START_X;
159 size_t y = BANK_START_Y; 159 size_t y = BANK_START_Y;
160 // txt_drawf_small("BANK", x - 2, y - 10, 4, COL_FG); 160 txt_drawf_small("BANK", x - 2, y - 10, COL_FG);
161 char bank_names[] = { 161 char bank_names[] = {
162 'A', 'B', 'C', 'D', 162 'A', 'B', 'C', 'D',
163 }; 163 };
@@ -168,7 +168,7 @@ draw_bank_buttons() {
168 } 168 }
169 draw_filled_rect(x, y, x + PAT_W, y + PAT_H, COL_BG); 169 draw_filled_rect(x, y, x + PAT_W, y + PAT_H, COL_BG);
170 draw_rect(x, y, x + PAT_W, y + PAT_H, color); 170 draw_rect(x, y, x + PAT_W, y + PAT_H, color);
171 // txt_drawc(bank_names[i], x + 4, y + 2, 6, color); 171 txt_drawc(bank_names[i], x + 4, y + 2, color);
172 y += PAT_OFFSET_Y; 172 y += PAT_OFFSET_Y;
173 } 173 }
174} 174}
@@ -177,7 +177,7 @@ void
177draw_pattern_buttons() { 177draw_pattern_buttons() {
178 size_t x = PAT_START_X; 178 size_t x = PAT_START_X;
179 size_t y = PAT_START_Y; 179 size_t y = PAT_START_Y;
180 // txt_drawf_small("PAT", x, y - 10, 4, COL_FG); 180 txt_drawf_small("PAT", x, y - 10, COL_FG);
181 char pat_names[] = { 181 char pat_names[] = {
182 'A', 'B', 'C', 'D', 182 'A', 'B', 'C', 'D',
183 'E', 'F', 'G', 'H', 183 'E', 'F', 'G', 'H',
@@ -192,7 +192,7 @@ draw_pattern_buttons() {
192 } 192 }
193 draw_filled_rect(x, y, x + PAT_W, y + PAT_H, COL_BG); 193 draw_filled_rect(x, y, x + PAT_W, y + PAT_H, COL_BG);
194 draw_rect(x, y, x + PAT_W, y + PAT_H, color); 194 draw_rect(x, y, x + PAT_W, y + PAT_H, color);
195 // txt_drawc(pat_names[i], x + 4, y + 2, 6, color); 195 txt_drawc(pat_names[i], x + 4, y + 2, color);
196 y += PAT_OFFSET_Y; 196 y += PAT_OFFSET_Y;
197 } 197 }
198} 198}
@@ -244,14 +244,14 @@ draw_bpm() {
244 draw_filled_rect(x, y, x + R_COL_W, y + BPM_H, COL_BG); 244 draw_filled_rect(x, y, x + R_COL_W, y + BPM_H, COL_BG);
245 draw_rect(x, y, x + R_COL_W, y + BPM_H, COL_FG); 245 draw_rect(x, y, x + R_COL_W, y + BPM_H, COL_FG);
246 draw_line(x + 5, y, x + 19, y, COL_BG); 246 draw_line(x + 5, y, x + 19, y, COL_BG);
247 // txt_drawf_small("BPM", x + 5, y - 4, 4, COL_FG); 247 txt_drawf_small("BPM", x + 5, y - 4, COL_FG);
248 248
249 // Make sure its horizontally centered if only 2 digits 249 // Make sure its horizontally centered if only 2 digits
250 int bpm = patterns[pattern_selection_loc].bpm; 250 int bpm = patterns[pattern_selection_loc].bpm;
251 if (bpm >= 100) { 251 if (bpm >= 100) {
252 txt_drawf("%d", x + 3, y + 7, 6, COL_FG, bpm); 252 txt_drawf("%d", x + 3, y + 7, COL_FG, bpm);
253 } else { 253 } else {
254 txt_drawf("%d", x + 6, y + 7, 6, COL_FG, bpm); 254 txt_drawf("%d", x + 6, y + 7, COL_FG, bpm);
255 } 255 }
256} 256}
257 257
@@ -568,38 +568,38 @@ draw_parameters_wave(void) {
568 568
569 // Wave text. 569 // Wave text.
570 x -= 2; 570 x -= 2;
571 // txt_drawf_small("%02x%02x%02x%02x", x, y + 20, 4, COL_FG, 571 txt_drawf_small("%02x%02x%02x%02x", x, y + 20, COL_FG,
572 // wave_a[0], wave_a[1], wave_a[2], wave_a[3]); 572 wave_a[0], wave_a[1], wave_a[2], wave_a[3]);
573 // txt_drawf_small("%02x%02x%02x%02x", x + 34, y + 20, 4, COL_FG, 573 txt_drawf_small("%02x%02x%02x%02x", x + 34, y + 20, COL_FG,
574 // wave_a[4], wave_a[5], wave_a[6], wave_a[7]); 574 wave_a[4], wave_a[5], wave_a[6], wave_a[7]);
575 // txt_drawf_small("%02x%02x%02x%02x", x, y + 28, 4, COL_FG, 575 txt_drawf_small("%02x%02x%02x%02x", x, y + 28, COL_FG,
576 // wave_a[8], wave_a[9], wave_a[10], wave_a[11]); 576 wave_a[8], wave_a[9], wave_a[10], wave_a[11]);
577 // txt_drawf_small("%02x%02x%02x%02x", x + 34, y + 28, 4, COL_FG, 577 txt_drawf_small("%02x%02x%02x%02x", x + 34, y + 28, COL_FG,
578 // wave_a[12], wave_a[13], wave_a[14], wave_a[15]); 578 wave_a[12], wave_a[13], wave_a[14], wave_a[15]);
579 579
580 x += 70; 580 x += 70;
581 // txt_drawf_small("%02x%02x%02x%02x", x, y + 20, 4, COL_FG, 581 txt_drawf_small("%02x%02x%02x%02x", x, y + 20, COL_FG,
582 // wave_b[0], wave_b[1], wave_b[2], wave_b[3]); 582 wave_b[0], wave_b[1], wave_b[2], wave_b[3]);
583 // txt_drawf_small("%02x%02x%02x%02x", x + 34, y + 20, 4, COL_FG, 583 txt_drawf_small("%02x%02x%02x%02x", x + 34, y + 20, COL_FG,
584 // wave_b[4], wave_b[5], wave_b[6], wave_b[7]); 584 wave_b[4], wave_b[5], wave_b[6], wave_b[7]);
585 // txt_drawf_small("%02x%02x%02x%02x", x, y + 28, 4, COL_FG, 585 txt_drawf_small("%02x%02x%02x%02x", x, y + 28, COL_FG,
586 // wave_b[8], wave_b[9], wave_b[10], wave_b[11]); 586 wave_b[8], wave_b[9], wave_b[10], wave_b[11]);
587 // txt_drawf_small("%02x%02x%02x%02x", x + 34, y + 28, 4, COL_FG, 587 txt_drawf_small("%02x%02x%02x%02x", x + 34, y + 28, COL_FG,
588 // wave_b[12], wave_b[13], wave_b[14], wave_b[15]); 588 wave_b[12], wave_b[13], wave_b[14], wave_b[15]);
589 } 589 }
590 590
591 // Draw default wave buttons. 591 // Draw default wave buttons.
592 { 592 {
593 // Tile *wave_tiles = ASSETS_DEFAULT_WAVES; 593 u32 *tile = default_wave_buttons;
594 size_t x = PARAMS_START_X; 594 size_t x = PARAMS_START_X;
595 size_t y = PARAMS_START_Y + PARAMS_H - 12; 595 size_t y = PARAMS_START_Y + PARAMS_H - 12;
596 for (size_t i = 0, k = 0; i < 4 * 2; i += 2, k++) { 596 for (size_t i = 0, k = 0; i < 4 * 2; i += 2, k++) {
597 // draw_tile(x + 17 * k, y, wave_tiles + i, COL_FG, true); 597 draw_icn(x + 17 * k , y, &tile[i * 2 + 0], COL_FG, 1, 0);
598 // draw_tile(x + 17 * k + 8, y, wave_tiles + i + 1, COL_FG, true); 598 draw_icn(x + 17 * k + 8, y, &tile[i * 2 + 2], COL_FG, 1, 0);
599 } 599 }
600 for (size_t i = 0, k = 0; i < 4 * 2; i += 2, k++) { 600 for (size_t i = 0, k = 0; i < 4 * 2; i += 2, k++) {
601 // draw_tile(x + 17 * k + 70, y, wave_tiles + i, COL_FG, true); 601 draw_icn(x + 70 + 17 * k , y, &tile[i * 2 + 0], COL_FG, 1, 0);
602 // draw_tile(x + 17 * k + 8 + 70, y, wave_tiles + i + 1, COL_FG, true); 602 draw_icn(x + 70 + 17 * k + 8, y, &tile[i * 2 + 2], COL_FG, 1, 0);
603 } 603 }
604 } 604 }
605 605
@@ -612,17 +612,17 @@ draw_parameters_wave(void) {
612 draw_line(x, y + 5, x, y + 16, COL_FG); 612 draw_line(x, y + 5, x, y + 16, COL_FG);
613 draw_line(x + 30, y + 5, x + 30, y + 17, COL_FG); 613 draw_line(x + 30, y + 5, x + 30, y + 17, COL_FG);
614 draw_line(x, y + 17, x + 30, y + 17, COL_FG); 614 draw_line(x, y + 17, x + 30, y + 17, COL_FG);
615 // txt_drawf_small("mode", x + 6, y, 4, COL_FG); 615 txt_drawf_small("mode", x + 6, y, COL_FG);
616 616
617 switch (pat->ch3.params[trig_selection_loc].wave_mode) { 617 switch (pat->ch3.params[trig_selection_loc].wave_mode) {
618 case 0: { 618 case 0: {
619 txt_drawf("A", x + 12, y + 7, 6, COL_FG); 619 txt_drawf("A", x + 12, y + 7, COL_FG);
620 } break; 620 } break;
621 case 1: { 621 case 1: {
622 txt_drawf("B", x + 12, y + 7, 6, COL_FG); 622 txt_drawf("B", x + 12, y + 7, COL_FG);
623 } break; 623 } break;
624 case 2: { 624 case 2: {
625 txt_drawf("A+B", x + 6, y + 7, 6, COL_FG); 625 txt_drawf("A+B", x + 6, y + 7, COL_FG);
626 } break; 626 } break;
627 } 627 }
628 } 628 }
@@ -636,23 +636,23 @@ draw_parameters_wave(void) {
636 draw_line(x, y + 8, x, y + 19, COL_FG); 636 draw_line(x, y + 8, x, y + 19, COL_FG);
637 draw_line(x + 30, y + 8, x + 30, y + 19, COL_FG); 637 draw_line(x + 30, y + 8, x + 30, y + 19, COL_FG);
638 draw_line(x, y + 20, x + 30, y + 20, COL_FG); 638 draw_line(x, y + 20, x + 30, y + 20, COL_FG);
639 // txt_drawf_small("vol", x + 8, y + 3, 4, COL_FG); 639 txt_drawf_small("vol", x + 8, y + 3, COL_FG);
640 640
641 switch (pat->ch3.params[trig_selection_loc].wave_volume) { 641 switch (pat->ch3.params[trig_selection_loc].wave_volume) {
642 case 0: { 642 case 0: {
643 txt_drawf("0", x + 12, y + 10, 6, COL_FG); 643 txt_drawf("0", x + 12, y + 10, COL_FG);
644 } break; 644 } break;
645 case 1: { 645 case 1: {
646 txt_drawf("25", x + 9, y + 10, 6, COL_FG); 646 txt_drawf("25", x + 9, y + 10, COL_FG);
647 } break; 647 } break;
648 case 2: { 648 case 2: {
649 txt_drawf("50", x + 9, y + 10, 6, COL_FG); 649 txt_drawf("50", x + 9, y + 10, COL_FG);
650 } break; 650 } break;
651 case 3: { 651 case 3: {
652 txt_drawf("75", x + 9, y + 10, 6, COL_FG); 652 txt_drawf("75", x + 9, y + 10, COL_FG);
653 } break; 653 } break;
654 case 4: { 654 case 4: {
655 txt_drawf("100", x + 6, y + 10, 6, COL_FG); 655 txt_drawf("100", x + 6, y + 10, COL_FG);
656 } break; 656 } break;
657 } 657 }
658 } 658 }
@@ -731,20 +731,20 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep) {
731 draw_line(x, y + 8, x, y + 19, COL_FG); 731 draw_line(x, y + 8, x, y + 19, COL_FG);
732 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG); 732 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
733 draw_line(x, y + 20, x + 24, y + 20, COL_FG); 733 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
734 // txt_drawf_small("duty", x + 3, y + 3, 4, COL_FG); 734 txt_drawf_small("duty", x + 3, y + 3, COL_FG);
735 735
736 switch (params->duty_cycle) { 736 switch (params->duty_cycle) {
737 case 0: { 737 case 0: {
738 txt_drawf("12", x + 6, y + 10, 6, COL_FG); 738 txt_drawf("12", x + 6, y + 10, COL_FG);
739 } break; 739 } break;
740 case 1: { 740 case 1: {
741 txt_drawf("25", x + 6, y + 10, 6, COL_FG); 741 txt_drawf("25", x + 6, y + 10, COL_FG);
742 } break; 742 } break;
743 case 2: { 743 case 2: {
744 txt_drawf("50", x + 6, y + 10, 6, COL_FG); 744 txt_drawf("50", x + 6, y + 10, COL_FG);
745 } break; 745 } break;
746 case 3: { 746 case 3: {
747 txt_drawf("75", x + 6, y + 10, 6, COL_FG); 747 txt_drawf("75", x + 6, y + 10, COL_FG);
748 } break; 748 } break;
749 } 749 }
750 } 750 }
@@ -790,56 +790,56 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep) {
790 draw_line(x, y + 8, x, y + 19, COL_FG); 790 draw_line(x, y + 8, x, y + 19, COL_FG);
791 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG); 791 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
792 draw_line(x, y + 20, x + 24, y + 20, COL_FG); 792 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
793 // txt_drawf_small("vol", x + 5, y + 3, 4, COL_FG); 793 txt_drawf_small("vol", x + 5, y + 3, COL_FG);
794 794
795 switch (params->env_volume) { 795 switch (params->env_volume) {
796 case 0: { 796 case 0: {
797 txt_drawf("0", x + 9, y + 10, 6, COL_FG); 797 txt_drawf("0", x + 9, y + 10, COL_FG);
798 } break; 798 } break;
799 case 1: { 799 case 1: {
800 txt_drawf("6", x + 9, y + 10, 6, COL_FG); 800 txt_drawf("6", x + 9, y + 10, COL_FG);
801 } break; 801 } break;
802 case 2: { 802 case 2: {
803 txt_drawf("13", x + 6, y + 10, 6, COL_FG); 803 txt_drawf("13", x + 6, y + 10, COL_FG);
804 } break; 804 } break;
805 case 3: { 805 case 3: {
806 txt_drawf("20", x + 6, y + 10, 6, COL_FG); 806 txt_drawf("20", x + 6, y + 10, COL_FG);
807 } break; 807 } break;
808 case 4: { 808 case 4: {
809 txt_drawf("26", x + 6, y + 10, 6, COL_FG); 809 txt_drawf("26", x + 6, y + 10, COL_FG);
810 } break; 810 } break;
811 case 5: { 811 case 5: {
812 txt_drawf("33", x + 6, y + 10, 6, COL_FG); 812 txt_drawf("33", x + 6, y + 10, COL_FG);
813 } break; 813 } break;
814 case 6: { 814 case 6: {
815 txt_drawf("40", x + 6, y + 10, 6, COL_FG); 815 txt_drawf("40", x + 6, y + 10, COL_FG);
816 } break; 816 } break;
817 case 7: { 817 case 7: {
818 txt_drawf("46", x + 6, y + 10, 6, COL_FG); 818 txt_drawf("46", x + 6, y + 10, COL_FG);
819 } break; 819 } break;
820 case 8: { 820 case 8: {
821 txt_drawf("53", x + 6, y + 10, 6, COL_FG); 821 txt_drawf("53", x + 6, y + 10, COL_FG);
822 } break; 822 } break;
823 case 9: { 823 case 9: {
824 txt_drawf("60", x + 6, y + 10, 6, COL_FG); 824 txt_drawf("60", x + 6, y + 10, COL_FG);
825 } break; 825 } break;
826 case 10: { 826 case 10: {
827 txt_drawf("66", x + 6, y + 10, 6, COL_FG); 827 txt_drawf("66", x + 6, y + 10, COL_FG);
828 } break; 828 } break;
829 case 11: { 829 case 11: {
830 txt_drawf("73", x + 6, y + 10, 6, COL_FG); 830 txt_drawf("73", x + 6, y + 10, COL_FG);
831 } break; 831 } break;
832 case 12: { 832 case 12: {
833 txt_drawf("80", x + 6, y + 10, 6, COL_FG); 833 txt_drawf("80", x + 6, y + 10, COL_FG);
834 } break; 834 } break;
835 case 13: { 835 case 13: {
836 txt_drawf("86", x + 6, y + 10, 6, COL_FG); 836 txt_drawf("86", x + 6, y + 10, COL_FG);
837 } break; 837 } break;
838 case 14: { 838 case 14: {
839 txt_drawf("93", x + 6, y + 10, 6, COL_FG); 839 txt_drawf("93", x + 6, y + 10, COL_FG);
840 } break; 840 } break;
841 case 15: { 841 case 15: {
842 txt_drawf("100", x + 3, y + 10, 6, COL_FG); 842 txt_drawf("100", x + 3, y + 10, COL_FG);
843 } break; 843 } break;
844 } 844 }
845 } 845 }
@@ -853,16 +853,16 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep) {
853 draw_line(x, y + 8, x, y + 19, COL_FG); 853 draw_line(x, y + 8, x, y + 19, COL_FG);
854 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG); 854 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
855 draw_line(x, y + 20, x + 24, y + 20, COL_FG); 855 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
856 // txt_drawf_small("dir", x + 5, y + 3, 4, COL_FG); 856 txt_drawf_small("dir", x + 5, y + 3, COL_FG);
857 857
858 char arr_up[2] = { 0x19, 0 }; 858 char arr_up[2] = { 0x19, 0 };
859 char arr_down[2] = { 0x18, 0 }; 859 char arr_down[2] = { 0x18, 0 };
860 switch (params->env_direction) { 860 switch (params->env_direction) {
861 case 0: { 861 case 0: {
862 txt_drawf(arr_up, x + 9, y + 11, 6, COL_FG); 862 txt_drawf(arr_up, x + 9, y + 11, COL_FG);
863 } break; 863 } break;
864 case 1: { 864 case 1: {
865 txt_drawf(arr_down, x + 9, y + 11, 6, COL_FG); 865 txt_drawf(arr_down, x + 9, y + 11, COL_FG);
866 } break; 866 } break;
867 } 867 }
868 } 868 }
@@ -876,32 +876,32 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep) {
876 draw_line(x, y + 8, x, y + 19, COL_FG); 876 draw_line(x, y + 8, x, y + 19, COL_FG);
877 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG); 877 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
878 draw_line(x, y + 20, x + 24, y + 20, COL_FG); 878 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
879 // txt_drawf_small("time", x + 3, y + 3, 4, COL_FG); 879 txt_drawf_small("time", x + 3, y + 3, COL_FG);
880 880
881 switch (params->env_time) { 881 switch (params->env_time) {
882 case 0: { 882 case 0: {
883 txt_drawf("0", x + 9, y + 10, 6, COL_FG); 883 txt_drawf("0", x + 9, y + 10, COL_FG);
884 } break; 884 } break;
885 case 1: { 885 case 1: {
886 txt_drawf("14", x + 6, y + 10, 6, COL_FG); 886 txt_drawf("14", x + 6, y + 10, COL_FG);
887 } break; 887 } break;
888 case 2: { 888 case 2: {
889 txt_drawf("28", x + 6, y + 10, 6, COL_FG); 889 txt_drawf("28", x + 6, y + 10, COL_FG);
890 } break; 890 } break;
891 case 3: { 891 case 3: {
892 txt_drawf("42", x + 6, y + 10, 6, COL_FG); 892 txt_drawf("42", x + 6, y + 10, COL_FG);
893 } break; 893 } break;
894 case 4: { 894 case 4: {
895 txt_drawf("57", x + 6, y + 10, 6, COL_FG); 895 txt_drawf("57", x + 6, y + 10, COL_FG);
896 } break; 896 } break;
897 case 5: { 897 case 5: {
898 txt_drawf("71", x + 6, y + 10, 6, COL_FG); 898 txt_drawf("71", x + 6, y + 10, COL_FG);
899 } break; 899 } break;
900 case 6: { 900 case 6: {
901 txt_drawf("85", x + 6, y + 10, 6, COL_FG); 901 txt_drawf("85", x + 6, y + 10, COL_FG);
902 } break; 902 } break;
903 case 7: { 903 case 7: {
904 txt_drawf("100", x + 3, y + 10, 6, COL_FG); 904 txt_drawf("100", x + 3, y + 10, COL_FG);
905 } break; 905 } break;
906 } 906 }
907 } 907 }
@@ -916,32 +916,32 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep) {
916 draw_line(x, y + 8, x, y + 19, COL_FG); 916 draw_line(x, y + 8, x, y + 19, COL_FG);
917 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG); 917 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
918 draw_line(x, y + 20, x + 24, y + 20, COL_FG); 918 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
919 // txt_drawf_small("num", x + 5, y + 3, 4, COL_FG); 919 txt_drawf_small("num", x + 5, y + 3, COL_FG);
920 920
921 switch (params->sweep_number) { 921 switch (params->sweep_number) {
922 case 0: { 922 case 0: {
923 txt_drawf("0", x + 9, y + 10, 6, COL_FG); 923 txt_drawf("0", x + 9, y + 10, COL_FG);
924 } break; 924 } break;
925 case 1: { 925 case 1: {
926 txt_drawf("1", x + 9, y + 10, 6, COL_FG); 926 txt_drawf("1", x + 9, y + 10, COL_FG);
927 } break; 927 } break;
928 case 2: { 928 case 2: {
929 txt_drawf("2", x + 9, y + 10, 6, COL_FG); 929 txt_drawf("2", x + 9, y + 10, COL_FG);
930 } break; 930 } break;
931 case 3: { 931 case 3: {
932 txt_drawf("3", x + 9, y + 10, 6, COL_FG); 932 txt_drawf("3", x + 9, y + 10, COL_FG);
933 } break; 933 } break;
934 case 4: { 934 case 4: {
935 txt_drawf("4", x + 9, y + 10, 6, COL_FG); 935 txt_drawf("4", x + 9, y + 10, COL_FG);
936 } break; 936 } break;
937 case 5: { 937 case 5: {
938 txt_drawf("5", x + 9, y + 10, 6, COL_FG); 938 txt_drawf("5", x + 9, y + 10, COL_FG);
939 } break; 939 } break;
940 case 6: { 940 case 6: {
941 txt_drawf("6", x + 9, y + 10, 6, COL_FG); 941 txt_drawf("6", x + 9, y + 10, COL_FG);
942 } break; 942 } break;
943 case 7: { 943 case 7: {
944 txt_drawf("7", x + 9, y + 10, 6, COL_FG); 944 txt_drawf("7", x + 9, y + 10, COL_FG);
945 } break; 945 } break;
946 } 946 }
947 } 947 }
@@ -955,32 +955,32 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep) {
955 draw_line(x, y + 8, x, y + 19, COL_FG); 955 draw_line(x, y + 8, x, y + 19, COL_FG);
956 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG); 956 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
957 draw_line(x, y + 20, x + 24, y + 20, COL_FG); 957 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
958 // txt_drawf_small("time", x + 3, y + 3, 4, COL_FG); 958 txt_drawf_small("time", x + 3, y + 3, COL_FG);
959 959
960 switch (params->sweep_time) { 960 switch (params->sweep_time) {
961 case 0: { 961 case 0: {
962 txt_drawf("0", x + 9, y + 10, 6, COL_FG); 962 txt_drawf("0", x + 9, y + 10, COL_FG);
963 } break; 963 } break;
964 case 1: { 964 case 1: {
965 txt_drawf("1", x + 9, y + 10, 6, COL_FG); 965 txt_drawf("1", x + 9, y + 10, COL_FG);
966 } break; 966 } break;
967 case 2: { 967 case 2: {
968 txt_drawf("2", x + 9, y + 10, 6, COL_FG); 968 txt_drawf("2", x + 9, y + 10, COL_FG);
969 } break; 969 } break;
970 case 3: { 970 case 3: {
971 txt_drawf("3", x + 9, y + 10, 6, COL_FG); 971 txt_drawf("3", x + 9, y + 10, COL_FG);
972 } break; 972 } break;
973 case 4: { 973 case 4: {
974 txt_drawf("4", x + 9, y + 10, 6, COL_FG); 974 txt_drawf("4", x + 9, y + 10, COL_FG);
975 } break; 975 } break;
976 case 5: { 976 case 5: {
977 txt_drawf("5", x + 9, y + 10, 6, COL_FG); 977 txt_drawf("5", x + 9, y + 10, COL_FG);
978 } break; 978 } break;
979 case 6: { 979 case 6: {
980 txt_drawf("6", x + 9, y + 10, 6, COL_FG); 980 txt_drawf("6", x + 9, y + 10, COL_FG);
981 } break; 981 } break;
982 case 7: { 982 case 7: {
983 txt_drawf("7", x + 9, y + 10, 6, COL_FG); 983 txt_drawf("7", x + 9, y + 10, COL_FG);
984 } break; 984 } break;
985 } 985 }
986 } 986 }
@@ -994,16 +994,16 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep) {
994 draw_line(x, y + 8, x, y + 19, COL_FG); 994 draw_line(x, y + 8, x, y + 19, COL_FG);
995 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG); 995 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
996 draw_line(x, y + 20, x + 24, y + 20, COL_FG); 996 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
997 // txt_drawf_small("dir", x + 5, y + 3, 4, COL_FG); 997 txt_drawf_small("dir", x + 5, y + 3, COL_FG);
998 998
999 char arr_up[2] = { 0x19, 0 }; 999 char arr_up[2] = { 0x19, 0 };
1000 char arr_down[2] = { 0x18, 0 }; 1000 char arr_down[2] = { 0x18, 0 };
1001 switch (params->sweep_direction) { 1001 switch (params->sweep_direction) {
1002 case 0: { 1002 case 0: {
1003 txt_drawf(arr_up, x + 9, y + 11, 6, COL_FG); 1003 txt_drawf(arr_up, x + 9, y + 11, COL_FG);
1004 } break; 1004 } break;
1005 case 1: { 1005 case 1: {
1006 txt_drawf(arr_down, x + 9, y + 11, 6, COL_FG); 1006 txt_drawf(arr_down, x + 9, y + 11, COL_FG);
1007 } break; 1007 } break;
1008 } 1008 }
1009 } 1009 }
@@ -1012,10 +1012,10 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep) {
1012 { 1012 {
1013 size_t x = PARAMS_START_X + x_offset; 1013 size_t x = PARAMS_START_X + x_offset;
1014 size_t y = PARAMS_START_Y + PARAMS_H - 45; 1014 size_t y = PARAMS_START_Y + PARAMS_H - 45;
1015 // txt_drawf_small("shape", x + 1, y - 12, 4, COL_FG); 1015 txt_drawf_small("shape", x + 1, y - 12, COL_FG);
1016 // txt_drawf_small("envelope", x + 54, y - 12, 4, COL_FG); 1016 txt_drawf_small("envelope", x + 54, y - 12, COL_FG);
1017 if (sweep) { 1017 if (sweep) {
1018 // txt_drawf_small("sweep", x + 133, y - 12, 4, COL_FG); 1018 txt_drawf_small("sweep", x + 133, y - 12, COL_FG);
1019 } 1019 }
1020 } 1020 }
1021} 1021}
@@ -1037,14 +1037,14 @@ draw_parameters_noise(void) {
1037 draw_line(x, y + 8, x, y + 19, COL_FG); 1037 draw_line(x, y + 8, x, y + 19, COL_FG);
1038 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG); 1038 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
1039 draw_line(x, y + 20, x + 24, y + 20, COL_FG); 1039 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
1040 // txt_drawf_small("mode", x + 3, y + 3, 4, COL_FG); 1040 txt_drawf_small("mode", x + 3, y + 3, COL_FG);
1041 1041
1042 switch (params->bit_mode) { 1042 switch (params->bit_mode) {
1043 case 0: { 1043 case 0: {
1044 txt_drawf("A", x + 9, y + 10, 6, COL_FG); 1044 txt_drawf("A", x + 9, y + 10, COL_FG);
1045 } break; 1045 } break;
1046 case 1: { 1046 case 1: {
1047 txt_drawf("B", x + 9, y + 10, 6, COL_FG); 1047 txt_drawf("B", x + 9, y + 10, COL_FG);
1048 } break; 1048 } break;
1049 } 1049 }
1050 } 1050 }
@@ -1090,56 +1090,56 @@ draw_parameters_noise(void) {
1090 draw_line(x, y + 8, x, y + 19, COL_FG); 1090 draw_line(x, y + 8, x, y + 19, COL_FG);
1091 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG); 1091 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
1092 draw_line(x, y + 20, x + 24, y + 20, COL_FG); 1092 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
1093 // txt_drawf_small("vol", x + 5, y + 3, 4, COL_FG); 1093 txt_drawf_small("vol", x + 5, y + 3, COL_FG);
1094 1094
1095 switch (params->env_volume) { 1095 switch (params->env_volume) {
1096 case 0: { 1096 case 0: {
1097 txt_drawf("0", x + 9, y + 10, 6, COL_FG); 1097 txt_drawf("0", x + 9, y + 10, COL_FG);
1098 } break; 1098 } break;
1099 case 1: { 1099 case 1: {
1100 txt_drawf("6", x + 9, y + 10, 6, COL_FG); 1100 txt_drawf("6", x + 9, y + 10, COL_FG);
1101 } break; 1101 } break;
1102 case 2: { 1102 case 2: {
1103 txt_drawf("13", x + 6, y + 10, 6, COL_FG); 1103 txt_drawf("13", x + 6, y + 10, COL_FG);
1104 } break; 1104 } break;
1105 case 3: { 1105 case 3: {
1106 txt_drawf("20", x + 6, y + 10, 6, COL_FG); 1106 txt_drawf("20", x + 6, y + 10, COL_FG);
1107 } break; 1107 } break;
1108 case 4: { 1108 case 4: {
1109 txt_drawf("26", x + 6, y + 10, 6, COL_FG); 1109 txt_drawf("26", x + 6, y + 10, COL_FG);
1110 } break; 1110 } break;
1111 case 5: { 1111 case 5: {
1112 txt_drawf("33", x + 6, y + 10, 6, COL_FG); 1112 txt_drawf("33", x + 6, y + 10, COL_FG);
1113 } break; 1113 } break;
1114 case 6: { 1114 case 6: {
1115 txt_drawf("40", x + 6, y + 10, 6, COL_FG); 1115 txt_drawf("40", x + 6, y + 10, COL_FG);
1116 } break; 1116 } break;
1117 case 7: { 1117 case 7: {
1118 txt_drawf("46", x + 6, y + 10, 6, COL_FG); 1118 txt_drawf("46", x + 6, y + 10, COL_FG);
1119 } break; 1119 } break;
1120 case 8: { 1120 case 8: {
1121 txt_drawf("53", x + 6, y + 10, 6, COL_FG); 1121 txt_drawf("53", x + 6, y + 10, COL_FG);
1122 } break; 1122 } break;
1123 case 9: { 1123 case 9: {
1124 txt_drawf("60", x + 6, y + 10, 6, COL_FG); 1124 txt_drawf("60", x + 6, y + 10, COL_FG);
1125 } break; 1125 } break;
1126 case 10: { 1126 case 10: {
1127 txt_drawf("66", x + 6, y + 10, 6, COL_FG); 1127 txt_drawf("66", x + 6, y + 10, COL_FG);
1128 } break; 1128 } break;
1129 case 11: { 1129 case 11: {
1130 txt_drawf("73", x + 6, y + 10, 6, COL_FG); 1130 txt_drawf("73", x + 6, y + 10, COL_FG);
1131 } break; 1131 } break;
1132 case 12: { 1132 case 12: {
1133 txt_drawf("80", x + 6, y + 10, 6, COL_FG); 1133 txt_drawf("80", x + 6, y + 10, COL_FG);
1134 } break; 1134 } break;
1135 case 13: { 1135 case 13: {
1136 txt_drawf("86", x + 6, y + 10, 6, COL_FG); 1136 txt_drawf("86", x + 6, y + 10, COL_FG);
1137 } break; 1137 } break;
1138 case 14: { 1138 case 14: {
1139 txt_drawf("93", x + 6, y + 10, 6, COL_FG); 1139 txt_drawf("93", x + 6, y + 10, COL_FG);
1140 } break; 1140 } break;
1141 case 15: { 1141 case 15: {
1142 txt_drawf("100", x + 3, y + 10, 6, COL_FG); 1142 txt_drawf("100", x + 3, y + 10, COL_FG);
1143 } break; 1143 } break;
1144 } 1144 }
1145 } 1145 }
@@ -1153,16 +1153,16 @@ draw_parameters_noise(void) {
1153 draw_line(x, y + 8, x, y + 19, COL_FG); 1153 draw_line(x, y + 8, x, y + 19, COL_FG);
1154 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG); 1154 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
1155 draw_line(x, y + 20, x + 24, y + 20, COL_FG); 1155 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
1156 // txt_drawf_small("dir", x + 5, y + 3, 4, COL_FG); 1156 txt_drawf_small("dir", x + 5, y + 3, COL_FG);
1157 1157
1158 char arr_up[2] = { 0x19, 0 }; 1158 char arr_up[2] = { 0x19, 0 };
1159 char arr_down[2] = { 0x18, 0 }; 1159 char arr_down[2] = { 0x18, 0 };
1160 switch (params->env_direction) { 1160 switch (params->env_direction) {
1161 case 0: { 1161 case 0: {
1162 txt_drawf(arr_up, x + 9, y + 11, 6, COL_FG); 1162 txt_drawf(arr_up, x + 9, y + 11, COL_FG);
1163 } break; 1163 } break;
1164 case 1: { 1164 case 1: {
1165 txt_drawf(arr_down, x + 9, y + 11, 6, COL_FG); 1165 txt_drawf(arr_down, x + 9, y + 11, COL_FG);
1166 } break; 1166 } break;
1167 } 1167 }
1168 } 1168 }
@@ -1176,32 +1176,32 @@ draw_parameters_noise(void) {
1176 draw_line(x, y + 8, x, y + 19, COL_FG); 1176 draw_line(x, y + 8, x, y + 19, COL_FG);
1177 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG); 1177 draw_line(x + 24, y + 8, x + 24, y + 19, COL_FG);
1178 draw_line(x, y + 20, x + 24, y + 20, COL_FG); 1178 draw_line(x, y + 20, x + 24, y + 20, COL_FG);
1179 // txt_drawf_small("time", x + 3, y + 3, 4, COL_FG); 1179 txt_drawf_small("time", x + 3, y + 3, COL_FG);
1180 1180
1181 switch (params->env_time) { 1181 switch (params->env_time) {
1182 case 0: { 1182 case 0: {
1183 txt_drawf("0", x + 9, y + 10, 6, COL_FG); 1183 txt_drawf("0", x + 9, y + 10, COL_FG);
1184 } break; 1184 } break;
1185 case 1: { 1185 case 1: {
1186 txt_drawf("14", x + 6, y + 10, 6, COL_FG); 1186 txt_drawf("14", x + 6, y + 10, COL_FG);
1187 } break; 1187 } break;
1188 case 2: { 1188 case 2: {
1189 txt_drawf("28", x + 6, y + 10, 6, COL_FG); 1189 txt_drawf("28", x + 6, y + 10, COL_FG);
1190 } break; 1190 } break;
1191 case 3: { 1191 case 3: {
1192 txt_drawf("42", x + 6, y + 10, 6, COL_FG); 1192 txt_drawf("42", x + 6, y + 10, COL_FG);
1193 } break; 1193 } break;
1194 case 4: { 1194 case 4: {
1195 txt_drawf("57", x + 6, y + 10, 6, COL_FG); 1195 txt_drawf("57", x + 6, y + 10, COL_FG);
1196 } break; 1196 } break;
1197 case 5: { 1197 case 5: {
1198 txt_drawf("71", x + 6, y + 10, 6, COL_FG); 1198 txt_drawf("71", x + 6, y + 10, COL_FG);
1199 } break; 1199 } break;
1200 case 6: { 1200 case 6: {
1201 txt_drawf("85", x + 6, y + 10, 6, COL_FG); 1201 txt_drawf("85", x + 6, y + 10, COL_FG);
1202 } break; 1202 } break;
1203 case 7: { 1203 case 7: {
1204 txt_drawf("100", x + 3, y + 10, 6, COL_FG); 1204 txt_drawf("100", x + 3, y + 10, COL_FG);
1205 } break; 1205 } break;
1206 } 1206 }
1207 } 1207 }
@@ -1211,7 +1211,7 @@ draw_parameters_noise(void) {
1211 { 1211 {
1212 size_t x = PARAMS_START_X + x_offset; 1212 size_t x = PARAMS_START_X + x_offset;
1213 size_t y = PARAMS_START_Y + PARAMS_H - 45; 1213 size_t y = PARAMS_START_Y + PARAMS_H - 45;
1214 // txt_drawf_small("envelope", x + 54, y - 12, 4, COL_FG); 1214 txt_drawf_small("envelope", x + 54, y - 12, COL_FG);
1215 } 1215 }
1216} 1216}
1217 1217
diff --git a/src/main.c b/src/main.c
index 89d0444..8ee4945 100644
--- a/src/main.c
+++ b/src/main.c
@@ -21,8 +21,7 @@ WITH REGARD TO THIS SOFTWARE.
21 21
22void 22void
23render(void) { 23render(void) {
24 // TODO: Fix small font rendering. 24 // TODO: Make sure we are drawing the proper cursor color.
25 // TODO: Draw remaining sprites.
26 // TODO: Decouple update from rendering. 25 // TODO: Decouple update from rendering.
27 PROF(screen_fill(0), clear_cycles); 26 PROF(screen_fill(0), clear_cycles);
28 PROF(draw_rect(0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, 1), clear_cycles); 27 PROF(draw_rect(0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, 1), clear_cycles);
diff --git a/src/renderer.c b/src/renderer.c
index 07d79d6..65dfd2b 100644
--- a/src/renderer.c
+++ b/src/renderer.c
@@ -260,79 +260,6 @@ draw_filled_rect(size_t x0, size_t y0, size_t x1, size_t y1, u8 clr) {
260 } 260 }
261} 261}
262 262
263IWRAM_CODE
264void
265draw_tile(size_t x, size_t y, Tile *tile, u8 clr, bool merge) {
266 BOUNDCHECK_SCREEN(x, y);
267
268 // Find row position for the given x/y coordinates.
269 size_t tile_x = x / 8;
270 size_t tile_y = y / 8;
271 size_t start_col = x % 8;
272 size_t start_row = y % 8;
273
274 // Get a pointer to the backbuffer and the tile row.
275 size_t pos = start_row + (tile_x + tile_y * 32) * 8;
276 u32 *backbuffer = &BACKBUF[pos];
277 u32 *row = tile;
278
279 // This will blend all colors weirdly if using tiles that contain colors
280 // higher than 1.
281 size_t shift_left = start_col * 4;
282 size_t shift_right = (8 - start_col) * 4;
283 u32 row_mask_left = merge ? 0 : 0xFFFFFFFF << shift_left;
284 u32 row_mask_right = merge ? 0 : 0xFFFFFFFF >> shift_right;
285
286 // Draw the tiles. There are 4 possible cases:
287 // 1. The tile is exactly at the tile boundary.
288 // 2. The tile spans 2 tiles horizontally.
289 // 3. The tile spans 2 tiles vertically.
290 // 4. The tile spans 4 tiles.
291 if (start_col == 0 && start_row == 0) {
292 for (size_t i = 0; i < (8 - start_row); i++, backbuffer++) {
293 BOUNDCHECK_SCREEN(x, y + i);
294 backbuffer[0] = (backbuffer[0] & ~row_mask_left) | row[i] * clr;
295 }
296 dirty_tiles[tile_y] |= 1 << tile_x;
297 } else if (start_row == 0) {
298 for (size_t i = 0; i < 8; i++, backbuffer++) {
299 BOUNDCHECK_SCREEN(x, y + i);
300 backbuffer[0] = (backbuffer[0] & ~row_mask_left) | (row[i] * clr << shift_left);
301 backbuffer[8] = (backbuffer[8] & ~row_mask_right) | (row[i] * clr >> shift_right);
302 }
303 dirty_tiles[tile_y] |= 1 << tile_x;
304 dirty_tiles[tile_y] |= 1 << (tile_x + 1);
305 } else if (start_col == 0) {
306 for (size_t i = 0; i < (8 - start_row); i++, backbuffer++) {
307 BOUNDCHECK_SCREEN(x, y + i);
308 backbuffer[0] = (backbuffer[0] & ~row_mask_left) | row[i] * clr;
309 }
310 backbuffer += 8 * 31;
311 for (size_t i = (8 - start_row); i < 8; i++, backbuffer++) {
312 BOUNDCHECK_SCREEN(x, y + i);
313 backbuffer[0] = (backbuffer[0] & ~row_mask_left) | row[i] * clr;
314 }
315 dirty_tiles[tile_y] |= 1 << tile_x;
316 dirty_tiles[tile_y + 1] |= 1 << tile_x;
317 } else {
318 for (size_t i = 0; i < (8 - start_row); i++, backbuffer++) {
319 BOUNDCHECK_SCREEN(x, y + i);
320 backbuffer[0] = (backbuffer[0] & ~row_mask_left) | (row[i] * clr << shift_left);
321 backbuffer[8] = (backbuffer[8] & ~row_mask_right) | (row[i] * clr >> shift_right);
322 }
323 backbuffer += 8 * 31;
324 for (size_t i = (8 - start_row); i < 8; i++, backbuffer++) {
325 BOUNDCHECK_SCREEN(x, y + i);
326 backbuffer[0] = (backbuffer[0] & ~row_mask_left) | (row[i] * clr << shift_left);
327 backbuffer[8] = (backbuffer[8] & ~row_mask_right) | (row[i] * clr >> shift_right);
328 }
329 dirty_tiles[tile_y] |= 1 << tile_x;
330 dirty_tiles[tile_y] |= 1 << (tile_x + 1);
331 dirty_tiles[tile_y + 1] |= 1 << tile_x;
332 dirty_tiles[tile_y + 1] |= 1 << (tile_x + 1);
333 }
334}
335
336void 263void
337clear_screen(void) { 264clear_screen(void) {
338 dma_fill(FRONTBUF, 0, KB(20), 3); 265 dma_fill(FRONTBUF, 0, KB(20), 3);
diff --git a/src/renderer_m0.c b/src/renderer_m0.c
index 00874ea..bf15f56 100644
--- a/src/renderer_m0.c
+++ b/src/renderer_m0.c
@@ -837,6 +837,25 @@ txt_drawc(char c, size_t x, size_t y, u8 clr) {
837 draw_icn(x, y, tile + 8 * c, clr, 1, 0); 837 draw_icn(x, y, tile + 8 * c, clr, 1, 0);
838} 838}
839 839
840void
841txt_drawc_small(char c, size_t x, size_t y, u8 clr) {
842 u8 *tile = font_icn;
843 c = c < 'a' ? c + 16 * 6 : c + 16 * 4;
844 draw_icn(x, y, tile + 8 * c, clr, 1, 0);
845}
846
847#define txt_drawf_small(msg, x, y, clr, ...) \
848 { \
849 char buf[256] = {0}; \
850 posprintf(buf, msg, ##__VA_ARGS__); \
851 u8 tmp = text_engine.spacing;\
852 txt_spacing(4);\
853 text_engine.drawc = txt_drawc_small;\
854 txt_draws(buf, x, y, clr); \
855 txt_spacing(tmp);\
856 text_engine.drawc = txt_drawc;\
857 }
858
840// 859//
841// Initialization. 860// Initialization.
842// 861//