Changeset View
Changeset View
Standalone View
Standalone View
libs/pigment/compositeops/KoOptimizedCompositeOpAlphaDarken32.h
Context not available. | |||||
31 | struct OptionalParams { | 31 | struct OptionalParams { | ||
---|---|---|---|---|---|
32 | OptionalParams(const KoCompositeOp::ParameterInfo& params) | 32 | OptionalParams(const KoCompositeOp::ParameterInfo& params) | ||
33 | : flow(params.flow), | 33 | : flow(params.flow), | ||
34 | averageOpacity(*params.lastOpacity * params.flow), | 34 | averageOpacity(*params.lastOpacity) | ||
35 | premultipliedOpacity(params.opacity * params.flow) | | |||
36 | { | 35 | { | ||
37 | } | 36 | } | ||
38 | float flow; | 37 | float flow; | ||
39 | float averageOpacity; | 38 | float averageOpacity; | ||
40 | float premultipliedOpacity; | | |||
41 | }; | 39 | }; | ||
42 | 40 | | |||
43 | /** | 41 | /** | ||
Context not available. | |||||
59 | Vc::float_v src_alpha; | 57 | Vc::float_v src_alpha; | ||
60 | Vc::float_v dst_alpha; | 58 | Vc::float_v dst_alpha; | ||
61 | 59 | | |||
62 | // we don't use directly passed value | 60 | Vc::float_v opacity_vec(255.0 * opacity); | ||
63 | Q_UNUSED(opacity); | | |||
64 | | ||||
65 | // instead we should use opacity premultiplied by flow | | |||
66 | opacity = oparams.premultipliedOpacity; | | |||
67 | Vc::float_v opacity_vec(255.0 * oparams.premultipliedOpacity); | | |||
68 | 61 | | |||
69 | Vc::float_v average_opacity_vec(255.0 * oparams.averageOpacity); | 62 | Vc::float_v average_opacity_vec(255.0 * oparams.averageOpacity); | ||
70 | Vc::float_v flow_norm_vec(oparams.flow); | 63 | Vc::float_v flow_norm_vec(oparams.flow); | ||
Context not available. | |||||
170 | if (oparams.flow == 1.0) { | 163 | if (oparams.flow == 1.0) { | ||
171 | dst_alpha = fullFlowAlpha; | 164 | dst_alpha = fullFlowAlpha; | ||
172 | } else { | 165 | } else { | ||
173 | Vc::float_v zeroFlowAlpha = src_alpha + dst_alpha - | 166 | Vc::float_v zeroFlowAlpha = dst_alpha; | ||
174 | dst_blend * dst_alpha; | | |||
175 | dst_alpha = (fullFlowAlpha - zeroFlowAlpha) * flow_norm_vec + zeroFlowAlpha; | 167 | dst_alpha = (fullFlowAlpha - zeroFlowAlpha) * flow_norm_vec + zeroFlowAlpha; | ||
176 | } | 168 | } | ||
177 | 169 | | |||
Context not available. | |||||
196 | float srcAlphaNorm; | 188 | float srcAlphaNorm; | ||
197 | float mskAlphaNorm; | 189 | float mskAlphaNorm; | ||
198 | 190 | | |||
199 | Q_UNUSED(opacity); | | |||
200 | opacity = oparams.premultipliedOpacity; | | |||
201 | | ||||
202 | if (haveMask) { | 191 | if (haveMask) { | ||
203 | mskAlphaNorm = float(*mask) * uint8Rec2 * src[alpha_pos]; | 192 | mskAlphaNorm = float(*mask) * uint8Rec2 * src[alpha_pos]; | ||
204 | srcAlphaNorm = mskAlphaNorm * opacity; | 193 | srcAlphaNorm = mskAlphaNorm * opacity; | ||
Context not available. | |||||
234 | if (flow == 1.0) { | 223 | if (flow == 1.0) { | ||
235 | dstAlpha = fullFlowAlpha * uint8Max; | 224 | dstAlpha = fullFlowAlpha * uint8Max; | ||
236 | } else { | 225 | } else { | ||
237 | float zeroFlowAlpha = unionShapeOpacity(srcAlphaNorm, dstAlphaNorm); | 226 | float zeroFlowAlpha = dstAlphaNorm; | ||
238 | dstAlpha = lerp(zeroFlowAlpha, fullFlowAlpha, flow) * uint8Max; | 227 | dstAlpha = lerp(zeroFlowAlpha, fullFlowAlpha, flow) * uint8Max; | ||
239 | } | 228 | } | ||
240 | 229 | | |||
Context not available. |