@@ -881,17 +881,17 @@ void common_hal_bitmaptools_alphablend(displayio_bitmap_t *dest, displayio_bitma
881881 blend_source2 = skip_source2_index_none || * sptr2 != (uint8_t )skip_source2_index ;
882882 if (blend_source1 && blend_source2 ) {
883883 // 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 ;
886886 // Blend
887887 int blend ;
888888 if (blendmode == BITMAPTOOLS_BLENDMODE_SCREEN ) {
889- blend = sca2 + sca1 - sca2 * sca1 ;
889+ blend = sca + sda - ( sca * sda / 65536 ) ;
890890 } else {
891- blend = sca2 + sca1 * (256 - ifactor2 );
891+ blend = sca + sda * (256 - ifactor2 ) / 256 ;
892892 }
893893 // Divide by the alpha factor
894- pixel = (blend / (256 * ifactor1 + 256 * ifactor2 - ifactor1 * ifactor2 ));
894+ pixel = (blend / (ifactor1 + ifactor2 - ifactor1 * ifactor2 / 256 ));
895895 } else if (blend_source1 ) {
896896 // Apply iFactor1 to source1 only
897897 pixel = * sptr1 ++ * ifactor1 / 256 ;
@@ -934,31 +934,31 @@ void common_hal_bitmaptools_alphablend(displayio_bitmap_t *dest, displayio_bitma
934934 int ifactor_blend = ifactor1 + ifactor2 - ifactor1 * ifactor2 / 256 ;
935935
936936 // 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 ;
940940
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 ;
944944
945- int red_blend , green_blend , blue_blend ;
945+ int red_blend , grn_blend , blu_blend ;
946946 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 );
951951 } 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 ;
956956 }
957957
958958 // 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 ;
962962
963963 // Clamp to the appropriate range
964964 r = MIN (r_mask , MAX (0 , r )) & r_mask ;
0 commit comments