Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_cached_gradient_shape_strategy.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <QRect>
11
12#include <cmath>
13
14#include <functional>
15
16#include "kis_algebra_2d.h"
17#include "kis_debug.h"
18
19
20using namespace KisBSplines;
21
23{
24 QRect rc;
25 qreal xStep;
26 qreal yStep;
27 QScopedPointer<KisGradientShapeStrategy> baseStrategy;
28 QScopedPointer<KisBSpline2D> spline;
29};
30
32 qreal xStep,
33 qreal yStep,
34 KisGradientShapeStrategy *baseStrategy)
36 m_d(new Private())
37{
38 using namespace std::placeholders; // for _1, _2, _3...
39
40 KIS_ASSERT_RECOVER_NOOP(rc.width() >= 3 && rc.height() >= 3);
41
42 m_d->rc = rc;
43 m_d->xStep = xStep;
44 m_d->yStep = yStep;
45 m_d->baseStrategy.reset(baseStrategy);
46
47 qreal xStart = rc.x();
48 qreal yStart = rc.y();
49 qreal xEnd = rc.x() + rc.width();
50 qreal yEnd = rc.y() + rc.height();
51
52 int numSamplesX = std::ceil(qreal(rc.width()) / xStep);
53 int numSamplesY = std::ceil(qreal(rc.height()) / yStep);
54
55 if (numSamplesX < 2 || numSamplesY < 2) {
57 warnKrita << "############";
58 warnKrita << "WARNING: KisCachedGradientShapeStrategy numSamplesX/Y is too small!" << ppVar(numSamplesX) << ppVar(numSamplesY);
59 warnKrita << "WARNING:" << ppVar(rc) << ppVar(xStep) << ppVar(yStep);
60 warnKrita << "WARNING:" << ppVar(numSamplesX) << ppVar(numSamplesY);
61
62 numSamplesX = qMax(numSamplesX, 2);
63 numSamplesY = qMax(numSamplesY, 2);
64
65 warnKrita << "WARNING: adjusting:" << ppVar(numSamplesX) << ppVar(numSamplesY);
66 warnKrita << "############";
68 }
69
70 m_d->spline.reset(new KisBSpline2D(xStart, xEnd, numSamplesX, Natural,
71 yStart, yEnd, numSamplesY, Natural));
72
73
74 std::function<qreal(qreal, qreal)> valueOp =
75 std::bind(&KisGradientShapeStrategy::valueAt, m_d->baseStrategy.data(), _1, _2);
76
77 m_d->spline->initializeSpline(valueOp);
78
79}
80
84
85double KisCachedGradientShapeStrategy::valueAt(double x, double y) const
86{
87 QPointF pt = KisAlgebra2D::ensureInRect(QPointF(x, y), m_d->rc);
88 return m_d->spline->value(pt.x(), pt.y());
89}
virtual double valueAt(double x, double y) const =0
#define KIS_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:97
#define warnKrita
Definition kis_debug.h:87
#define ppVar(var)
Definition kis_debug.h:155
QPoint ensureInRect(QPoint pt, const QRect &bounds)
double valueAt(double x, double y) const override
KisCachedGradientShapeStrategy(const QRect &rc, qreal xStep, qreal yStep, KisGradientShapeStrategy *baseStrategy)
QScopedPointer< KisGradientShapeStrategy > baseStrategy