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

#include <kis_duplicateop.h>

+ Inheritance diagram for KisDuplicateOp:

Public Member Functions

 KisDuplicateOp (const KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image)
 
 ~KisDuplicateOp () override
 
- Public Member Functions inherited from KisBrushBasedPaintOp
bool canPaint () const override
 Reimplemented, false if brush is 0.
 
bool checkSizeTooSmall (qreal scale)
 
KisSpacingInformation effectiveSpacing (qreal scale) const
 
KisSpacingInformation effectiveSpacing (qreal scale, qreal rotation, const KisAirbrushOptionData *airbrushOption, const KisSpacingOption *spacingOption, const KisPaintInformation &pi) const
 
KisSpacingInformation effectiveSpacing (qreal scale, qreal rotation, const KisPaintInformation &pi) const
 
KisSpacingInformation effectiveSpacing (qreal scale, qreal rotation, const KisSpacingOption &spacingOption, const KisPaintInformation &pi) const
 
 KisBrushBasedPaintOp (const KisPaintOpSettingsSP settings, KisPainter *painter, KisBrushTextureFlags textureFlags=None)
 
 ~KisBrushBasedPaintOp () override
 
- Public Member Functions inherited from KisPaintOp
virtual std::pair< int, bool > doAsynchronousUpdate (QVector< KisRunnableStrokeJobData * > &jobs)
 
 KisPaintOp (KisPainter *painter)
 
void paintAt (const KisPaintInformation &info, KisDistanceInformation *currentDistance)
 
virtual void paintBezierCurve (const KisPaintInformation &pi1, const QPointF &control1, const QPointF &control2, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance)
 
virtual void paintLine (const KisPaintInformation &pi1, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance)
 
 Private (KisPaintOp *_q)
 
void updateSpacing (const KisPaintInformation &info, KisDistanceInformation &currentDistance) const
 
void updateTiming (const KisPaintInformation &info, KisDistanceInformation &currentDistance) const
 
virtual ~KisPaintOp ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Protected Member Functions

KisSpacingInformation paintAt (const KisPaintInformation &info) override
 
KisSpacingInformation updateSpacingImpl (const KisPaintInformation &info) const override
 
- Protected Member Functions inherited from KisPaintOp
KisFixedPaintDeviceSP cachedDab ()
 
KisFixedPaintDeviceSP cachedDab (const KoColorSpace *cs)
 
KisPainterpainter () const
 
KisPaintDeviceSP source () const
 
virtual KisTimingInformation updateTimingImpl (const KisPaintInformation &info) const
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Private Member Functions

qreal minimizeEnergy (const qreal *m, qreal *sol, int w, int h)
 

Private Attributes

KisDuplicateOptionData m_duplicateOptionData
 
QPointF m_duplicateStart {QPointF(0.0, 0.0)}
 
bool m_duplicateStartIsSet {false}
 
KisImageSP m_image
 
KisNodeSP m_node
 
KisOpacityOption m_opacityOption
 
KisRotationOption m_rotationOption
 
KisDuplicateOpSettingsSP m_settings
 
KisSizeOption m_sizeOption
 
KisPaintDeviceSP m_srcdev
 
KisPaintDeviceSP m_target
 

Additional Inherited Members

- Static Public Member Functions inherited from KisBrushBasedPaintOp
static QList< KoResourceLoadResultprepareEmbeddedResources (const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface)
 
static QList< KoResourceLoadResultprepareLinkedResources (const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface)
 
- Static Public Member Functions inherited from KisPaintOp
static void splitCoordinate (qreal coordinate, qint32 *whole, qreal *fraction)
 
- Public Attributes inherited from KisPaintOp
KisFixedPaintDeviceSP dab
 
bool fanCornersEnabled {false}
 
qreal fanCornersStep {1.0}
 
KisPainterpainter {nullptr}
 
KisPaintOpq {nullptr}
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 
- Protected Attributes inherited from KisBrushBasedPaintOp
KisBrushSP m_brush
 
KisDabCachem_dabCache
 
KisMirrorOption m_mirrorOption
 
