Krita Source Code Documentation
Loading...
Searching...
No Matches
KisScreentoneGenerator Class Reference

#include <KisScreentoneGenerator.h>

+ Inheritance diagram for KisScreentoneGenerator:

Public Member Functions

KisConfigWidgetcreateConfigurationWidget (QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
 
KisFilterConfigurationSP defaultConfiguration (KisResourcesInterfaceSP resourcesInterface) const override
 
KisFilterConfigurationSP factoryConfiguration (KisResourcesInterfaceSP resourcesInterface) const override
 
virtual void generate (KisProcessingInformation dst, const QSize &size, const KisFilterConfigurationSP config) const
 
virtual void generate (KisProcessingInformation dst, const QSize &size, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
 
virtual void generate (KisProcessingInformation dst, const QSize &size, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const=0
 
void generate (KisProcessingInformation dst, const QSize &size, const KisScreentoneGeneratorConfigurationSP config, KoUpdater *progressUpdater) const
 
template<class Sampler >
void generate (KisProcessingInformation dst, const QSize &size, const KisScreentoneGeneratorConfigurationSP config, KoUpdater *progressUpdater, const Sampler &sampler) const
 
template<class Sampler , class PostprocessingFunction >
void generate (KisProcessingInformation dst, const QSize &size, const KisScreentoneGeneratorConfigurationSP config, KoUpdater *progressUpdater, const Sampler &sampler, const PostprocessingFunction &postprocessingFunction) const
 
 KisScreentoneGenerator ()
 
- Public Member Functions inherited from KisGenerator
virtual bool allowsSplittingIntoPatches () const
 
virtual QRect generatedRect (QRect _imageArea, const KisFilterConfigurationSP=0) const
 
 KisGenerator (const KoID &id, const KoID &category, const QString &entry)
 
 ~KisGenerator () override
 
- Public Member Functions inherited from KisBaseProcessor
KisBookmarkedConfigurationManagerbookmarkManager ()
 
const KisBookmarkedConfigurationManagerbookmarkManager () const
 
ColorSpaceIndependence colorSpaceIndependence () const
 
QString id () const
 
 KisBaseProcessor (const KoID &id, const KoID &category, const QString &entry)
 
KoID menuCategory () const
 
QString menuEntry () const
 
QString name () const
 
 Private ()
 
QKeySequence shortcut () const
 
bool showConfigurationWidget ()
 If true, the filter wants to show a configuration widget.
 
bool supportsAdjustmentLayers () const
 This filter can be used in adjustment layers.
 
bool supportsPainting () const
 
bool supportsThreading () const
 
virtual ~KisBaseProcessor ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Static Public Member Functions

static KoID id ()
 

Private Member Functions

bool checkUpdaterInterruptedAndSetPercent (KoUpdater *progressUpdater, int percent) const
 

Additional Inherited Members

- Public Attributes inherited from KisBaseProcessor
KisBookmarkedConfigurationManagerbookmarkManager
 
KoID category
 
ColorSpaceIndependence colorSpaceIndependence
 
QString entry
 
KoID id
 
QKeySequence shortcut
 
bool showConfigurationWidget
 
bool supportsAdjustmentLayers
 
bool supportsPainting
 
bool supportsThreading
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 
- Protected Member Functions inherited from KisGenerator
QString configEntryGroup () const
 
- Protected Member Functions inherited from KisBaseProcessor
void init (const QString &configEntryGroup)
 
void setColorSpaceIndependence (ColorSpaceIndependence v)
 
void setShortcut (const QKeySequence &shortcut)
 
void setShowConfigurationWidget (bool v)
 
void setSupportsAdjustmentLayers (bool v)
 
void setSupportsPainting (bool v)
 
void setSupportsThreading (bool v)
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Detailed Description

Definition at line 19 of file KisScreentoneGenerator.h.

Constructor & Destructor Documentation

◆ KisScreentoneGenerator()

KisScreentoneGenerator::KisScreentoneGenerator ( )

Definition at line 30 of file KisScreentoneGenerator.cpp.

30 : KisGenerator(id(), KoID("basic"), i18n("&Screentone..."))
31{
33}
KisGenerator(const KoID &id, const KoID &category, const QString &entry)
Definition KoID.h:30
void setSupportsPainting(bool v)

References KisBaseProcessor::setSupportsPainting().

Member Function Documentation

◆ checkUpdaterInterruptedAndSetPercent()

bool KisScreentoneGenerator::checkUpdaterInterruptedAndSetPercent ( KoUpdater * progressUpdater,
int percent ) const
private

Definition at line 271 of file KisScreentoneGenerator.cpp.

272{
273 // The updater is null so return false to keep going
274 // with the computations
275 if (!progressUpdater) {
276 return false;
277 }
278
279 if (progressUpdater->interrupted()) {
280 return true;
281 }
282
283 progressUpdater->setProgress(percent);
284 return false;
285}
bool interrupted() const
Definition KoUpdater.cpp:54
void setProgress(int percent)
Definition KoUpdater.cpp:38

References KoUpdater::interrupted(), and KoUpdater::setProgress().

◆ createConfigurationWidget()

KisConfigWidget * KisScreentoneGenerator::createConfigurationWidget ( QWidget * parent,
const KisPaintDeviceSP dev,
bool useForMasks ) const
overridevirtual

Create the configuration widget for this processor.

Parameters
parentthe Qt owner widget of this widget
devthe paintdevice this filter will act on
useForMasksshown if the filer is going to be used in a mask. Some filters may provide limited options when applied as a mask (e.g. Gaussian Blur)

Reimplemented from KisBaseProcessor.

Definition at line 375 of file KisScreentoneGenerator.cpp.

376{
377 Q_UNUSED(dev);
378 return new KisScreentoneConfigWidget(parent);
379}

◆ defaultConfiguration()

KisFilterConfigurationSP KisScreentoneGenerator::defaultConfiguration ( KisResourcesInterfaceSP resourcesInterface) const
overridevirtual

Return the configuration set as the default by the user or the default configuration from the filter writer as returned by factoryConfiguration.

This configuration is used by default for the configuration widget and given to the process function if there is no configuration widget.

Returns
the default configuration of this widget

Reimplemented from KisBaseProcessor.

Definition at line 367 of file KisScreentoneGenerator.cpp.

368{
370 dynamic_cast<KisScreentoneGeneratorConfiguration*>(factoryConfiguration(resourcesInterface).data());
371 config->setDefaults();
372 return config;
373}
KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const override

References KisSharedPtr< T >::data(), and factoryConfiguration().

◆ factoryConfiguration()

KisFilterConfigurationSP KisScreentoneGenerator::factoryConfiguration ( KisResourcesInterfaceSP resourcesInterface) const
overridevirtual
Returns
the default configuration object as defined by whoever wrote the plugin. This object must be filled in with fromXML after that.

Reimplemented from KisBaseProcessor.

Definition at line 362 of file KisScreentoneGenerator.cpp.

363{
364 return new KisScreentoneGeneratorConfiguration(resourcesInterface);
365}

◆ generate() [1/6]

void KisGenerator::generate ( KisProcessingInformation dst,
const QSize & size,
const KisFilterConfigurationSP config ) const
virtual

Provided for convenience when no progress reporting is needed.

Reimplemented from KisGenerator.

Definition at line 59 of file kis_generator.cpp.

33{
34 generate(dst, size, config, 0);
35}
virtual void generate(KisProcessingInformation dst, const QSize &size, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override

◆ generate() [2/6]

void KisScreentoneGenerator::generate ( KisProcessingInformation dst,
const QSize & size,
const KisFilterConfigurationSP config,
KoUpdater * progressUpdater ) const
overridevirtual

Override this function with the implementation of your generator.

Parameters
dstthe destination paint device
sizethe size of the area that is to be filled
configthe parameters of the filter
progressUpdaterthe progress updater

Implements KisGenerator.

Definition at line 35 of file KisScreentoneGenerator.cpp.

39{
41
42 const KisScreentoneGeneratorConfigurationSP generatorConfiguration =
44 const_cast<KisFilterConfiguration*>(config.data())
45 );
46
47 return generate(dst, size, generatorConfiguration, progressUpdater);
48}
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128

References KisSharedPtr< T >::data(), generate(), and KIS_SAFE_ASSERT_RECOVER_RETURN.

◆ generate() [3/6]

virtual void KisGenerator::generate ( KisProcessingInformation dst,
const QSize & size,
const KisFilterConfigurationSP config,
KoUpdater * progressUpdater ) const
virtual

Override this function with the implementation of your generator.

Parameters
dstthe destination paint device
sizethe size of the area that is to be filled
configthe parameters of the filter
progressUpdaterthe progress updater

Implements KisGenerator.

◆ generate() [4/6]

void KisScreentoneGenerator::generate ( KisProcessingInformation dst,
const QSize & size,
const KisScreentoneGeneratorConfigurationSP config,
KoUpdater * progressUpdater ) const

Definition at line 50 of file KisScreentoneGenerator.cpp.

54{
55 const int equalizationMode = config->equalizationMode();
56
57 if (equalizationMode == KisScreentoneEqualizationMode_TemplateBased) {
58 const KisScreentoneGeneratorTemplate &t = config->getTemplate();
59 if (config->alignToPixelGrid()) {
61 generate(dst, size, config, progressUpdater, sampler);
62 } else {
64 generate(dst, size, config, progressUpdater, sampler);
65 }
66 return;
67 }
68
69 const int pattern = config->pattern();
70 const int shape = config->shape();
71 const int interpolation = config->interpolation();
72
73 {
75
76 if (pattern == KisScreentonePatternType_Dots) {
78 if (interpolation == KisScreentoneInterpolationType_Linear) {
79 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
81 generate(dst, size, config, progressUpdater, sampler);
82 } else {
84 generate(dst, size, config, progressUpdater, sampler);
85 }
86 } else if (interpolation == KisScreentoneInterpolationType_Sinusoidal) {
87 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
89 generate(dst, size, config, progressUpdater, sampler);
90 } else {
92 generate(dst, size, config, progressUpdater, sampler);
93 }
94 }
95 } else if (shape == KisScreentoneShapeType_EllipseDotsLegacy) {
96 if (interpolation == KisScreentoneInterpolationType_Linear) {
97 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
99 generate(dst, size, config, progressUpdater, sampler);
100 } else {
102 generate(dst, size, config, progressUpdater, sampler);
103 }
104 } else if (interpolation == KisScreentoneInterpolationType_Sinusoidal) {
105 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
107 generate(dst, size, config, progressUpdater, sampler);
108 } else {
110 generate(dst, size, config, progressUpdater, sampler);
111 }
112 }
113 } else if (shape == KisScreentoneShapeType_EllipseDots) {
114 if (interpolation == KisScreentoneInterpolationType_Linear) {
115 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
117 generate(dst, size, config, progressUpdater, sampler);
118 } else {
120 generate(dst, size, config, progressUpdater, sampler);
121 }
122 } else if (interpolation == KisScreentoneInterpolationType_Sinusoidal) {
123 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
125 generate(dst, size, config, progressUpdater, sampler);
126 } else {
128 generate(dst, size, config, progressUpdater, sampler);
129 }
130 }
131 } else if (shape == KisScreentoneShapeType_DiamondDots) {
132 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
134 generate(dst, size, config, progressUpdater, sampler);
135 } else {
137 generate(dst, size, config, progressUpdater, sampler);
138 }
139 } else if (shape == KisScreentoneShapeType_SquareDots) {
140 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
142 generate(dst, size, config, progressUpdater, sampler);
143 } else {
145 generate(dst, size, config, progressUpdater, sampler);
146 }
147 }
148 } else if (pattern == KisScreentonePatternType_Lines) {
150 if (interpolation == KisScreentoneInterpolationType_Linear) {
151 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
153 generate(dst, size, config, progressUpdater, sampler);
154 } else {
156 generate(dst, size, config, progressUpdater, sampler);
157 }
158 } else if (interpolation == KisScreentoneInterpolationType_Sinusoidal) {
159 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
161 generate(dst, size, config, progressUpdater, sampler);
162 } else {
164 generate(dst, size, config, progressUpdater, sampler);
165 }
166 }
167 } else if (shape == KisScreentoneShapeType_SineWaveLines) {
168 if (interpolation == KisScreentoneInterpolationType_Linear) {
169 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
171 generate(dst, size, config, progressUpdater, sampler);
172 } else {
174 generate(dst, size, config, progressUpdater, sampler);
175 }
176 } else if (interpolation == KisScreentoneInterpolationType_Sinusoidal) {
177 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
179 generate(dst, size, config, progressUpdater, sampler);
180 } else {
182 generate(dst, size, config, progressUpdater, sampler);
183 }
184 }
185 } else if (shape == KisScreentoneShapeType_TriangularWaveLines) {
186 if (interpolation == KisScreentoneInterpolationType_Linear) {
187 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
189 generate(dst, size, config, progressUpdater, sampler);
190 } else {
192 generate(dst, size, config, progressUpdater, sampler);
193 }
194 } else if (interpolation == KisScreentoneInterpolationType_Sinusoidal) {
195 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
197 generate(dst, size, config, progressUpdater, sampler);
198 } else {
200 generate(dst, size, config, progressUpdater, sampler);
201 }
202 }
203 } else if (shape == KisScreentoneShapeType_SawtoothWaveLines) {
204 if (interpolation == KisScreentoneInterpolationType_Linear) {
205 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
207 generate(dst, size, config, progressUpdater, sampler);
208 } else {
210 generate(dst, size, config, progressUpdater, sampler);
211 }
212 } else if (interpolation == KisScreentoneInterpolationType_Sinusoidal) {
213 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
215 generate(dst, size, config, progressUpdater, sampler);
216 } else {
218 generate(dst, size, config, progressUpdater, sampler);
219 }
220 }
221 } else if (shape == KisScreentoneShapeType_CurtainsLines) {
222 if (interpolation == KisScreentoneInterpolationType_Linear) {
223 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
225 generate(dst, size, config, progressUpdater, sampler);
226 } else {
228 generate(dst, size, config, progressUpdater, sampler);
229 }
230 } else if (interpolation == KisScreentoneInterpolationType_Sinusoidal) {
231 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
233 generate(dst, size, config, progressUpdater, sampler);
234 } else {
236 generate(dst, size, config, progressUpdater, sampler);
237 }
238 }
239 }
240 }
241 }
242}
@ KisScreentoneShapeType_TriangularWaveLines
@ KisScreentoneInterpolationType_Sinusoidal
@ KisScreentoneEqualizationMode_TemplateBased
@ KisScreentoneEqualizationMode_FunctionBased

