47 const QBitArray& channelFlags ) {
50 if (isUnitValueFuzzy(dstAlpha))
return dstAlpha;
51 channels_type appliedAlpha = mul(maskAlpha, srcAlpha, opacity);
53 if (isZeroValueFuzzy(appliedAlpha))
return dstAlpha;
56 float dA = scale<float>(dstAlpha);
58 float w = 1.0/(1.0+exp(-40.0*(dA - scale<float>(appliedAlpha))));
59 float a = dA*w + scale<float>(appliedAlpha)*(1.0-w);
71 float fakeOpacity = 1.0f - (1.0f - a)/(1.0f - dA + 1e-16f);
72 newDstAlpha=scale<channels_type>(a);
74 if (isZeroValueFuzzy(newDstAlpha)) {
76 }
else if (!isZeroValueFuzzy(dstAlpha)) {
77 for (qint8 channel = 0; channel <
channels_nb; ++channel)
78 if(channel !=
alpha_pos && (allChannelFlags || channelFlags.testBit(channel)))
82 channels_type dstMult = mul(BlendingPolicy::toAdditiveSpace(dst[channel]), dstAlpha);
83 channels_type srcMult = mul(BlendingPolicy::toAdditiveSpace(src[channel]), unitValue<channels_type>());
84 channels_type blendedValue =
lerp(dstMult, srcMult, scale<channels_type>(fakeOpacity));
94 for (qint8 channel = 0; channel <
channels_nb; ++channel)
95 if(channel !=
alpha_pos && (allChannelFlags || channelFlags.testBit(channel)))
96 dst[channel] = src[channel];