KisPrecisionOption m_precisionOption
 

Detailed Description

Definition at line 36 of file kis_duplicateop.h.

Constructor & Destructor Documentation

◆ KisDuplicateOp()

KisDuplicateOp::KisDuplicateOp ( const KisPaintOpSettingsSP settings,
KisPainter * painter,
KisNodeSP node,
KisImageSP image )

Definition at line 50 of file kis_duplicateop.cpp.

51 : KisBrushBasedPaintOp(settings, painter)
52 , m_image(image)
53 , m_node(node)
54 , m_settings(static_cast<KisDuplicateOpSettings*>(const_cast<KisPaintOpSettings*>(settings.data())))
55 , m_sizeOption(settings.data())
56 , m_opacityOption(settings.data(), node)
57 , m_rotationOption(settings.data())
58{
59 Q_ASSERT(settings);
60 Q_ASSERT(painter);
61
64}
KisBrushBasedPaintOp(const KisPaintOpSettingsSP settings, KisPainter *painter, KisBrushTextureFlags textureFlags=None)
KisDuplicateOpSettingsSP m_settings
KisSizeOption m_sizeOption
KisPaintDeviceSP m_srcdev
KisRotationOption m_rotationOption
KisOpacityOption m_opacityOption
KisImageSP m_image
KisDuplicateOptionData m_duplicateOptionData
KisPaintDeviceSP createCompositionSourceDevice() const
bool read(const KisPropertiesConfiguration *setting)
KisPainter * painter
KisPaintDeviceSP source() const

References KisPaintDevice::createCompositionSourceDevice(), KisSharedPtr< T >::data(), m_duplicateOptionData, m_srcdev, KisPaintOp::painter, KisDuplicateOptionData::read(), and KisPaintOp::source().

◆ ~KisDuplicateOp()

KisDuplicateOp::~KisDuplicateOp ( )
override

Definition at line 66 of file kis_duplicateop.cpp.

67{
68}

Member Function Documentation

◆ minimizeEnergy()

qreal KisDuplicateOp::minimizeEnergy ( const qreal * m,
qreal * sol,
int w,
int h )
private

◆ paintAt()

KisSpacingInformation KisDuplicateOp::paintAt ( const KisPaintInformation & info)
overrideprotectedvirtual

The implementation of painting of a dab and updating spacing. This does NOT need to update the timing information.

The saved layer might have been deleted by then, so check if it still belongs to a graph

Implements KisPaintOp.

Definition at line 72 of file kis_duplicateop.cpp.

