Skip to content

Commit 78d1ebb

Browse files
committed
Fix calculations
1 parent ea39d70 commit 78d1ebb

File tree

1 file changed

+23
-23
lines changed

1 file changed

+23
-23
lines changed

shared-module/bitmaptools/__init__.c

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)