diff options
Diffstat (limited to 'firmware/drivers')
-rw-r--r-- | firmware/drivers/lcd-16bit-common.c | 166 |
1 files changed, 81 insertions, 85 deletions
diff --git a/firmware/drivers/lcd-16bit-common.c b/firmware/drivers/lcd-16bit-common.c index 86cb5eadd1..39edda5939 100644 --- a/firmware/drivers/lcd-16bit-common.c +++ b/firmware/drivers/lcd-16bit-common.c | |||
@@ -667,13 +667,17 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x, | |||
667 | drmode &= DRMODE_SOLID; /* mask out inversevid */ | 667 | drmode &= DRMODE_SOLID; /* mask out inversevid */ |
668 | } | 668 | } |
669 | 669 | ||
670 | /* Use extra bit to avoid if () in the switch-cases below */ | ||
671 | if ((drmode & DRMODE_BG) && lcd_backdrop) | ||
672 | drmode |= DRMODE_INT_MOD; | ||
673 | |||
670 | /* go through each column and update each pixel */ | 674 | /* go through each column and update each pixel */ |
671 | do | 675 | do |
672 | { | 676 | { |
673 | const unsigned char *src_col = src++; | 677 | const unsigned char *src_col = src++; |
674 | unsigned data = (*src_col ^ dmask) >> src_y; | 678 | unsigned data = (*src_col ^ dmask) >> src_y; |
675 | int fg, bg; | 679 | int fg, bg; |
676 | long bo; | 680 | uintptr_t bo; |
677 | 681 | ||
678 | dst = dst_col; | 682 | dst = dst_col; |
679 | dst_col += COL_INC; | 683 | dst_col += COL_INC; |
@@ -701,33 +705,30 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x, | |||
701 | while (--row); | 705 | while (--row); |
702 | break; | 706 | break; |
703 | 707 | ||
704 | case DRMODE_BG: | 708 | case DRMODE_BG|DRMODE_INT_MOD: |
705 | if (lcd_backdrop) | 709 | bo = lcd_backdrop_offset; |
710 | do | ||
706 | { | 711 | { |
707 | bo = lcd_backdrop_offset; | 712 | if (!(data & 0x01)) |
708 | do | 713 | *dst = *(fb_data *)((long)dst + bo); |
709 | { | ||
710 | if (!(data & 0x01)) | ||
711 | *dst = *(fb_data *)((long)dst + bo); | ||
712 | 714 | ||
713 | dst += ROW_INC; | 715 | dst += ROW_INC; |
714 | UPDATE_SRC; | 716 | UPDATE_SRC; |
715 | } | ||
716 | while (--row); | ||
717 | } | 717 | } |
718 | else | 718 | while (--row); |
719 | break; | ||
720 | |||
721 | case DRMODE_BG: | ||
722 | bg = current_vp->bg_pattern; | ||
723 | do | ||
719 | { | 724 | { |
720 | bg = current_vp->bg_pattern; | 725 | if (!(data & 0x01)) |
721 | do | 726 | *dst = bg; |
722 | { | ||
723 | if (!(data & 0x01)) | ||
724 | *dst = bg; | ||
725 | 727 | ||
726 | dst += ROW_INC; | 728 | dst += ROW_INC; |
727 | UPDATE_SRC; | 729 | UPDATE_SRC; |
728 | } | ||
729 | while (--row); | ||
730 | } | 730 | } |
731 | while (--row); | ||
731 | break; | 732 | break; |
732 | 733 | ||
733 | case DRMODE_FG: | 734 | case DRMODE_FG: |
@@ -743,31 +744,29 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x, | |||
743 | while (--row); | 744 | while (--row); |
744 | break; | 745 | break; |
745 | 746 | ||
746 | case DRMODE_SOLID: | 747 | case DRMODE_SOLID|DRMODE_INT_MOD: |
747 | fg = current_vp->fg_pattern; | 748 | fg = current_vp->fg_pattern; |
748 | if (lcd_backdrop) | 749 | bo = lcd_backdrop_offset; |
750 | do | ||
749 | { | 751 | { |
750 | bo = lcd_backdrop_offset; | 752 | *dst = (data & 0x01) ? fg |
751 | do | 753 | : *(fb_data *)((long)dst + bo); |
752 | { | 754 | dst += ROW_INC; |
753 | *dst = (data & 0x01) ? fg | 755 | UPDATE_SRC; |
754 | : *(fb_data *)((long)dst + bo); | ||
755 | dst += ROW_INC; | ||
756 | UPDATE_SRC; | ||
757 | } | ||
758 | while (--row); | ||
759 | } | 756 | } |
760 | else | 757 | while (--row); |
758 | break; | ||
759 | |||
760 | case DRMODE_SOLID: | ||
761 | fg = current_vp->fg_pattern; | ||
762 | bg = current_vp->bg_pattern; | ||
763 | do | ||
761 | { | 764 | { |
762 | bg = current_vp->bg_pattern; | 765 | *dst = (data & 0x01) ? fg : bg; |
763 | do | 766 | dst += ROW_INC; |
764 | { | 767 | UPDATE_SRC; |
765 | *dst = (data & 0x01) ? fg : bg; | ||
766 | dst += ROW_INC; | ||
767 | UPDATE_SRC; | ||
768 | } | ||
769 | while (--row); | ||
770 | } | 768 | } |
769 | while (--row); | ||
771 | break; | 770 | break; |
772 | } | 771 | } |
773 | } | 772 | } |
@@ -945,6 +944,9 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image, | |||
945 | { | 944 | { |
946 | drmode = DRMODE_BG; | 945 | drmode = DRMODE_BG; |
947 | } | 946 | } |
947 | /* Use extra bit to avoid if () in the switch-cases below */ | ||
948 | if ((drmode & DRMODE_BG) && lcd_backdrop) | ||
949 | drmode |= DRMODE_INT_MOD; | ||
948 | 950 | ||
949 | dst_row = FBADDR(x, y); | 951 | dst_row = FBADDR(x, y); |
950 | 952 | ||
@@ -977,6 +979,8 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image, | |||
977 | /* go through the rows and update each pixel */ | 979 | /* go through the rows and update each pixel */ |
978 | do | 980 | do |
979 | { | 981 | { |
982 | unsigned bg; | ||
983 | uintptr_t bo; | ||
980 | col = width; | 984 | col = width; |
981 | dst = dst_row; | 985 | dst = dst_row; |
982 | dst_row += ROW_INC; | 986 | dst_row += ROW_INC; |
@@ -1025,33 +1029,28 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image, | |||
1025 | } | 1029 | } |
1026 | while (--col); | 1030 | while (--col); |
1027 | break; | 1031 | break; |
1028 | case DRMODE_BG: | 1032 | case DRMODE_BG|DRMODE_INT_MOD: |
1029 | if(lcd_backdrop) | 1033 | bo = lcd_backdrop_offset; |
1034 | do | ||
1030 | { | 1035 | { |
1031 | uintptr_t bo = lcd_backdrop_offset; | 1036 | fb_data c = *(fb_data *)((uintptr_t)dst + bo); |
1032 | do | 1037 | *dst = blend_two_colors(c, *image, data & ALPHA_COLOR_LOOKUP_SIZE ); |
1033 | { | 1038 | dst += COL_INC; |
1034 | *dst = blend_two_colors(*(fb_data *)((uintptr_t)dst + bo), | 1039 | image += STRIDE_MAIN(1, stride_image); |
1035 | *image, data & ALPHA_COLOR_LOOKUP_SIZE ); | 1040 | UPDATE_SRC_ALPHA; |
1036 | |||
1037 | dst += COL_INC; | ||
1038 | image += STRIDE_MAIN(1, stride_image); | ||
1039 | UPDATE_SRC_ALPHA; | ||
1040 | } | ||
1041 | while (--col); | ||
1042 | } | 1041 | } |
1043 | else | 1042 | while (--col); |
1043 | break; | ||
1044 | case DRMODE_BG: | ||
1045 | bg = current_vp->bg_pattern; | ||
1046 | do | ||
1044 | { | 1047 | { |
1045 | do | 1048 | *dst = blend_two_colors(bg, *image, data & ALPHA_COLOR_LOOKUP_SIZE ); |
1046 | { | 1049 | dst += COL_INC; |
1047 | *dst = blend_two_colors(current_vp->bg_pattern, | 1050 | image += STRIDE_MAIN(1, stride_image); |
1048 | *image, data & ALPHA_COLOR_LOOKUP_SIZE ); | 1051 | UPDATE_SRC_ALPHA; |
1049 | dst += COL_INC; | ||
1050 | image += STRIDE_MAIN(1, stride_image); | ||
1051 | UPDATE_SRC_ALPHA; | ||
1052 | } | ||
1053 | while (--col); | ||
1054 | } | 1052 | } |
1053 | while (--col); | ||
1055 | break; | 1054 | break; |
1056 | case DRMODE_FG: | 1055 | case DRMODE_FG: |
1057 | do | 1056 | do |
@@ -1062,30 +1061,27 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image, | |||
1062 | } | 1061 | } |
1063 | while (--col); | 1062 | while (--col); |
1064 | break; | 1063 | break; |
1065 | case DRMODE_SOLID: | 1064 | case DRMODE_SOLID|DRMODE_INT_MOD: |
1066 | if(lcd_backdrop) | 1065 | bo = lcd_backdrop_offset; |
1066 | do | ||
1067 | { | 1067 | { |
1068 | uintptr_t bo = lcd_backdrop_offset; | 1068 | fb_data *c = (fb_data *)((uintptr_t)dst + bo); |
1069 | do | 1069 | *dst = blend_color(*c, data & ALPHA_COLOR_LOOKUP_SIZE ); |
1070 | { | 1070 | dst += COL_INC; |
1071 | *dst = blend_color(*(fb_data *)((uintptr_t)dst + bo), | 1071 | UPDATE_SRC_ALPHA; |
1072 | data & ALPHA_COLOR_LOOKUP_SIZE ); | ||
1073 | dst += COL_INC; | ||
1074 | UPDATE_SRC_ALPHA; | ||
1075 | } | ||
1076 | while (--col); | ||
1077 | } | 1072 | } |
1078 | else | 1073 | while (--col); |
1074 | break; | ||
1075 | case DRMODE_SOLID: | ||
1076 | bg = current_vp->bg_pattern; | ||
1077 | do | ||
1079 | { | 1078 | { |
1080 | do | 1079 | *dst = blend_color(bg, |
1081 | { | 1080 | data & ALPHA_COLOR_LOOKUP_SIZE ); |
1082 | *dst = blend_color(current_vp->bg_pattern, | 1081 | dst += COL_INC; |
1083 | data & ALPHA_COLOR_LOOKUP_SIZE ); | 1082 | UPDATE_SRC_ALPHA; |
1084 | dst += COL_INC; | ||
1085 | UPDATE_SRC_ALPHA; | ||
1086 | } | ||
1087 | while (--col); | ||
1088 | } | 1083 | } |
1084 | while (--col); | ||
1089 | break; | 1085 | break; |
1090 | } | 1086 | } |
1091 | #ifdef ALPHA_BITMAP_READ_WORDS | 1087 | #ifdef ALPHA_BITMAP_READ_WORDS |