Changeset View
Changeset View
Standalone View
Standalone View
libs/pigment/compositeops/KoOptimizedCompositeOpAlphaDarken128.h
Context not available. | |||||
29 | struct OptionalParams { | 29 | struct OptionalParams { | ||
---|---|---|---|---|---|
30 | OptionalParams(const KoCompositeOp::ParameterInfo& params) | 30 | OptionalParams(const KoCompositeOp::ParameterInfo& params) | ||
31 | : flow(params.flow) | 31 | : flow(params.flow) | ||
32 | , averageOpacity(*params.lastOpacity * params.flow) | 32 | , averageOpacity(*params.lastOpacity) | ||
33 | , premultipliedOpacity(params.opacity * params.flow) | | |||
34 | { | 33 | { | ||
35 | } | 34 | } | ||
36 | float flow; | 35 | float flow; | ||
37 | float averageOpacity; | 36 | float averageOpacity; | ||
38 | float premultipliedOpacity; | | |||
39 | }; | 37 | }; | ||
40 | 38 | | |||
41 | struct Pixel { | 39 | struct Pixel { | ||
Context not available. | |||||
83 | msk_norm_alpha = src_alpha; | 81 | msk_norm_alpha = src_alpha; | ||
84 | } | 82 | } | ||
85 | 83 | | |||
86 | // we don't use directly passed value | 84 | Vc::float_v opacity_vec(opacity); | ||
87 | Q_UNUSED(opacity); | | |||
88 | | ||||
89 | // instead we should use opacity premultiplied by flow | | |||
90 | opacity = oparams.premultipliedOpacity; | | |||
91 | Vc::float_v opacity_vec(oparams.premultipliedOpacity); | | |||
92 | 85 | | |||
93 | src_alpha = msk_norm_alpha * opacity_vec; | 86 | src_alpha = msk_norm_alpha * opacity_vec; | ||
94 | 87 | | |||
Context not available. | |||||
142 | dst_alpha = fullFlowAlpha; | 135 | dst_alpha = fullFlowAlpha; | ||
143 | } | 136 | } | ||
144 | else { | 137 | else { | ||
145 | Vc::float_v zeroFlowAlpha = src_alpha + dst_alpha - src_alpha * dst_alpha; | 138 | Vc::float_v zeroFlowAlpha = dst_alpha; | ||
146 | Vc::float_v flow_norm_vec(oparams.flow); | 139 | Vc::float_v flow_norm_vec(oparams.flow); | ||
147 | dst_alpha = (fullFlowAlpha - zeroFlowAlpha) * flow_norm_vec + zeroFlowAlpha; | 140 | dst_alpha = (fullFlowAlpha - zeroFlowAlpha) * flow_norm_vec + zeroFlowAlpha; | ||
148 | } | 141 | } | ||
Context not available. | |||||
166 | const float uint8Rec1 = 1.0 / 255.0; | 159 | const float uint8Rec1 = 1.0 / 255.0; | ||
167 | float mskAlphaNorm = haveMask ? float(*mask) * uint8Rec1 * src[alpha_pos] : src[alpha_pos]; | 160 | float mskAlphaNorm = haveMask ? float(*mask) * uint8Rec1 * src[alpha_pos] : src[alpha_pos]; | ||
168 | 161 | | |||
169 | Q_UNUSED(opacity); | | |||
170 | opacity = oparams.premultipliedOpacity; | | |||
171 | | ||||
172 | float srcAlphaNorm = mskAlphaNorm * opacity; | 162 | float srcAlphaNorm = mskAlphaNorm * opacity; | ||
173 | 163 | | |||
174 | if (dstAlphaNorm != 0) { | 164 | if (dstAlphaNorm != 0) { | ||
Context not available. | |||||
195 | if (flow == 1.0) { | 185 | if (flow == 1.0) { | ||
196 | dst[alpha_pos] = fullFlowAlpha; | 186 | dst[alpha_pos] = fullFlowAlpha; | ||
197 | } else { | 187 | } else { | ||
198 | float zeroFlowAlpha = unionShapeOpacity(srcAlphaNorm, dstAlphaNorm); | 188 | float zeroFlowAlpha = dstAlphaNorm; | ||
199 | dst[alpha_pos] = lerp(zeroFlowAlpha, fullFlowAlpha, flow); | 189 | dst[alpha_pos] = lerp(zeroFlowAlpha, fullFlowAlpha, flow); | ||
200 | } | 190 | } | ||
201 | } | 191 | } | ||
Context not available. |