Krita Source Code Documentation
Loading...
Searching...
No Matches
KoCompositeOp.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2005 Adrian Page <adrian@pagenet.plus.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-or-later
5*/
6
7#include "KoCompositeOp.h"
8
9#include <klocalizedstring.h>
10#include <KoID.h>
11
12#include "KoColorSpace.h"
14
15static QString compositeOpDisplayName(const QString &id)
16{
18}
19
20static QString categoryDisplayName(const QString &id)
21{
23}
24
25#define LAZY_STATIC_CATEGORY_DISPLAY_NAME(n) \
26 []() { \
27 static const QString name = categoryDisplayName(QStringLiteral(n)); \
28 return name; \
29 }()
30
44
46 : opacity(1.0f)
47 , flow(1.0f)
48 , lastOpacity(&opacity)
49{
50}
51
56
62
63void KoCompositeOp::ParameterInfo::setOpacityAndAverage(float _opacity, float _averageOpacity)
64{
65 if (qFuzzyCompare(_opacity, _averageOpacity)) {
66 opacity = _opacity;
67 lastOpacity = &opacity;
68 } else {
69 opacity = _opacity;
70 _lastOpacityData = _averageOpacity;
71 lastOpacity = &_lastOpacityData;
72 }
73}
74
76{
77 dstRowStart = rhs.dstRowStart;
78 dstRowStride = rhs.dstRowStride;
79 srcRowStart = rhs.srcRowStart;
80 srcRowStride = rhs.srcRowStride;
81 maskRowStart = rhs.maskRowStart;
82 maskRowStride = rhs.maskRowStride;
83 rows = rhs.rows;
84 cols = rhs.cols;
85 opacity = rhs.opacity;
86 flow = rhs.flow;
87 _lastOpacityData = rhs._lastOpacityData;
88 channelFlags = rhs.channelFlags;
89
90 lastOpacity = rhs.lastOpacity == &rhs.opacity ?
91 &opacity : &_lastOpacityData;
92}
93
95 const float exponent = 0.1;
96
97 opacity = value;
98
99 if (*lastOpacity < opacity) {
100 lastOpacity = &opacity;
101 } else {
102 _lastOpacityData = exponent * opacity + (1.0 - exponent) * (*lastOpacity);
103 lastOpacity = &_lastOpacityData;
104 }
105}
106
107struct Q_DECL_HIDDEN KoCompositeOp::Private {
109 QString id;
110 QString description;
111 QString category;
114
119
124
125KoCompositeOp::KoCompositeOp(const KoColorSpace * cs, const QString& id, const QString & category)
126 : d(new Private)
127{
128 d->colorSpace = cs;
129 d->id = id;
130 d->description = compositeOpDisplayName(id);
131 d->category = category;
132 if (d->category.isEmpty()) {
133 d->category = categoryMisc();
134 }
135}
136
137void KoCompositeOp::composite(quint8 *dstRowStart, qint32 dstRowStride,
138 const quint8 *srcRowStart, qint32 srcRowStride,
139 const quint8 *maskRowStart, qint32 maskRowStride,
140 qint32 rows, qint32 numColumns,
141 float opacity, const QBitArray& channelFlags) const
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}
157
158
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}
167
168QString KoCompositeOp::category() const
169{
170 return d->category;
171}
172
173QString KoCompositeOp::id() const
174{
175 return d->id;
176}
177
178QString KoCompositeOp::description() const
179{
180 return d->description;
181}
182
184{
185 return d->colorSpace;
186}
float value(const T *src, size_t ch)
#define LAZY_STATIC_CATEGORY_DISPLAY_NAME(n)
static QString categoryDisplayName(const QString &id)
static QString compositeOpDisplayName(const QString &id)
QString getCategoryDisplayName(const QString &categoryID) const
QString getCompositeOpDisplayName(const QString &compositeOpID) const
static const KoCompositeOpRegistry & instance()
static bool qFuzzyCompare(half p1, half p2)
void updateOpacityAndAverage(float value)
void copy(const ParameterInfo &rhs)
ParameterInfo & operator=(const ParameterInfo &rhs)
void setOpacityAndAverage(float _opacity, float _averageOpacity)
static QString categoryLight()
static QString categoryMisc()
static QString categoryQuadratic()
static QString categoryHSI()
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 categoryHSL()
virtual ~KoCompositeOp()
QBitArray defaultChannelFlags
static QString categoryHSV()
static QString categoryHSY()
static QString categoryModulo()
const KoColorSpace * colorSpace
static QString categoryMix()
static QString categoryArithmetic()
Private *const d
static QString categoryDark()
static QString categoryBinary()
static QString categoryNegative()