@@ -881,17 +881,17 @@ void common_hal_bitmaptools_alphablend(displayio_bitmap_t *dest, displayio_bitma
881
881
blend_source2 = skip_source2_index_none || * sptr2 != (uint8_t )skip_source2_index ;
882
882
if (blend_source1 && blend_source2 ) {
883
883
// Premultiply by the alpha factor
884
- int sca1 = * sptr1 ++ * ifactor1 ;
885
- int sca2 = * sptr2 ++ * ifactor2 ;
884
+ int sda = * sptr1 ++ * ifactor1 ;
885
+ int sca = * sptr2 ++ * ifactor2 ;
886
886
// Blend
887
887
int blend ;
888
888
if (blendmode == BITMAPTOOLS_BLENDMODE_SCREEN ) {
889
- blend = sca2 + sca1 - sca2 * sca1 ;
889
+ blend = sca + sda - ( sca * sda / 65536 ) ;
890
890
} else {
891
- blend = sca2 + sca1 * (256 - ifactor2 );
891
+ blend = sca + sda * (256 - ifactor2 ) / 256 ;
892
892
}
893
893
// Divide by the alpha factor
894
- pixel = (blend / (256 * ifactor1 + 256 * ifactor2 - ifactor1 * ifactor2 ));
894
+ pixel = (blend / (ifactor1 + ifactor2 - ifactor1 * ifactor2 / 256 ));
895
895
} else if (blend_source1 ) {
896
896
// Apply iFactor1 to source1 only
897
897
pixel = * sptr1 ++ * ifactor1 / 256 ;
@@ -934,31 +934,31 @@ void common_hal_bitmaptools_alphablend(displayio_bitmap_t *dest, displayio_bitma
934
934
int ifactor_blend = ifactor1 + ifactor2 - ifactor1 * ifactor2 / 256 ;
935
935
936
936
// Premultiply the colors by the alpha factor
937
- int red_sca1 = ((spix1 & r_mask ) >> 11 ) * ifactor1 ;
938
- int green_sca1 = ((spix1 & g_mask ) >> 5 ) * ifactor1 ;
939
- int blue_sca1 = (spix1 & b_mask ) * ifactor1 ;
937
+ int red_dca = ((spix1 & r_mask ) >> 8 ) * ifactor1 ;
938
+ int grn_dca = ((spix1 & g_mask ) >> 3 ) * ifactor1 ;
939
+ int blu_dca = (( spix1 & b_mask ) << 3 ) * ifactor1 ;
940
940
941
- int red_sca2 = ((spix2 & r_mask ) >> 11 ) * ifactor2 ;
942
- int green_sca2 = ((spix2 & g_mask ) >> 5 ) * ifactor2 ;
943
- int blue_sca2 = (spix2 & b_mask ) * ifactor2 ;
941
+ int red_sca = ((spix2 & r_mask ) >> 8 ) * ifactor2 ;
942
+ int grn_sca = ((spix2 & g_mask ) >> 3 ) * ifactor2 ;
943
+ int blu_sca = (( spix2 & b_mask ) << 3 ) * ifactor2 ;
944
944
945
- int red_blend , green_blend , blue_blend ;
945
+ int red_blend , grn_blend , blu_blend ;
946
946
if (blendmode == BITMAPTOOLS_BLENDMODE_SCREEN ) {
947
- // Perform a screen blend
948
- red_blend = red_sca2 + red_sca1 - (red_sca2 * red_sca1 );
949
- green_blend = green_sca2 + green_sca1 - (green_sca2 * green_sca1 );
950
- blue_blend = blue_sca2 + blue_sca1 - (blue_sca2 * blue_sca1 );
947
+ // Perform a screen blend Sca + Dca - Sca × Dca
948
+ red_blend = red_sca + red_dca - (red_sca * red_dca / 65536 );
949
+ grn_blend = grn_sca + grn_dca - (grn_sca * grn_dca / 65536 );
950
+ blu_blend = blu_sca + blu_dca - (blu_sca * blu_dca / 65536 );
951
951
} else {
952
- // Perform a normal blend
953
- red_blend = red_sca2 + red_sca1 * (256 - ifactor2 ) / 256 ;
954
- green_blend = green_sca2 + green_sca1 * (256 - ifactor2 ) / 256 ;
955
- blue_blend = blue_sca2 + blue_sca1 * (256 - ifactor2 ) / 256 ;
952
+ // Perform a normal (src-over) blend
953
+ red_blend = red_sca + red_dca * (256 - ifactor2 ) / 256 ;
954
+ grn_blend = grn_sca + grn_dca * (256 - ifactor2 ) / 256 ;
955
+ blu_blend = blu_sca + blu_dca * (256 - ifactor2 ) / 256 ;
956
956
}
957
957
958
958
// Divide by the alpha factor
959
- int r = ((red_blend / ifactor_blend ) << 11 ) & r_mask ;
960
- int g = ((green_blend / ifactor_blend ) << 5 ) & g_mask ;
961
- int b = (blue_blend / ifactor_blend ) & b_mask ;
959
+ int r = ((red_blend / ifactor_blend ) << 8 ) & r_mask ;
960
+ int g = ((grn_blend / ifactor_blend ) << 3 ) & g_mask ;
961
+ int b = (( blu_blend / ifactor_blend ) >> 3 ) & b_mask ;
962
962
963
963
// Clamp to the appropriate range
964
964
r = MIN (r_mask , MAX (0 , r )) & r_mask ;
0 commit comments