Krita Source Code Documentation
Loading...
Searching...
No Matches
KoCompositeOpAlphaBase< _CSTraits, _compositeOp, _alphaLocked > Class Template Reference

#include <KoCompositeOpAlphaBase.h>

+ Inheritance diagram for KoCompositeOpAlphaBase< _CSTraits, _compositeOp, _alphaLocked >:

Public Member Functions

template<bool alphaLocked, bool allChannelFlags>
void composite (const KoCompositeOp::ParameterInfo &params) const
 
template<bool alphaLocked>
void composite (const KoCompositeOp::ParameterInfo &params) const
 
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
 
 KoCompositeOpAlphaBase (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)
 

Private Types

typedef _CSTraits::channels_type channels_type
 

Additional Inherited Members

- 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 ()
 
- 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 _CSTraits, class _compositeOp, bool _alphaLocked>
class KoCompositeOpAlphaBase< _CSTraits, _compositeOp, _alphaLocked >

A template base class for all composite op that compose color channels values for colorspaces that have an alpha channel.

Parameters
_compositeOpthis class should define a function with the following signature: inline static void composeColorChannels

Definition at line 30 of file KoCompositeOpAlphaBase.h.

Member Typedef Documentation

◆ channels_type

template<class _CSTraits , class _compositeOp , bool _alphaLocked>
typedef _CSTraits::channels_type KoCompositeOpAlphaBase< _CSTraits, _compositeOp, _alphaLocked >::channels_type
private

Definition at line 32 of file KoCompositeOpAlphaBase.h.

Constructor & Destructor Documentation

◆ KoCompositeOpAlphaBase()

template<class _CSTraits , class _compositeOp , bool _alphaLocked>
KoCompositeOpAlphaBase< _CSTraits, _compositeOp, _alphaLocked >::KoCompositeOpAlphaBase ( const KoColorSpace * cs,
const QString & id,
const QString & category )
inline

Definition at line 35 of file KoCompositeOpAlphaBase.h.

36 : KoCompositeOp(cs, id, category) {
37 }

Member Function Documentation

◆ composite() [1/5]

template<class _CSTraits , class _compositeOp , bool _alphaLocked>
template<bool alphaLocked, bool allChannelFlags>
void KoCompositeOpAlphaBase< _CSTraits, _compositeOp, _alphaLocked >::composite ( const KoCompositeOp::ParameterInfo & params) const
inlinevirtual

Same as previous, but uses a parameter structure

Reimplemented from KoCompositeOp.

Definition at line 43 of file KoCompositeOpAlphaBase.h.

43 {
44 qint32 srcInc = (params.srcRowStride == 0) ? 0 : _CSTraits::channels_nb;
45
47
48 const quint8 *srcRowStart = params.srcRowStart;
49 quint8 *dstRowStart = params.dstRowStart;
50 const quint8 *maskRowStart = params.maskRowStart;
51
52 qint32 rows = params.rows;
53
54 while (rows > 0) {
55 const channels_type *srcN = reinterpret_cast<const channels_type *>(srcRowStart);
56 channels_type *dstN = reinterpret_cast<channels_type *>(dstRowStart);
57 const quint8 *mask = maskRowStart;
58
59 qint32 columns = params.cols;
60
61 while (columns > 0) {
62
63 channels_type srcAlpha = _CSTraits::alpha_pos == -1 ? NATIVE_OPACITY_OPAQUE : _compositeOp::selectAlpha(srcN[_CSTraits::alpha_pos], dstN[_CSTraits::alpha_pos]);
64
65 // apply the alphamask
66 if (mask != 0) {
67 srcAlpha = KoColorSpaceMaths<quint8, channels_type>::multiply(*mask, srcAlpha, opacity);
68 mask++;
69 } else if (opacity != NATIVE_OPACITY_OPAQUE) {
70 srcAlpha = KoColorSpaceMaths<channels_type>::multiply(srcAlpha, opacity);
71 }
72
73 if (srcAlpha != NATIVE_OPACITY_TRANSPARENT) {
74
75
76 channels_type dstAlpha = _CSTraits::alpha_pos == -1 ? NATIVE_OPACITY_OPAQUE : dstN[_CSTraits::alpha_pos];
77
78 channels_type srcBlend;
79
80 if (alphaLocked || _alphaLocked ||
81 dstAlpha == NATIVE_OPACITY_OPAQUE) {
82
83 srcBlend = srcAlpha;
84
85 } else if (dstAlpha == NATIVE_OPACITY_TRANSPARENT) {
86 if (!allChannelFlags) {
87 for (int i = 0; i < (int)_CSTraits::channels_nb; i++) {
88 if (i != _CSTraits::alpha_pos) {
89 dstN[i] = NATIVE_ZERO_VALUE;
90 }
91 }
92 }
93
94 if (!alphaLocked && !_alphaLocked) {
95 dstN[_CSTraits::alpha_pos] = srcAlpha;
96 }
97 srcBlend = NATIVE_OPACITY_OPAQUE;
98
99 } else {
100 channels_type newAlpha = dstAlpha + KoColorSpaceMaths<channels_type>::multiply(NATIVE_OPACITY_OPAQUE - dstAlpha, srcAlpha);
101 if (!alphaLocked && !_alphaLocked) { // No need to check for _CSTraits::alpha_pos == -1 since it is contained in alphaLocked
102 dstN[_CSTraits::alpha_pos] = newAlpha;
103 }
104 // newAlpha cannot be zero, because srcAlpha!=zero and dstAlpha!=unit here
105 srcBlend = KoColorSpaceMaths<channels_type>::divide(srcAlpha, newAlpha);
106 }
107 _compositeOp::composeColorChannels(srcBlend, srcN, dstN, allChannelFlags, params.channelFlags);
108
109 }
110 columns--;
111 srcN += srcInc;
112 dstN += _CSTraits::channels_nb;
113 }
114
115 rows--;
116 srcRowStart += params.srcRowStride;
117 dstRowStart += params.dstRowStride;
118 if (maskRowStart) {
119 maskRowStart += params.maskRowStride;
120 }
121 }
122 }
#define NATIVE_OPACITY_TRANSPARENT
#define NATIVE_ZERO_VALUE
#define NATIVE_OPACITY_OPAQUE
static _Tdst multiply(_T a, _Tdst b)
static _Tdst scaleToA(_T a)
static dst_compositetype divide(_T a, _Tdst b)
_CSTraits::channels_type channels_type

