Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_layer_style_filter_environment.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <QBitArray>
10
11#include "kis_layer.h"
12#include "kis_ls_utils.h"
13
14#include "kis_selection.h"
15#include "kis_pixel_selection.h"
16#include "kis_painter.h"
17#include "kis_image.h"
18
19#include "krita_utils.h"
20
21#include <boost/random/mersenne_twister.hpp>
23#include "kis_iterator_ng.h"
26
27
38
39
41KisLayerStyleFilterEnvironment::Private::
42generateRandomSelection(const QRect &rc)
43{
44 KisPixelSelectionSP selection = new KisPixelSelection();
45 KisSequentialIterator dstIt(selection, rc);
46
47 boost::mt11213b uniformSource;
48
49 if (uniformSource.max() >= 0x00FFFFFF) {
50 while (dstIt.nextPixel()) {
51 int randValue = uniformSource();
52 *dstIt.rawData() = (quint8) randValue;
53
54 if (!dstIt.nextPixel()) break;
55 randValue >>= 8;
56 *dstIt.rawData() = (quint8) randValue;
57
58 if (!dstIt.nextPixel()) break;
59 randValue >>= 8;
60 *dstIt.rawData() = (quint8) randValue;
61 }
62
63 } else {
64 while (dstIt.nextPixel()) {
65 *dstIt.rawData() = (quint8) uniformSource();
66 }
67 }
68
69 return selection;
70}
71
73 : m_d(new Private)
74{
75 Q_ASSERT(sourceLayer);
76 m_d->sourceLayer = sourceLayer;
77}
78
82
84{
85 return m_d->sourceLayer ? m_d->sourceLayer->projection()->exactBounds() : QRect();
86}
87
89{
90 return m_d->sourceLayer ?
91 m_d->sourceLayer->original()->defaultBounds()->bounds() : QRect();
92}
93
95{
96 return m_d->sourceLayer ?
97 m_d->sourceLayer->original()->defaultBounds()->currentLevelOfDetail() : 0;
98}
99
101 quint8 opacity,
102 const QBitArray &channelFlags) const
103{
104 Q_ASSERT(m_d->sourceLayer);
105 gc->setOpacityF(KritaUtils::mergeOpacityF(qreal(opacity) / OPACITY_OPAQUE_U8, qreal(m_d->sourceLayer->opacity()) / OPACITY_OPAQUE_U8));
106 gc->setChannelFlags(KritaUtils::mergeChannelFlags(channelFlags, m_d->sourceLayer->channelFlags()));
107
108}
109
111{
112 KisPixelSelectionSP selection = m_d->cachedRandomSelection;
113
114 QRect existingRect;
115
116 if (selection) {
117 existingRect = selection->selectedExactRect();
118 }
119
120 if (!existingRect.contains(requestedRect)) {
121 m_d->cachedRandomSelection =
122 Private::generateRandomSelection(requestedRect | existingRect);
123 }
124
125 return m_d->cachedRandomSelection;
126}
127
129{
130 if (!pattern->hasAlpha()) return pattern;
131
132 auto source = m_d->cachedFlattenedPattern.source<KoPattern>(ResourceType::Patterns);
133
134 KoPatternSP resultPattern = source.bestMatch("", pattern->filename(), pattern->name());
135 if (resultPattern) return resultPattern;
136
137 KoPatternSP flattenedPattern = pattern->cloneWithoutAlpha();
138
139 m_d->cachedFlattenedPattern.addResource(flattenedPattern);
140
141 return flattenedPattern;
142}
143
145{
146 return &m_d->globalCachedSelection;
147}
148
150{
151 return &m_d->globalCachedPaintDevice;
152}
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
const quint8 OPACITY_OPAQUE_U8
a KisResourcesInterface-like resources storage for preloaded resources
void setOpacityF(qreal opacity)
void setChannelFlags(QBitArray channelFlags)
Write API docs here.
Definition KoPattern.h:21
qreal mergeOpacityF(qreal opacity, qreal parentOpacity)
QBitArray mergeChannelFlags(const QBitArray &childFlags, const QBitArray &parentFlags)
const QString Patterns
void setupFinalPainter(KisPainter *gc, quint8 opacity, const QBitArray &channelFlags) const
static KisPixelSelectionSP generateRandomSelection(const QRect &rc)
QRect selectedExactRect() const