summaryrefslogtreecommitdiff
path: root/firmware/drivers/lcd-16bit-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/lcd-16bit-common.c')
-rw-r--r--firmware/drivers/lcd-16bit-common.c166
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