References KoCompositeOp::ParameterInfo::channelFlags, KoCompositeOp::ParameterInfo::cols, KoColorSpaceMaths< _T, _Tdst >::divide(), KoCompositeOp::ParameterInfo::dstRowStart, KoCompositeOp::ParameterInfo::dstRowStride, KoCompositeOp::ParameterInfo::maskRowStart, KoCompositeOp::ParameterInfo::maskRowStride, KoColorSpaceMaths< _T, _Tdst >::multiply(), NATIVE_OPACITY_OPAQUE, NATIVE_OPACITY_TRANSPARENT, NATIVE_ZERO_VALUE, KoCompositeOp::ParameterInfo::opacity, KoCompositeOp::ParameterInfo::rows, KoColorSpaceMaths< _T, _Tdst >::scaleToA(), KoCompositeOp::ParameterInfo::srcRowStart, and KoCompositeOp::ParameterInfo::srcRowStride.

◆ composite() [2/5]

template<class _CSTraits , class _compositeOp , bool _alphaLocked>
template<bool alphaLocked>
void KoCompositeOpAlphaBase< _CSTraits, _compositeOp, _alphaLocked >::composite ( const KoCompositeOp::ParameterInfo & params) const
inlinevirtual

Same as previous, but uses a parameter structure

Reimplemented from KoCompositeOp.

Definition at line 124 of file KoCompositeOpAlphaBase.h.

125 {
126 bool allChannelFlags = params.channelFlags.isEmpty();
127 if(allChannelFlags)
128 {
129 composite<alphaLocked, true>(params);
130 } else {
131 composite<alphaLocked, false>(params);
132 }
133 }

References KoCompositeOp::ParameterInfo::channelFlags.

◆ composite() [3/5]

template<class _CSTraits , class _compositeOp , bool _alphaLocked>
void KoCompositeOpAlphaBase< _CSTraits, _compositeOp, _alphaLocked >::composite ( const KoCompositeOp::ParameterInfo & params) const
inlineoverridevirtual

Same as previous, but uses a parameter structure

Reimplemented from KoCompositeOp.

Definition at line 135 of file KoCompositeOpAlphaBase.h.

136 {
137 bool alphaLocked = false;
138 if (!params.channelFlags.isEmpty()) {
139 if (_CSTraits::alpha_pos == -1 || !params.channelFlags.testBit(_CSTraits::alpha_pos)) {
140 alphaLocked = true;
141 }
142 }
143 if(alphaLocked)
144 {
145 composite<true>(params);
146 } else {
147 composite<false>(params);
148 }
149 }

References KoCompositeOp::ParameterInfo::channelFlags.

◆ composite() [4/5]

template<class _CSTraits , class _compositeOp , bool _alphaLocked>
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

◆ composite() [5/5]

template<class _CSTraits , class _compositeOp , bool _alphaLocked>
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}

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