References generate(), KisScreentoneEqualizationMode_FunctionBased, KisScreentoneEqualizationMode_TemplateBased, KisScreentoneInterpolationType_Linear, KisScreentoneInterpolationType_Sinusoidal, KisScreentonePatternType_Dots, KisScreentonePatternType_Lines, KisScreentoneShapeType_CurtainsLines, KisScreentoneShapeType_DiamondDots, KisScreentoneShapeType_EllipseDots, KisScreentoneShapeType_EllipseDotsLegacy, KisScreentoneShapeType_RoundDots, KisScreentoneShapeType_SawtoothWaveLines, KisScreentoneShapeType_SineWaveLines, KisScreentoneShapeType_SquareDots, KisScreentoneShapeType_StraightLines, and KisScreentoneShapeType_TriangularWaveLines.

◆ generate() [5/6]

template<class Sampler >
void KisScreentoneGenerator::generate ( KisProcessingInformation dst,
const QSize & size,
const KisScreentoneGeneratorConfigurationSP config,
KoUpdater * progressUpdater,
const Sampler & sampler ) const

Definition at line 245 of file KisScreentoneGenerator.cpp.

250{
251 const qreal contrast = config->contrast() / 50.0 - 1.0;
252 const bool useThresholdFunction = qFuzzyCompare(contrast, 1.0);
253
254 if (useThresholdFunction) {
255 const qreal brightness = config->brightness() / 100.0;
256 KisScreentoneBrightnessContrastFunctions::Threshold thresholdFunction(1.0 - brightness);
257 generate(dst, size, config, progressUpdater, sampler, thresholdFunction);
258 } else {
259 const qreal brightness = config->brightness() / 50.0 - 1.0;
260 const bool bypassBrightnessContrast = qFuzzyIsNull(brightness) && qFuzzyIsNull(contrast);
261 if (bypassBrightnessContrast) {
263 generate(dst, size, config, progressUpdater, sampler, brightnessContrastFunction);
264 } else {
265 KisScreentoneBrightnessContrastFunctions::BrightnessContrast brightnessContrastFunction(brightness, contrast);
266 generate(dst, size, config, progressUpdater, sampler, brightnessContrastFunction);
267 }
268 }
269}
static bool qFuzzyCompare(half p1, half p2)
static bool qFuzzyIsNull(half h)

