Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_circle_mask_generator.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2004, 2007-2009 Cyrille Berger <cberger@cberger.net>
3 * SPDX-FileCopyrightText: 2010 Lukáš Tvrdý <lukast.dev@gmail.com>
4 * SPDX-FileCopyrightText: 2012 Sven Langkamp <sven.langkamp@gmail.com>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9#include <cmath>
10
11#include <QDomDocument>
12
13#include "kis_fast_math.h"
19
20
21KisCircleMaskGenerator::KisCircleMaskGenerator(qreal diameter, qreal ratio, qreal fh, qreal fv, int spikes, bool antialiasEdges)
22 : KisMaskGenerator(diameter, ratio, fh, fv, spikes, antialiasEdges, CIRCLE, DefaultId),
23 d(new Private)
24{
25 setScale(1.0, 1.0);
26
27 // store the variable locally to allow vector implementation read it easily
28 d->copyOfAntialiasEdges = antialiasEdges;
29
31}
32
39
44
45void KisCircleMaskGenerator::setScale(qreal scaleX, qreal scaleY)
46{
48
49 d->xcoef = 2.0 / effectiveSrcWidth();
50 d->ycoef = 2.0 / effectiveSrcHeight();
51 d->xfadecoef = qFuzzyCompare(horizontalFade(), 0) ? 1 : (2.0 / (horizontalFade() * effectiveSrcWidth()));
52 d->yfadecoef = qFuzzyCompare(verticalFade() , 0) ? 1 : (2.0 / (verticalFade() * effectiveSrcHeight()));
53 d->transformedFadeX = d->xfadecoef * d->safeSoftnessCoeff;
54 d->transformedFadeY = d->yfadecoef * d->safeSoftnessCoeff;
55}
56
60
62{
63 return !shouldSupersample() && spikes() == 2;
64}
65
67{
68 return d->applicator.data();
69}
70
71quint8 KisCircleMaskGenerator::valueAt(qreal x, qreal y) const
72{
73 if (isEmpty()) return 255;
74 qreal xr = (x /*- m_xcenter*/);
75 qreal yr = qAbs(y /*- m_ycenter*/);
76 fixRotation(xr, yr);
77
78 qreal n = norme(xr * d->xcoef, yr * d->ycoef);
79 if (n > 1.0) return 255;
80
81 // we add +1.0 to ensure correct antialiasing on the border
82 if (antialiasEdges()) {
83 xr = qAbs(xr) + 1.0;
84 yr = qAbs(yr) + 1.0;
85 }
86
87 qreal nf = norme(xr * d->transformedFadeX,
88 yr * d->transformedFadeY);
89
90 if (nf < 1.0) return 0;
91 return 255 * n * (nf - 1.0) / (nf - n);
92}
93
95{
97 d->safeSoftnessCoeff = qreal(1.0) / qMax(qreal(0.01), softness);
98
99 d->transformedFadeX = d->xfadecoef * d->safeSoftnessCoeff;
100 d->transformedFadeY = d->yfadecoef * d->safeSoftnessCoeff;
101}
102
auto createOptimizedClass(Args &&...param)
auto createScalarClass(Args &&...params)
void setSoftness(qreal softness) override
quint8 valueAt(qreal x, qreal y) const override
const QScopedPointer< Private > d
KisMaskGenerator * clone() const override
KisCircleMaskGenerator(qreal radius, qreal ratio, qreal fh, qreal fv, int spikes, bool antialiasEdges)
void setScale(qreal scaleX, qreal scaleY) override
qreal norme(qreal a, qreal b) const
QScopedPointer< KisBrushMaskApplicatorBase > applicator
bool shouldVectorize() const override
virtual void setSoftness(qreal softness)
virtual bool shouldSupersample() const
void fixRotation(qreal &xr, qreal &yr) const
virtual void setScale(qreal scaleX, qreal scaleY)
static bool qFuzzyCompare(half p1, half p2)
const KoID DefaultId("default", ki18n("Default"))
generate Krita default mask generator