Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_rect_mask_generator.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2004, 2007-2010 Cyrille Berger <cberger@cberger.net>
3 * SPDX-FileCopyrightText: 2018 Ivan Santa Maria <ghevan@gmail.com>
4 * SPDX-FileCopyrightText: 2022 L. E. Segovia <amy@amyspark.me>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9#include <cmath>
10
11
12#include <QDomDocument>
13
16#include "kis_fast_math.h"
19
20
23
24#include <qnumeric.h>
25
26KisRectangleMaskGenerator::KisRectangleMaskGenerator(qreal radius, qreal ratio, qreal fh, qreal fv, int spikes, bool antialiasEdges)
27 : KisMaskGenerator(radius, ratio, fh, fv, spikes, antialiasEdges, RECTANGLE, DefaultId), d(new Private)
28{
29 setScale(1.0, 1.0);
30
31 // store the variable locally to allow vector implementation read it easily
32 d->copyOfAntialiasEdges = antialiasEdges;
34}
35
42
47
51
52void KisRectangleMaskGenerator::setScale(qreal scaleX, qreal scaleY)
53{
55
56 d->xcoeff = 2.0 / effectiveSrcWidth();
57 d->ycoeff = 2.0 / effectiveSrcHeight();
58 d->xfadecoeff = (horizontalFade() == 0) ? 1 : (2.0 / (horizontalFade() * effectiveSrcWidth()));
59 d->yfadecoeff = (verticalFade() == 0) ? 1 : (2.0 / (verticalFade() * effectiveSrcHeight()));
60
61 setSoftness(this->softness());
62}
63
65{
67 qreal safeSoftnessCoeff = qreal(1.0) / qMax(qreal(0.01), softness);
68
69 d->transformedFadeX = d->xfadecoeff * safeSoftnessCoeff;
70 d->transformedFadeY = d->yfadecoeff * safeSoftnessCoeff;
71}
72
74{
75 return !shouldSupersample() && spikes() == 2;
76}
77
79{
80 return d->applicator.data();
81}
82
89
90quint8 KisRectangleMaskGenerator::valueAt(qreal x, qreal y) const
91{
92 if (isEmpty()) return 255;
93 qreal xr = qAbs(x /*- m_xcenter*/);
94 qreal yr = qAbs(y /*- m_ycenter*/);
95 fixRotation(xr, yr);
96
97 xr = qAbs(xr);
98 yr = qAbs(yr);
99
100 qreal nxr = xr * d->xcoeff;
101 qreal nyr = yr * d->ycoeff;
102
103 if (nxr > 1.0 || nyr > 1.0) return 255;
104
105 if (antialiasEdges()) {
106 xr += 1.0;
107 yr += 1.0;
108 }
109
110 qreal fxr = xr * d->transformedFadeX;
111 qreal fyr = yr * d->transformedFadeY;
112
113 qreal fxnorm = nxr * (fxr - 1.0) / (fxr - nxr);
114 qreal fynorm = nyr * (fyr - 1.0) / (fyr - nyr);
115
116 qreal retValue = 0;
117
118 if(fxr > 1.0) {
119 retValue = fxnorm;
120 }
121
122 if (fxnorm < fynorm && fyr > 1.0) {
123 retValue = fynorm;
124 }
125
126 return retValue * 255;
127}
128
auto createOptimizedClass(Args &&...param)
auto createScalarClass(Args &&...params)
virtual void setSoftness(qreal softness)
virtual bool shouldSupersample() const
void fixRotation(qreal &xr, qreal &yr) const
virtual void setScale(qreal scaleX, qreal scaleY)
KisMaskGenerator * clone() const override
void setScale(qreal scaleX, qreal scaleY) override
KisRectangleMaskGenerator(qreal radius, qreal ratio, qreal fh, qreal fv, int spikes, bool antialiasEdges)
quint8 valueAt(qreal x, qreal y) const override
bool shouldVectorize() const override
const QScopedPointer< Private > d
void setSoftness(qreal softness) override
QScopedPointer< KisBrushMaskApplicatorBase > applicator
const KoID DefaultId("default", ki18n("Default"))
generate Krita default mask generator