42 static quint32 countTotal = 0;
43 static quint32 countOne = 0;
44 static quint32 countTwo = 0;
45 static quint32 countThree = 0;
46 static quint32 countFour = 0;
48 if (++countTotal % 250000 == 0) {
49 qInfo() <<
"count" << countOne << countTwo << countThree << countFour << countTotal << opacity;
53 using float_m =
typename float_v::batch_bool_type;
65 dataWrapper.read(src, src_c1, src_c2, src_c3, src_alpha);
68 const float_v opacity_norm_vec(opacity);
69 src_alpha *= opacity_norm_vec;
72 const float_v uint8MaxRec1((
float)1.0 / 255);
74 src_alpha *= mask_vec * uint8MaxRec1;
80 if (xsimd::all(src_alpha == zeroValue)) {
91 dataWrapper.read(dst, dst_c1, dst_c2, dst_c3, dst_alpha);
96 const float_v oneValue(1.0f);
97 if (xsimd::all(dst_alpha == oneValue)) {
98 new_alpha = dst_alpha;
99 src_blend = src_alpha;
100 }
else if (xsimd::all(dst_alpha == zeroValue)) {
101 new_alpha = src_alpha;
102 src_blend = oneValue;
108 new_alpha = dst_alpha + (oneValue - dst_alpha) * src_alpha;
109 const float_m mask = (new_alpha == zeroValue);
110 src_blend = src_alpha / new_alpha;
114 if (!xsimd::all(src_blend == oneValue)) {
119 dst_c1 = src_blend * (src_c1 - dst_c1) + dst_c1;
120 dst_c2 = src_blend * (src_c2 - dst_c2) + dst_c2;
121 dst_c3 = src_blend * (src_c3 - dst_c3) + dst_c3;
123 dataWrapper.write(dst, dst_c1, dst_c2, dst_c3, new_alpha);
128 dataWrapper.write(dst, src_c1, src_c2, src_c3, new_alpha);
140 const qint32 alpha_pos = 3;
142 const auto *s =
reinterpret_cast<const channels_type*
>(src);
143 auto *d =
reinterpret_cast<channels_type*
>(dst);
145 float srcAlpha = s[alpha_pos];
150 const float uint8Rec1 = 1.0f / 255.0f;
151 srcAlpha *= float(*mask) * uint8Rec1;
156 bool display = xx > 45 && xx < 50;
158 qInfo() <<
"O" << s[alpha_pos] << srcAlpha << haveMask << opacity;
162 if (srcAlpha != 0.0f) {
164 float dstAlpha = d[alpha_pos];
166 float srcBlendNorm = 0.0f;
168 if (alphaLocked || dstAlpha == 1.0f) {
169 srcBlendNorm = srcAlpha;
170 }
else if (dstAlpha == 0.0f) {
174 if (!allChannelsFlag) {
175 KoStreamedMathFunctions::clearPixel<sizeof(Pixel)>(dst);
178 dstAlpha += (1.0f - dstAlpha) * srcAlpha;
179 srcBlendNorm = srcAlpha / dstAlpha;
184 qInfo() <<
"params" << srcBlendNorm << allChannelsFlag << alphaLocked << dstAlpha << haveMask;
187 if(allChannelsFlag) {
188 if (srcBlendNorm == 1.0f) {
190 KoStreamedMathFunctions::copyPixel<sizeof(Pixel)>(src, dst);
196 }
else if (srcBlendNorm != 0.0f){
199 qInfo() <<
"calc" << s[0] << d[0] << srcBlendNorm * (s[0] - d[0]) + d[0] << s[0] - d[0] << srcBlendNorm * (s[0] - d[0]) << srcBlendNorm;
210 if (srcBlendNorm == 1.0f) {
211 if(channelFlags.at(0)) d[0] = s[0];
212 if(channelFlags.at(1)) d[1] = s[1];
213 if(channelFlags.at(2)) d[2] = s[2];
214 }
else if (srcBlendNorm != 0.0f) {
227 qInfo() <<
"result" << d[0] << d[1] << d[2] << d[3];