73{
74 if (!painter()->device()) return KisSpacingInformation(1.0);
75
76 KisBrushSP brush = m_brush;
77 if (!brush)
78 return KisSpacingInformation(1.0);
79
80 if (!brush->canPaintFor(info))
81 return KisSpacingInformation(1.0);
82
85 m_duplicateStart = info.pos();
86 }
87
88 KisPaintDeviceSP realSourceDevice;
89
91 realSourceDevice = m_image->projection();
92 }
93 else {
94 KisNodeSP externalSourceNode = m_settings->sourceNode();
95
100 if (!externalSourceNode || !externalSourceNode->graphListener()) {
101 externalSourceNode = m_node;
102 }
103
104 realSourceDevice = externalSourceNode->projection();
105 }
106
107 qreal rotation = m_rotationOption.apply(info);
108
110
111 qreal scale = m_sizeOption.apply(info);
112
113 if (checkSizeTooSmall(scale)) return KisSpacingInformation();
114 KisDabShape shape(scale, 1.0, rotation);
115
116
117 static const KoColorSpace *cs = KoColorSpaceRegistry::instance()->alpha8();
118 static KoColor color(Qt::black, cs);
119
120 QRect dstRect;
122 m_dabCache->fetchDab(cs, color, info.pos(),
123 shape,
124 info, 1.0,
125 &dstRect);
126
127 if (dstRect.isEmpty()) return KisSpacingInformation(1.0);
128
129
130 QPoint srcPoint;
131
133 srcPoint = (dstRect.topLeft() - m_settings->offset()).toPoint();
134 }
135 else {
136 QPointF hotSpot = brush->hotSpot(shape, info);
137 srcPoint = (m_settings->position() - hotSpot).toPoint();
138 }
139
140 qint32 sw = dstRect.width();
141 qint32 sh = dstRect.height();
142
143 // Perspective correction ?
144
145
146 // if (m_perspectiveCorrection && m_image && m_image->perspectiveGrid()->countSubGrids() == 1) {
147 // Matrix3qreal startM = Matrix3qreal::Identity();
148 // Matrix3qreal endM = Matrix3qreal::Identity();
149
150 // // First look for the grid corresponding to the start point
151 // KisSubPerspectiveGrid* subGridStart = *m_image->perspectiveGrid()->begin();
152 // QRect r = QRect(0, 0, m_image->width(), m_image->height());
153
154 // if (subGridStart) {
155 // startM = KisPerspectiveMath::computeMatrixTransfoFromPerspective(r, *subGridStart->topLeft(), *subGridStart->topRight(), *subGridStart->bottomLeft(), *subGridStart->bottomRight());
156 // }
157
158 // // Second look for the grid corresponding to the end point
159 // KisSubPerspectiveGrid* subGridEnd = *m_image->perspectiveGrid()->begin();
160 // if (subGridEnd) {
161 // endM = KisPerspectiveMath::computeMatrixTransfoToPerspective(*subGridEnd->topLeft(), *subGridEnd->topRight(), *subGridEnd->bottomLeft(), *subGridEnd->bottomRight(), r);
162 // }
163
164 // // Compute the translation in the perspective transformation space:
165 // QPointF positionStartPaintingT = KisPerspectiveMath::matProd(endM, QPointF(m_duplicateStart));
166 // QPointF duplicateStartPositionT = KisPerspectiveMath::matProd(endM, QPointF(m_duplicateStart) - QPointF(m_settings->offset()));
167 // QPointF translate = duplicateStartPositionT - positionStartPaintingT;
168
169 // KisSequentialIterator dstIt(m_srcdev, QRect(0, 0, sw, sh));
170 // KisRandomSubAccessorSP srcAcc = realSourceDevice->createRandomSubAccessor();
171
172 // //Action
173 // while (dstIt.nextPixel()) {
174 // QPointF p = KisPerspectiveMath::matProd(startM, KisPerspectiveMath::matProd(endM, QPointF(dstIt.x() + dstRect.x(), dstIt.y() + dstRect.y())) + translate);
175 // srcAcc->moveTo(p);
176 // srcAcc->sampledOldRawData(dstIt.rawData());
177 // }
178
179
180 // }
181 // else
182 {
183 KisPainter copyPainter(m_srcdev);
184 copyPainter.setCompositeOpId(COMPOSITE_COPY);
185 copyPainter.bitBltOldData(0, 0, realSourceDevice, srcPoint.x(), srcPoint.y(), sw, sh);
186 copyPainter.end();
187 }
188
189 // heal ?
191 QRect healRect(dstRect);
192
193 const bool smallWidth = healRect.width() < 3;
194 const bool smallHeight = healRect.height() < 3;
195
196 if (smallWidth || smallHeight) {
197 healRect.adjust(-1, -1, 1, 1);
198 }
199
200 const int healSW = healRect.width();
201 const int healSH = healRect.height();
202
203
204 quint16 srcData[4];
205 quint16 tmpData[4];
206 QScopedArrayPointer<qreal> matrix(new qreal[ 3 * healSW * healSH ]);
207 // First divide
208 const KoColorSpace* srcCs = realSourceDevice->colorSpace();
209 const KoColorSpace* tmpCs = m_srcdev->colorSpace();
210 KisHLineConstIteratorSP srcIt = realSourceDevice->createHLineConstIteratorNG(healRect.x(), healRect.y() , healSW);
212 qreal* matrixIt = matrix.data();
213 for (int j = 0; j < healSH; j++) {
214 for (int i = 0; i < healSW; i++) {
215 srcCs->toLabA16(srcIt->oldRawData(), (quint8*)srcData, 1);
216 tmpCs->toLabA16(tmpIt->rawData(), (quint8*)tmpData, 1);
217 // Division
218 for (int k = 0; k < 3; k++) {
219 matrixIt[k] = srcData[k] / (qreal)qMax((int)tmpData [k], 1);
220 }
221 srcIt->nextPixel();
222 tmpIt->nextPixel();
223 matrixIt += 3;
224 }
225 srcIt->nextRow();
226 tmpIt->nextRow();
227 }
228 // Minimize energy
229 {
230 int iter = 0;
231 qreal err;
232 QScopedArrayPointer<qreal> solution(new qreal[ 3 * healSW * healSH ]);
233
234 do {
235 err = DuplicateOpUtils::minimizeEnergy(matrix.data(), solution.data(), healSW, healSH);
236
237 solution.swap(matrix);
238
239 iter++;
240 } while (err > 0.00001 && iter < 100);
241 }
242
243 // Finally multiply
244 KisHLineIteratorSP tmpIt2 = m_srcdev->createHLineIteratorNG(0, 0, healSW);
245 matrixIt = &matrix[0];
246 for (int j = 0; j < healSH; j++) {
247 for (int i = 0; i < healSW; i++) {
248 tmpCs->toLabA16(tmpIt2->rawData(), (quint8*)tmpData, 1);
249 // Multiplication
250 for (int k = 0; k < 3; k++) {
251 tmpData[k] = (int)CLAMP(matrixIt[k] * qMax((int) tmpData[k], 1), 0, 65535);
252 }
253 tmpCs->fromLabA16((quint8*)tmpData, tmpIt2->rawData(), 1);
254 tmpIt2->nextPixel();
255 matrixIt += 3;
256 }
257 tmpIt2->nextRow();
258 }
259 }
260
261 painter()->bitBltWithFixedSelection(dstRect.x(), dstRect.y(),
262 m_srcdev, dab,
263 dstRect.width(),
264 dstRect.height());
265
266 painter()->renderMirrorMaskSafe(dstRect, m_srcdev, 0, 0, dab,
268
269 return effectiveSpacing(scale);
270}
const QString COMPOSITE_COPY
virtual const quint8 * oldRawData() const =0
virtual bool nextPixel()=0
KisSpacingInformation effectiveSpacing(qreal scale) const
bool needSeparateOriginal() const
KisFixedPaintDeviceSP fetchDab(const KoColorSpace *cs, KisColorSource *colorSource, const QPointF &cursorPoint, KisDabShape const &, const KisPaintInformation &info, qreal softnessFactor, QRect *dstDabRect, qreal lightnessStrength=1.0)
QPointF m_duplicateStart
virtual void nextRow()=0
KisPaintDeviceSP projection() const
void apply(KisPainter *painter, const KisPaintInformation &info) const
KisHLineIteratorSP createHLineIteratorNG(qint32 x, qint32 y, qint32 w)
const KoColorSpace * colorSpace() const
KisHLineConstIteratorSP createHLineConstIteratorNG(qint32 x, qint32 y, qint32 w) const
const QPointF & pos() const
void renderMirrorMaskSafe(QRect rc, KisFixedPaintDeviceSP dab, bool preserveDab)
void bitBltWithFixedSelection(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, const KisFixedPaintDeviceSP selection, qint32 selX, qint32 selY, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
qreal apply(const KisPaintInformation &info) const
qreal apply(const KisPaintInformation &info) const
virtual void toLabA16(const quint8 *src, quint8 *dst, quint32 nPixels) const
virtual void fromLabA16(const quint8 *src, quint8 *dst, quint32 nPixels) const
#define CLAMP(x, l, h)
qreal minimizeEnergy(const qreal *m, qreal *sol, int w, int h)
virtual KisPaintDeviceSP projection() const =0
KisNodeGraphListener * graphListener
Definition kis_node.cpp:87
KisFixedPaintDeviceSP dab
static KoColorSpaceRegistry * instance()
const KoColorSpace * alpha8()

References KoColorSpaceRegistry::alpha8(), KisRotationOption::apply(), KisStandardOption< Data >::apply(), KisOpacityOption::apply(), KisPainter::bitBltOldData(), KisPainter::bitBltWithFixedSelection(), KisBrushBasedPaintOp::checkSizeTooSmall(), CLAMP, KisDuplicateOptionData::cloneFromProjection, KisPaintDevice::colorSpace(), COMPOSITE_COPY, KisPaintDevice::createHLineConstIteratorNG(), KisPaintDevice::createHLineIteratorNG(), KisPaintOp::dab, KisSharedPtr< T >::data(), KisBrushBasedPaintOp::effectiveSpacing(), KisPainter::end(), KisDabCache::fetchDab(), KoColorSpace::fromLabA16(), KisNode::graphListener, KisDuplicateOptionData::healing, KoColorSpaceRegistry::instance(), KisBrushBasedPaintOp::m_brush, KisBrushBasedPaintOp::m_dabCache, m_duplicateOptionData, m_duplicateStart, m_duplicateStartIsSet, m_image, m_node, m_opacityOption, m_rotationOption, m_settings, m_sizeOption, m_srcdev, DuplicateOpUtils::minimizeEnergy(), KisDuplicateOptionData::moveSourcePoint, KisDabCache::needSeparateOriginal(), KisBaseConstIteratorNG::nextPixel(), KisHLineConstIteratorNG::nextRow(), KisDuplicateOpSettings::offset(), KisBaseConstAccessor::oldRawData(), KisPaintOp::painter, KisPaintInformation::pos(), KisDuplicateOpSettings::position(), KisImage::projection(), KisBaseNode::projection(), KisPainter::renderMirrorMaskSafe(), KisPainter::setCompositeOpId(), KisDuplicateOpSettings::sourceNode(), and KoColorSpace::toLabA16().

◆ updateSpacingImpl()

KisSpacingInformation KisDuplicateOp::updateSpacingImpl ( const KisPaintInformation & info) const
overrideprotectedvirtual

Implementation of a spacing update

Implements KisPaintOp.

Definition at line 272 of file kis_duplicateop.cpp.

273{
274 return effectiveSpacing(m_sizeOption.apply(info));
275}

References KisStandardOption< Data >::apply(), KisBrushBasedPaintOp::effectiveSpacing(), and m_sizeOption.

Member Data Documentation

◆ m_duplicateOptionData

KisDuplicateOptionData KisDuplicateOp::m_duplicateOptionData
private

Definition at line 58 of file kis_duplicateop.h.

◆ m_duplicateStart

QPointF KisDuplicateOp::m_duplicateStart {QPointF(0.0, 0.0)}
private

Definition at line 62 of file kis_duplicateop.h.

62{QPointF(0.0, 0.0)};

◆ m_duplicateStartIsSet

bool KisDuplicateOp::m_duplicateStartIsSet {false}
private

Definition at line 63 of file kis_duplicateop.h.

63{false};

◆ m_image

KisImageSP KisDuplicateOp::m_image
private

Definition at line 55 of file kis_duplicateop.h.

◆ m_node

KisNodeSP KisDuplicateOp::m_node
private

Definition at line 56 of file kis_duplicateop.h.

◆ m_opacityOption

KisOpacityOption KisDuplicateOp::m_opacityOption
private

Definition at line 65 of file kis_duplicateop.h.

◆ m_rotationOption

KisRotationOption KisDuplicateOp::m_rotationOption
private

Definition at line 66 of file kis_duplicateop.h.

◆ m_settings

KisDuplicateOpSettingsSP KisDuplicateOp::m_settings
private

Definition at line 59 of file kis_duplicateop.h.

◆ m_sizeOption

KisSizeOption KisDuplicateOp::m_sizeOption
private

Definition at line 64 of file kis_duplicateop.h.

◆ m_srcdev

KisPaintDeviceSP KisDuplicateOp::m_srcdev
private

Definition at line 60 of file kis_duplicateop.h.

◆ m_target

KisPaintDeviceSP KisDuplicateOp::m_target
private

Definition at line 61 of file kis_duplicateop.h.


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