Krita Source Code Documentation
Loading...
Searching...
No Matches
KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy > Class Template Reference

#include <KoCompositeOpGeneric.h>

+ Inheritance diagram for KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy >:

Public Member Functions

 KoCompositeOpGenericSCFunctor (const KoColorSpace *cs, const QString &id, const QString &category)
 
- Public Member Functions inherited from KoCompositeOpBase< Traits, KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy > >
void composite (const KoCompositeOp::ParameterInfo &params) const override
 
virtual void composite (const ParameterInfo &params) const
 
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
 
 KoCompositeOpBase (const KoColorSpace *cs, const QString &id, const QString &category)
 
- Public Member Functions inherited from KoCompositeOp
QString category () const
 
const KoColorSpacecolorSpace () const
 
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
 
QString description () const
 
QString id () const
 
 KoCompositeOp (const KoColorSpace *cs, const QString &id, const QString &category=KoCompositeOp::categoryMisc())
 
virtual ~KoCompositeOp ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Static Public Member Functions

template<bool alphaLocked, bool allChannelFlags>
static channels_type composeColorChannels (const channels_type *src, channels_type srcAlpha, channels_type *dst, channels_type dstAlpha, channels_type maskAlpha, channels_type opacity, const QBitArray &channelFlags)
 
- Static Public Member Functions inherited from KoCompositeOp
static QString categoryArithmetic ()
 
static QString categoryBinary ()
 
static QString categoryDark ()
 
static QString categoryHSI ()
 
static QString categoryHSL ()
 
static QString categoryHSV ()
 
static QString categoryHSY ()
 
static QString categoryLight ()
 
static QString categoryMisc ()
 
static QString categoryMix ()
 
static QString categoryModulo ()
 
static QString categoryNegative ()
 
static QString categoryQuadratic ()
 

Private Types

typedef KoCompositeOpBase< Traits, KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy > > base_class
 
typedef Traits::channels_type channels_type
 

Static Private Attributes

static const qint32 alpha_pos = Traits::alpha_pos
 
static const qint32 channels_nb = Traits::channels_nb
 

Additional Inherited Members

- Public Attributes inherited from KoCompositeOp
QString category
 
const KoColorSpacecolorSpace
 
QBitArray defaultChannelFlags
 
QString description
 
QString id
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Detailed Description

template<class Traits, typename CompositeOpFunctor, typename BlendingPolicy>
class KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy >

Generic CompositeOp for separable channel compositing functions

A template to generate a KoCompositeOp class by just specifying a blending/compositing function. This template works with compositing functions for separable channels (means each channel of a pixel can be processed separately)

Definition at line 55 of file KoCompositeOpGeneric.h.

Member Typedef Documentation

◆ base_class

template<class Traits , typename CompositeOpFunctor , typename BlendingPolicy >
typedef KoCompositeOpBase< Traits, KoCompositeOpGenericSCFunctor<Traits,CompositeOpFunctor,BlendingPolicy> > KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy >::base_class
private

Definition at line 57 of file KoCompositeOpGeneric.h.

◆ channels_type

template<class Traits , typename CompositeOpFunctor , typename BlendingPolicy >
typedef Traits::channels_type KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy >::channels_type
private

Definition at line 58 of file KoCompositeOpGeneric.h.

Constructor & Destructor Documentation

◆ KoCompositeOpGenericSCFunctor()

template<class Traits , typename CompositeOpFunctor , typename BlendingPolicy >
KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy >::KoCompositeOpGenericSCFunctor ( const KoColorSpace * cs,
const QString & id,
const QString & category )
inline

Definition at line 64 of file KoCompositeOpGeneric.h.

65 : base_class(cs, id, category) { }
KoCompositeOpBase< Traits, KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy > > base_class

Member Function Documentation

◆ composeColorChannels()

template<class Traits , typename CompositeOpFunctor , typename BlendingPolicy >
template<bool alphaLocked, bool allChannelFlags>
static channels_type KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy >::composeColorChannels ( const channels_type * src,
channels_type srcAlpha,
channels_type * dst,
channels_type dstAlpha,
channels_type maskAlpha,
channels_type opacity,
const QBitArray & channelFlags )
inlinestatic

Definition at line 69 of file KoCompositeOpGeneric.h.

