Krita Source Code Documentation
Loading...
Searching...
No Matches
KoCompositeOpAlphaDarken< Traits, ParamsWrapper > Class Template Reference

#include <KoCompositeOpAlphaDarken.h>

+ Inheritance diagram for KoCompositeOpAlphaDarken< Traits, ParamsWrapper >:

Public Member Functions

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
 
template<bool useMask>
void genericComposite (const KoCompositeOp::ParameterInfo &params) const
 
 KoCompositeOpAlphaDarken (const KoColorSpace *cs)
 
- 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

static channels_type calculateAlpha (const KoCompositeOp::ParameterInfo &params, const ParamsWrapper &paramsWrapper, channels_type flow, channels_type opacity, channels_type srcAlpha, channels_type dstAlpha, channels_type mskAlpha)
 
- 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 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, class ParamsWrapper>
class KoCompositeOpAlphaDarken< Traits, ParamsWrapper >

A template version of the alphadarken composite operation to use in colorspaces

Definition at line 19 of file KoCompositeOpAlphaDarken.h.

Member Typedef Documentation

◆ channels_type

template<class Traits , class ParamsWrapper >
typedef Traits::channels_type KoCompositeOpAlphaDarken< Traits, ParamsWrapper >::channels_type
private

Definition at line 21 of file KoCompositeOpAlphaDarken.h.

Constructor & Destructor Documentation

◆ KoCompositeOpAlphaDarken()

template<class Traits , class ParamsWrapper >
KoCompositeOpAlphaDarken< Traits, ParamsWrapper >::KoCompositeOpAlphaDarken ( const KoColorSpace * cs)
inline

Definition at line 27 of file KoCompositeOpAlphaDarken.h.

27 :
const QString COMPOSITE_ALPHA_DARKEN
static QString categoryMix()

Member Function Documentation

◆ calculateAlpha()

template<class Traits , class ParamsWrapper >
static channels_type KoCompositeOpAlphaDarken< Traits, ParamsWrapper >::calculateAlpha ( const KoCompositeOp::ParameterInfo & params,
const ParamsWrapper & paramsWrapper,
channels_type flow,
channels_type opacity,
channels_type srcAlpha,
channels_type dstAlpha,
channels_type mskAlpha )
inlinestatic

Here we calculate fullFlowAlpha, which should strive either to averageOpacity or opacity (whichever is the greater) or just keep old dstAlpha value, if both opacity values are not bit enough

This cryptic code is basically an optimized version of the following: fullFlowAlpha = averageOpacity * unionShapeOpacity(srcAlpha / averageOpacity, dstAlpha / averageOpacity);

The main idea is: fullFlowAlpha should be as near to averageOpacity as maximum of srcAlpha and dstAlpha and a bit more. So that in consequent applications of the blending operation alpha channel would aim to averageOpacity.

Definition at line 96 of file KoCompositeOpAlphaDarken.h.

103 {
104 using namespace Arithmetic;
105
106 channels_type fullFlowAlpha;
107 channels_type averageOpacity = scale<channels_type>(paramsWrapper.averageOpacity);
108
114 if (averageOpacity > opacity) {
127 channels_type reverseBlend = KoColorSpaceMaths<channels_type>::divide(dstAlpha, averageOpacity);
128 fullFlowAlpha = averageOpacity > dstAlpha ? lerp(srcAlpha, averageOpacity, reverseBlend) : dstAlpha;
129 } else {
130 fullFlowAlpha = opacity > dstAlpha ? lerp(dstAlpha, opacity, mskAlpha) : dstAlpha;
131 }
132
133 if (params.flow == 1.0f) {
134 return fullFlowAlpha;
135 } else {
136 channels_type zeroFlowAlpha = ParamsWrapper::calculateZeroFlowAlphaLegacy(srcAlpha, dstAlpha);
137 return lerp(zeroFlowAlpha, fullFlowAlpha, flow);
138 }
139 }
QPointF lerp(const QPointF &p1, const QPointF &p2, qreal t)
static dst_compositetype divide(_T a, _Tdst b)
Traits::channels_type channels_type

References KoColorSpaceMaths< _T, _Tdst >::divide(), KoCompositeOp::ParameterInfo::flow, and lerp().

◆ composite() [1/3]

template<class Traits , class ParamsWrapper >
void KoCompositeOpAlphaDarken< Traits, ParamsWrapper >::composite ( const KoCompositeOp::ParameterInfo & params) const
inlineoverridevirtual

Same as previous, but uses a parameter structure

Reimplemented from KoCompositeOp.

Definition at line 32 of file KoCompositeOpAlphaDarken.h.

33 {
34 if(params.maskRowStart != 0)
35 genericComposite<true>(params);
36 else
37 genericComposite<false>(params);
38 }

References KoCompositeOp::ParameterInfo::maskRowStart.

◆ composite() [2/3]

template<class Traits , class ParamsWrapper >
void KoCompositeOp::composite ( const ParameterInfo & params) const
virtual

Same as previous, but uses a parameter structure

Reimplemented from KoCompositeOp.

Definition at line 123 of file KoCompositeOp.cpp.

160{
161 composite(params.dstRowStart , params.dstRowStride ,
162 params.srcRowStart , params.srcRowStride ,
163 params.maskRowStart , params.maskRowStride,
164 params.rows , params.cols ,
165 params.opacity, params.channelFlags );
166}
void composite(const KoCompositeOp::ParameterInfo &params) const override

◆ composite() [3/3]