References generate(), qFuzzyCompare(), and qFuzzyIsNull().

◆ generate() [6/6]

template<class Sampler , class PostprocessingFunction >
void KisScreentoneGenerator::generate ( KisProcessingInformation dst,
const QSize & size,
const KisScreentoneGeneratorConfigurationSP config,
KoUpdater * progressUpdater,
const Sampler & sampler,
const PostprocessingFunction & postprocessingFunction ) const

Definition at line 288 of file KisScreentoneGenerator.cpp.

294{
295 KisPaintDeviceSP device = dst.paintDevice();
296 Q_ASSERT(!device.isNull());
298
299 checkUpdaterInterruptedAndSetPercent(progressUpdater, 0);
300
301 const QRect bounds = QRect(dst.topLeft(), size);
302 const KoColorSpace *colorSpace;
303 if (device->colorSpace()->profile()->isLinear()) {
304 colorSpace = KoColorSpaceRegistry::instance()->rgb8();
305 } else {
306 colorSpace = device->colorSpace();
307 }
308
309 KoColor foregroundColor = config->foregroundColor();
310 KoColor backgroundColor = config->backgroundColor();
311 qreal foregroundOpacity = config->foregroundOpacity() / 100.0;
312 qreal backgroundOpacity = config->backgroundOpacity() / 100.0;
313 foregroundColor.convertTo(colorSpace);
314 backgroundColor.convertTo(colorSpace);
315 foregroundColor.setOpacity(foregroundOpacity);
316 backgroundColor.setOpacity(backgroundOpacity);
317
318 KisPaintDeviceSP foregroundDevice = new KisPaintDevice(colorSpace, "screentone_generator_foreground_paint_device");
319 KisPaintDeviceSP backgroundDevice;
320 if (device->colorSpace()->profile()->isLinear()) {
321 backgroundDevice = new KisPaintDevice(colorSpace, "screentone_generator_background_paint_device");
322 } else {
323 backgroundDevice = device;
324 }
325
326 foregroundDevice->fill(bounds, foregroundColor);
327 checkUpdaterInterruptedAndSetPercent(progressUpdater, 25);
328 backgroundDevice->fill(bounds, backgroundColor);
329 checkUpdaterInterruptedAndSetPercent(progressUpdater, 50);
330
333
334 if (!config->invert()) {
335 while (it.nextPixel()) {
336 qreal v = std::round(sampler(it.x(), it.y()) * 10000.0) / 10000.0;
337 v = qBound(0.0, postprocessingFunction(v), 1.0);
338 *it.rawData() = 255 - static_cast<quint8>(qRound(v * 255.0));
339 }
340 } else {
341 while (it.nextPixel()) {
342 qreal v = std::round(sampler(it.x(), it.y()) * 10000.0) / 10000.0;
343 v = qBound(0.0, postprocessingFunction(v), 1.0);
344 *it.rawData() = static_cast<quint8>(qRound(v * 255.0));
345 }
346 }
347 checkUpdaterInterruptedAndSetPercent(progressUpdater, 25);
348
349 {
350 KisPainter gc(backgroundDevice, selection);
351 gc.setCompositeOpId(COMPOSITE_OVER);
352 gc.bitBlt(bounds.topLeft(), foregroundDevice, bounds);
353 }
354 if (device->colorSpace()->profile()->isLinear()) {
355 KisPainter gc(device);
356 gc.setCompositeOpId(COMPOSITE_COPY);
357 gc.bitBlt(bounds.topLeft(), backgroundDevice, bounds);
358 }
359 checkUpdaterInterruptedAndSetPercent(progressUpdater, 100);
360}
qreal v
const QString COMPOSITE_OVER
const QString COMPOSITE_COPY
static KisImageResolutionProxySP identity()
void fill(const QRect &rc, const KoColor &color)
const KoColorSpace * colorSpace() const
KisDefaultBoundsBaseSP defaultBounds() const
bool checkUpdaterInterruptedAndSetPercent(KoUpdater *progressUpdater, int percent) const
bool isNull() const
virtual const KoColorProfile * profile() const =0
void convertTo(const KoColorSpace *cs, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
Definition KoColor.cpp:136
void setOpacity(quint8 alpha)
Definition KoColor.cpp:333
#define bounds(x, a, b)
KisPixelSelectionSP pixelSelection
virtual bool isLinear() const =0
static KoColorSpaceRegistry * instance()
const KoColorSpace * rgb8(const QString &profileName=QString())

References KisPainter::bitBlt(), bounds, checkUpdaterInterruptedAndSetPercent(), KisPaintDevice::colorSpace(), COMPOSITE_COPY, COMPOSITE_OVER, KoColor::convertTo(), KisPaintDevice::defaultBounds(), KisPaintDevice::fill(), KisImageResolutionProxy::identity(), KoColorSpaceRegistry::instance(), KoColorProfile::isLinear(), KisSharedPtr< T >::isNull(), KIS_SAFE_ASSERT_RECOVER_RETURN, KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixel(), KisProcessingInformation::paintDevice(), KisSelection::pixelSelection, KoColorSpace::profile(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawData(), KoColorSpaceRegistry::rgb8(), KisPainter::setCompositeOpId(), KoColor::setOpacity(), KisConstProcessingInformation::topLeft, v, KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::x(), and KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::y().

◆ id()

static KoID KisScreentoneGenerator::id ( )
inlinestatic

The documentation for this class was generated from the following files: