Krita Source Code Documentation
Loading...
Searching...
No Matches
generator.cpp
Go to the documentation of this file.
1/*
2 * This file is part of Krita
3 *
4 * SPDX-FileCopyrightText: 2020 L. E. Segovia <amy@amyspark.me>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
10#include <KoUpdater.h>
11#include <cstring>
14#include <kis_debug.h>
15#include <kis_fill_painter.h>
16#include <kis_global.h>
17#include <kis_image.h>
18#include <kis_layer.h>
19#include <kis_paint_device.h>
21#include <kis_selection.h>
22#include <kis_types.h>
23#include <klocalizedstring.h>
24#include <kpluginfactory.h>
25
27#include "generator.h"
28#include "kis_wdg_seexpr.h"
29#include "ui_wdgseexpr.h"
30
31/****************************************************************************/
32/* KisSeExprGeneratorConfiguration */
33/****************************************************************************/
34
36{
37public:
42
47
48 virtual KisFilterConfigurationSP clone() const override
49 {
50 return new KisSeExprGeneratorConfiguration(*this);
51 }
52
53 QString script() const
54 {
55 return this->getString("script", QStringLiteral(BASE_SCRIPT));
56 }
57};
58
59K_PLUGIN_FACTORY_WITH_JSON(KritaSeExprGeneratorFactory, "generator.json", registerPlugin<KritaSeExprGenerator>();)
60
61KritaSeExprGenerator::KritaSeExprGenerator(QObject *parent, const QVariantList &)
62 : QObject(parent)
63{
65}
66
70
77
79{
80 return new KisSeExprGeneratorConfiguration(id().id(), 1, resourcesInterface);
81}
82
84{
85 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
86
87 QVariant v;
88 v.setValue(QString("Disney_noisecolor2"));
89 config->setProperty("pattern", v);
90 return config;
91}
92
94{
95 Q_UNUSED(dev);
96 return new KisWdgSeExpr(parent);
97}
98
99void KisSeExprGenerator::generate(KisProcessingInformation dstInfo, const QSize &size, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const
100{
101 KisPaintDeviceSP device = dstInfo.paintDevice();
102
103 Q_ASSERT(!device.isNull());
104 Q_ASSERT(config);
105
106 if (config) {
107 QString script = config->getString("script");
108
109 QRect bounds = QRect(dstInfo.topLeft(), size);
110 QRect whole_image_bounds = device->defaultBounds()->bounds();
111
112 SeExprExpressionContext expression(script);
113
114 expression.m_vars["u"] = new SeExprVariable();
115 expression.m_vars["v"] = new SeExprVariable();
116 expression.m_vars["w"] = new SeExprVariable(whole_image_bounds.width());
117 expression.m_vars["h"] = new SeExprVariable(whole_image_bounds.height());
118
119 if (expression.isValid() && expression.returnType().isFP(3)) {
120 double pixel_stride_x = 1. / whole_image_bounds.width();
121 double pixel_stride_y = 1. / whole_image_bounds.height();
122 double &u = expression.m_vars["u"]->m_value;
123 double &v = expression.m_vars["v"]->m_value;
124
125 // SeExpr already outputs floating-point RGB
126 const KoColorSpace *dst = device->colorSpace();
129
130 KisSequentialIteratorProgress it(device, bounds, progressUpdater);
131
132 while (it.nextPixel()) {
133 u = pixel_stride_x * (it.x() + .5);
134 v = pixel_stride_y * (it.y() + .5);
135
136 const double *value = expression.evalFP();
137
138 KoColor c(src);
139 reinterpret_cast<float *>(c.data())[0] = value[0];
140 reinterpret_cast<float *>(c.data())[1] = value[1];
141 reinterpret_cast<float *>(c.data())[2] = value[2];
143
144 conv->transform(c.data(), it.rawData(), 1);
145 }
146 delete conv;
147 }
148 }
149}
150
151#include "generator.moc"
float value(const T *src, size_t ch)
qreal v
qreal u
const KoID Float32BitsColorDepthID("F32", ki18n("32-bit float/channel"))
const KoID RGBAColorModelID("RGBA", ki18n("RGB/Alpha"))
const qreal OPACITY_OPAQUE_F
@ FULLY_INDEPENDENT
virtual QRect bounds() const =0
static KisGeneratorRegistry * instance()
void add(KisGeneratorSP item)
const KoColorSpace * colorSpace() const
KisDefaultBoundsBaseSP defaultBounds() const
KisSeExprGeneratorConfiguration(const KisSeExprGeneratorConfiguration &rhs)
Definition generator.cpp:43
KisSeExprGeneratorConfiguration(const QString &name, qint32 version, KisResourcesInterfaceSP resourcesInterface)
Definition generator.cpp:38
virtual KisFilterConfigurationSP clone() const override
Definition generator.cpp:48
KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
Definition generator.cpp:83
void generate(KisProcessingInformation dst, const QSize &size, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
Definition generator.cpp:99
KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
Definition generator.cpp:78
KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
Definition generator.cpp:93
ALWAYS_INLINE quint8 * rawData()
ALWAYS_INLINE int x() const
ALWAYS_INLINE int y() const
bool isNull() const
void setOpacity(quint8 alpha)
Definition KoColor.cpp:333
quint8 * data()
Definition KoColor.h:144
Definition KoID.h:30
QString id() const
Definition KoID.cpp:63
~KritaSeExprGenerator() override
Definition generator.cpp:67
KritaSeExprGenerator(QObject *parent, const QVariantList &)
Definition generator.cpp:61
#define BASE_SCRIPT
Definition generator.h:17
K_PLUGIN_FACTORY_WITH_JSON(KritaASCCDLFactory, "kritaasccdl.json", registerPlugin< KritaASCCDL >();) KritaASCCDL
#define bounds(x, a, b)
void setSupportsPainting(bool v)
void setColorSpaceIndependence(ColorSpaceIndependence v)
KisResourcesInterfaceSP resourcesInterface
QString getString(const QString &name, const QString &def=QString()) const
const KoColorSpace * colorSpace(const QString &colorModelId, const QString &colorDepthId, const KoColorProfile *profile)
KoColorConversionTransformation * createColorConverter(const KoColorSpace *srcColorSpace, const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
static KoColorSpaceRegistry * instance()
const KoColorProfile * p709SRGBProfile() const