8#ifndef KOCOMPOSITEOPALPHADARKEN_H_
9#define KOCOMPOSITEOPALPHADARKEN_H_
18template<
class Traits,
class ParamsWrapper>
35 genericComposite<true>(params);
37 genericComposite<false>(params);
40 template<
bool useMask>
45 ParamsWrapper paramsWrapper(params);
48 channels_type flow = scale<channels_type>(paramsWrapper.flow);
49 channels_type opacity = scale<channels_type>(paramsWrapper.opacity);
54 for (qint32 r = params.
rows; r > 0; --r) {
57 const quint8* mask = maskRowStart;
59 for(qint32 c=params.
cols; c>0; --c) {
62 channels_type mskAlpha = useMask ? mul(scale<channels_type>(*mask), srcAlpha) : srcAlpha;
64 srcAlpha = mul(mskAlpha, opacity);
66 if(dstAlpha != zeroValue<channels_type>()) {
69 dst[i] =
lerp(dst[i], src[i], srcAlpha);
97 const ParamsWrapper ¶msWrapper,
107 channels_type averageOpacity = scale<channels_type>(paramsWrapper.averageOpacity);
114 if (averageOpacity > opacity) {
128 fullFlowAlpha = averageOpacity > dstAlpha ?
lerp(srcAlpha, averageOpacity, reverseBlend) : dstAlpha;
130 fullFlowAlpha = opacity > dstAlpha ?
lerp(dstAlpha, opacity, mskAlpha) : dstAlpha;
133 if (params.
flow == 1.0f) {
134 return fullFlowAlpha;
136 channels_type zeroFlowAlpha = ParamsWrapper::calculateZeroFlowAlphaLegacy(srcAlpha, dstAlpha);
137 return lerp(zeroFlowAlpha, fullFlowAlpha, flow);
const QString COMPOSITE_ALPHA_DARKEN
QPointF lerp(const QPointF &p1, const QPointF &p2, qreal t)
static dst_compositetype divide(_T a, _Tdst b)
void genericComposite(const KoCompositeOp::ParameterInfo ¶ms) const
void composite(const KoCompositeOp::ParameterInfo ¶ms) const override
Traits::channels_type channels_type
static const qint32 channels_nb
static channels_type calculateAlpha(const KoCompositeOp::ParameterInfo ¶ms, const ParamsWrapper ¶msWrapper, channels_type flow, channels_type opacity, channels_type srcAlpha, channels_type dstAlpha, channels_type mskAlpha)
KoCompositeOpAlphaDarken(const KoColorSpace *cs)
static const qint32 alpha_pos
const quint8 * srcRowStart
const quint8 * maskRowStart
void composite(quint8 *dstRowStart, qint32 dstRowStride, const quint8 *srcRowStart, qint32 srcRowStride, const quint8 *maskRowStart, qint32 maskRowStride, qint32 rows, qint32 numColumns, float opacity, const QBitArray &channelFlags=QBitArray()) const
static QString categoryMix()