File indexing completed on 2024-05-26 04:29:11

0001 /*
0002  *  SPDX-FileCopyrightText: 2019 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef KOALPHADARKENPARAMSWRAPPER_H
0008 #define KOALPHADARKENPARAMSWRAPPER_H
0009 
0010 #include <KoCompositeOp.h>
0011 #include "KoColorSpaceMaths.h"
0012 
0013 bool KRITAPIGMENT_EXPORT useCreamyAlphaDarken();
0014 
0015 struct KoAlphaDarkenParamsWrapperHard {
0016     KoAlphaDarkenParamsWrapperHard(const KoCompositeOp::ParameterInfo& params)
0017         : opacity(params.flow * params.opacity),
0018           flow(params.flow),
0019           averageOpacity(params.flow * (*params.lastOpacity))
0020     {
0021     }
0022     float opacity;
0023     float flow;
0024     float averageOpacity;
0025 
0026     template <typename T>
0027     static inline T calculateZeroFlowAlpha(T srcAlpha, T dstAlpha, T normCoeff) {
0028         return srcAlpha + dstAlpha - srcAlpha * dstAlpha * normCoeff;
0029     }
0030 
0031     template <typename T>
0032     static inline T calculateZeroFlowAlpha(T srcAlpha, T dstAlpha) {
0033         return srcAlpha + dstAlpha - srcAlpha * dstAlpha;
0034     }
0035 
0036     template<typename channels_type>
0037     static inline channels_type calculateZeroFlowAlphaLegacy(channels_type srcAlpha, channels_type dstAlpha) {
0038         return Arithmetic::unionShapeOpacity(srcAlpha, dstAlpha);
0039     }
0040 };
0041 
0042 
0043 struct KoAlphaDarkenParamsWrapperCreamy {
0044     KoAlphaDarkenParamsWrapperCreamy(const KoCompositeOp::ParameterInfo& params)
0045         : opacity(params.opacity),
0046           flow(params.flow),
0047           averageOpacity(*params.lastOpacity)
0048     {
0049     }
0050     float opacity;
0051     float flow;
0052     float averageOpacity;
0053 
0054     template <typename T>
0055     static inline T calculateZeroFlowAlpha(T srcAlpha, T dstAlpha, T normCoeff) {
0056         Q_UNUSED(srcAlpha);
0057         Q_UNUSED(normCoeff);
0058 
0059         return dstAlpha;
0060     }
0061 
0062     template <typename T>
0063     static inline T calculateZeroFlowAlpha(T srcAlpha, T dstAlpha) {
0064         Q_UNUSED(srcAlpha);
0065 
0066         return dstAlpha;
0067     }
0068 
0069     template<typename channels_type>
0070     static inline channels_type calculateZeroFlowAlphaLegacy(channels_type srcAlpha, channels_type dstAlpha) {
0071         Q_UNUSED(srcAlpha);
0072         return dstAlpha;
0073     }
0074 };
0075 
0076 #endif // KOALPHADARKENPARAMSWRAPPER_H