template<class Traits , class ParamsWrapper >
void KoCompositeOp::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
Parameters
dstRowStartpointer to the start of the byte array we will composite the source on
dstRowStridelength of the rows of the block of destination pixels in bytes
srcRowStartpointer to the start of the byte array we will mix with dest
srcRowStridelength of the rows of the block of src in bytes pixels (may be different from the rowstride of the dst pixels, in which case the smaller value is used). If srcRowStride is null it is assumed that the source is a constant color.
maskRowStartstart of the byte mask that determines whether and if so, then how much of src is used for blending
maskRowStridelength of the mask scanlines in bytes
rowsnumber of scanlines to blend
numColumnslength of the row of pixels in pixels
opacitytransparency with which to blend
channelFlagsa bit array that determines which channels should be processed (channels are in the order of the channels in the colorspace)

Definition at line 113 of file KoCompositeOp.cpp.

142{
144 params.dstRowStart = dstRowStart;
145 params.dstRowStride = dstRowStride;
146 params.srcRowStart = srcRowStart;
147 params.srcRowStride = srcRowStride;
148 params.maskRowStart = maskRowStart;
149 params.maskRowStride = maskRowStride;
150 params.rows = rows;
151 params.cols = numColumns;
152 params.opacity = opacity;
153 params.flow = 1.0f;
154 params.channelFlags = channelFlags;
155 composite(params);
156}

◆ genericComposite()

template<class Traits , class ParamsWrapper >
template<bool useMask>
void KoCompositeOpAlphaDarken< Traits, ParamsWrapper >::genericComposite ( const KoCompositeOp::ParameterInfo & params) const
inline

Definition at line 41 of file KoCompositeOpAlphaDarken.h.

42 {
43 using namespace Arithmetic;
44
45 ParamsWrapper paramsWrapper(params);
46
47 qint32 srcInc = (params.srcRowStride == 0) ? 0 : channels_nb;
48 channels_type flow = scale<channels_type>(paramsWrapper.flow);
49 channels_type opacity = scale<channels_type>(paramsWrapper.opacity);
50 quint8* dstRowStart = params.dstRowStart;
51 const quint8* srcRowStart = params.srcRowStart;
52 const quint8* maskRowStart = params.maskRowStart;
53
54 for (qint32 r = params.rows; r > 0; --r) {
55 const channels_type* src = reinterpret_cast<const channels_type*>(srcRowStart);
56 channels_type* dst = reinterpret_cast<channels_type*>(dstRowStart);
57 const quint8* mask = maskRowStart;
58
59 for(qint32 c=params.cols; c>0; --c) {
60 channels_type srcAlpha = (alpha_pos == -1) ? unitValue<channels_type>() : src[alpha_pos];
61 channels_type dstAlpha = (alpha_pos == -1) ? unitValue<channels_type>() : dst[alpha_pos];
62 channels_type mskAlpha = useMask ? mul(scale<channels_type>(*mask), srcAlpha) : srcAlpha;
63
64 srcAlpha = mul(mskAlpha, opacity);
65
66 if(dstAlpha != zeroValue<channels_type>()) {
67 for(qint32 i=0; i <channels_nb; i++) {
68 if(i != alpha_pos)
69 dst[i] = lerp(dst[i], src[i], srcAlpha);
70 }
71 }
72 else {
73 for(qint32 i=0; i <channels_nb; i++) {
74 if(i != alpha_pos)
75 dst[i] = src[i];
76 }
77 }
78
79 if(alpha_pos != -1) {
80 dst[alpha_pos] = calculateAlpha(params, paramsWrapper, flow, opacity, srcAlpha, dstAlpha, mskAlpha);
81 }
82
83 src += srcInc;
84 dst += channels_nb;
85
86 if(useMask)
87 ++mask;
88 }
89
90 srcRowStart += params.srcRowStride;
91 dstRowStart += params.dstRowStride;
92 maskRowStart += params.maskRowStride;
93 }
94 }
static channels_type calculateAlpha(const KoCompositeOp::ParameterInfo &params, const ParamsWrapper &paramsWrapper, channels_type flow, channels_type opacity, channels_type srcAlpha, channels_type dstAlpha, channels_type mskAlpha)
T mul(T a, T b)

References KoCompositeOpAlphaDarken< Traits, ParamsWrapper >::alpha_pos, KoCompositeOpAlphaDarken< Traits, ParamsWrapper >::calculateAlpha(), KoCompositeOpAlphaDarken< Traits, ParamsWrapper >::channels_nb, KoCompositeOp::ParameterInfo::cols, KoCompositeOp::ParameterInfo::dstRowStart, KoCompositeOp::ParameterInfo::dstRowStride, lerp(), KoCompositeOp::ParameterInfo::maskRowStart, KoCompositeOp::ParameterInfo::maskRowStride, KoCompositeOp::ParameterInfo::rows, KoCompositeOp::ParameterInfo::srcRowStart, and KoCompositeOp::ParameterInfo::srcRowStride.

Member Data Documentation

◆ alpha_pos

template<class Traits , class ParamsWrapper >
const qint32 KoCompositeOpAlphaDarken< Traits, ParamsWrapper >::alpha_pos = Traits::alpha_pos
staticprivate

Definition at line 24 of file KoCompositeOpAlphaDarken.h.

◆ channels_nb

template<class Traits , class ParamsWrapper >
const qint32 KoCompositeOpAlphaDarken< Traits, ParamsWrapper >::channels_nb = Traits::channels_nb
staticprivate

Definition at line 23 of file KoCompositeOpAlphaDarken.h.


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