71 {
72 using namespace Arithmetic;
73
74 srcAlpha = mul(srcAlpha, maskAlpha, opacity);
75
76 if (isZeroValueFuzzy(srcAlpha)) {
77 return dstAlpha;
78 }
79
80 if(alphaLocked) {
81 if(!isZeroValueFuzzy(dstAlpha)) {
82 for(qint32 i=0; i <channels_nb; i++) {
83 if(i != alpha_pos && (allChannelFlags || channelFlags.testBit(i))) {
84 const channels_type srcInBlendSpace =
85 CompositeOpFunctor::clampSourceChannelValue(
86 BlendingPolicy::toAdditiveSpace(
87 src[i]));
88 const channels_type dstInBlendSpace =
89 CompositeOpFunctor::clampDestinationChannelValue(
90 BlendingPolicy::toAdditiveSpace(
91 dst[i]));
92
93 dst[i] = BlendingPolicy::fromAdditiveSpace(
94 lerp(dstInBlendSpace,
95 CompositeOpFunctor::composeChannel(srcInBlendSpace, dstInBlendSpace),
96 srcAlpha));
97 }
98 }
99 }
100
101 return dstAlpha;
102 } else if (isZeroValueFuzzy(dstAlpha)) {
103 for(qint32 i=0; i <channels_nb; i++) {
104 if(i != alpha_pos && (allChannelFlags || channelFlags.testBit(i))) {
105 dst[i] = BlendingPolicy::fromAdditiveSpace(
106 CompositeOpFunctor::clampSourceChannelValue(
107 BlendingPolicy::toAdditiveSpace(src[i])));
108 }
109 }
110 return srcAlpha;
111 } else if (isUnitValueFuzzy(dstAlpha)) {
112 for(qint32 i=0; i <channels_nb; i++) {
113 if(i != alpha_pos && (allChannelFlags || channelFlags.testBit(i))) {
114 const channels_type srcInBlendSpace =
115 CompositeOpFunctor::clampSourceChannelValue(
116 BlendingPolicy::toAdditiveSpace(
117 src[i]));
118 const channels_type dstInBlendSpace =
119 CompositeOpFunctor::clampDestinationChannelValue(
120 BlendingPolicy::toAdditiveSpace(
121 dst[i]));
122
123 dst[i] = BlendingPolicy::fromAdditiveSpace(
124 lerp(dstInBlendSpace,
125 CompositeOpFunctor::composeChannel(srcInBlendSpace, dstInBlendSpace),
126 srcAlpha));
127 }
128 }
129 return unitValue<channels_type>();
130 } else if (isUnitValueFuzzy(srcAlpha)) {
131 for(qint32 i=0; i <channels_nb; i++) {
132 if(i != alpha_pos && (allChannelFlags || channelFlags.testBit(i))) {
133 const channels_type srcInBlendSpace =
134 CompositeOpFunctor::clampSourceChannelValue(
135 BlendingPolicy::toAdditiveSpace(
136 src[i]));
137 const channels_type dstInBlendSpace =
138 CompositeOpFunctor::clampDestinationChannelValue(
139 BlendingPolicy::toAdditiveSpace(
140 dst[i]));
141
142 dst[i] = BlendingPolicy::fromAdditiveSpace(
143 lerp(srcInBlendSpace,
144 CompositeOpFunctor::composeChannel(srcInBlendSpace, dstInBlendSpace),
145 dstAlpha));
146 }
147 }
148 return unitValue<channels_type>();
149 } else {
150 channels_type newDstAlpha = unionShapeOpacity(srcAlpha, dstAlpha);
151
152 if (!isZeroValueFuzzy(newDstAlpha)) {
153
154 for(qint32 i=0; i <channels_nb; i++) {
155 if(i != alpha_pos && (allChannelFlags || channelFlags.testBit(i))) {
156 const channels_type srcInBlendSpace =
157 CompositeOpFunctor::clampSourceChannelValue(
158 BlendingPolicy::toAdditiveSpace(
159 src[i]));
160 const channels_type dstInBlendSpace =
161 CompositeOpFunctor::clampDestinationChannelValue(
162 BlendingPolicy::toAdditiveSpace(
163 dst[i]));
164
165 channels_type result =
166 blend(srcInBlendSpace, srcAlpha,
167 dstInBlendSpace, dstAlpha,
168 CompositeOpFunctor::composeChannel(srcInBlendSpace, dstInBlendSpace));
169
170 dst[i] = BlendingPolicy::fromAdditiveSpace(div(result, newDstAlpha));
171 }
172 }
173 }
174
175 return newDstAlpha;
176 }
177 }
QPointF lerp(const QPointF &p1, const QPointF &p2, qreal t)
Traits::channels_type channels_type
T mul(T a, T b)
T blend(T src, T srcAlpha, T dst, T dstAlpha, T cfValue)
T unionShapeOpacity(T a, T b)
KoColorSpaceMathsTraits< T >::compositetype div(T a, T b)

References KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy >::alpha_pos, KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy >::channels_nb, and lerp().

Member Data Documentation

◆ alpha_pos

template<class Traits , typename CompositeOpFunctor , typename BlendingPolicy >
const qint32 KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy >::alpha_pos = Traits::alpha_pos
staticprivate

Definition at line 61 of file KoCompositeOpGeneric.h.

◆ channels_nb

template<class Traits , typename CompositeOpFunctor , typename BlendingPolicy >
const qint32 KoCompositeOpGenericSCFunctor< Traits, CompositeOpFunctor, BlendingPolicy >::channels_nb = Traits::channels_nb
staticprivate

Definition at line 60 of file KoCompositeOpGeneric.h.


The documentation for this class was generated from the following file: