Krita Source Code Documentation
Loading...
Searching...
No Matches
KisEncloseAndFillProcessingVisitor.cpp
Go to the documentation of this file.
1/*
2 * KDE. Krita Project.
3 *
4 * SPDX-FileCopyrightText: 2022 Deif Lou <ginoba@gmail.com>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9#include <kis_node.h>
10#include <kis_image.h>
11#include <kis_wrapped_rect.h>
14
16
18 KisPixelSelectionSP enclosingMask,
19 KisSelectionSP selection,
20 KisResourcesSnapshotSP resources,
22 const KoColor &regionSelectionColor,
23 bool regionSelectionInvert,
24 bool regionSelectionIncludeContourRegions,
25 bool regionSelectionIncludeSurroundingRegions,
26 int fillThreshold,
27 int fillOpacitySpread,
28 int closeGap,
29 bool antiAlias,
30 int expand,
31 bool stopGrowingAtDarkestPixel,
32 int feather,
33 bool useSelectionAsBoundary,
34 bool usePattern,
35 bool unmerged,
36 bool useBgColor,
37 bool useCustomBlendingOptions,
38 qreal customOpacity,
39 const QString &customCompositeOp,
40 QSharedPointer<QRect> outDirtyRect
41)
42 : m_referencePaintDevice(referencePaintDevice)
43 , m_enclosingMask(enclosingMask)
44 , m_selection(selection)
45 , m_resources(resources)
46 , m_regionSelectionMethod(regionSelectionMethod)
47 , m_regionSelectionColor(regionSelectionColor)
48 , m_regionSelectionInvert(regionSelectionInvert)
49 , m_regionSelectionIncludeContourRegions(regionSelectionIncludeContourRegions)
50 , m_regionSelectionIncludeSurroundingRegions(regionSelectionIncludeSurroundingRegions)
51 , m_fillThreshold(fillThreshold)
52 , m_fillOpacitySpread(fillOpacitySpread)
53 , m_closeGap(closeGap)
54 , m_useSelectionAsBoundary(useSelectionAsBoundary)
55 , m_antiAlias(antiAlias)
56 , m_expand(expand)
57 , m_stopGrowingAtDarkestPixel(stopGrowingAtDarkestPixel)
58 , m_feather(feather)
59 , m_usePattern(usePattern)
60 , m_unmerged(unmerged)
61 , m_useBgColor(useBgColor)
62 , m_useCustomBlendingOptions(useCustomBlendingOptions)
63 , m_customOpacity(customOpacity)
64 , m_customCompositeOp(customCompositeOp)
65 , m_outDirtyRect(outDirtyRect)
66{}
67
69{
70 Q_UNUSED(layer);
71 Q_UNUSED(undoAdapter);
72}
73
75{
76 KisPaintDeviceSP device = node->paintDevice();
77 Q_ASSERT(device);
78 ProgressHelper helper(node);
79 fillPaintDevice(device, undoAdapter, helper);
80}
81
83{
84 Q_ASSERT(m_enclosingMask);
85
86 const QRect fillRect = m_resources->image()->bounds();
87
88 KisEncloseAndFillPainter painter(device, m_selection, fillRect.size());
89 painter.beginTransaction();
90
91 m_resources->setupPainter(&painter);
92
93 if (m_useBgColor) {
94 painter.setPaintColor(painter.backgroundColor());
95 }
96
97 painter.setProgress(helper.updater());
105 painter.setCloseGap(m_closeGap);
107 painter.setAntiAlias(m_antiAlias);
108 painter.setSizemod(m_expand);
110 painter.setFeather(m_feather);
114 }
115
116 KisPaintDeviceSP sourceDevice = m_unmerged ? device : m_referencePaintDevice;
117
118 if (m_usePattern) {
120 } else {
121 painter.encloseAndFillColor(m_enclosingMask, sourceDevice);
122 }
123
124 painter.endTransaction(undoAdapter);
125
126 if (m_outDirtyRect) {
128 QVector<QRect> dirtyRects = painter.takeDirtyRegion();
129 Q_FOREACH(const QRect &r, dirtyRects) {
130 *m_outDirtyRect = m_outDirtyRect->united(r);
131 }
132 }
133}
134
136{
137 Q_UNUSED(mask);
138 Q_UNUSED(undoAdapter);
139}
void expand(ExpansionStrategy &expansionStrategy, KoUpdater *progressUpdater)
void setRegionSelectionIncludeContourRegions(bool include)
void setRegionSelectionIncludeSurroundingRegions(bool include)
void setRegionSelectionColor(const KoColor &color)
void encloseAndFillPattern(KisPixelSelectionSP enclosingMask, KisPaintDeviceSP referenceDevice, QTransform patternTransform=QTransform())
void encloseAndFillColor(KisPixelSelectionSP enclosingMask, KisPaintDeviceSP referenceDevice)
void setRegionSelectionMethod(RegionSelectionMethod regionSelectionMethod)
void fillPaintDevice(KisPaintDeviceSP device, KisUndoAdapter *undoAdapter, ProgressHelper &helper)
void visitColorizeMask(KisColorizeMask *mask, KisUndoAdapter *undoAdapter) override
void visitNodeWithPaintDevice(KisNode *node, KisUndoAdapter *undoAdapter) override
KisEncloseAndFillProcessingVisitor(KisPaintDeviceSP referencePaintDevice, KisPixelSelectionSP enclosingMask, KisSelectionSP selection, KisResourcesSnapshotSP resources, KisEncloseAndFillPainter::RegionSelectionMethod regionSelectionMethod, const KoColor &regionSelectionColor, bool regionSelectionInvert, bool regionSelectionIncludeContourRegions, bool regionSelectionIncludeSurroundingRegions, int fillThreshold, int fillOpacitySpread, int closeGap, bool antiAlias, int expand, bool stopGrowingAtDarkestPixel, int feather, bool useSelectionAsBoundary, bool usePattern, bool unmerged, bool useBgColor, bool useCustomBlendingOptions, qreal customOpacity, const QString &customCompositeOp, QSharedPointer< QRect > outDirtyRect)
void visitExternalLayer(KisExternalLayer *layer, KisUndoAdapter *undoAdapter) override
KisEncloseAndFillPainter::RegionSelectionMethod m_regionSelectionMethod
void setSizemod(int sizemod)
void setFillThreshold(int threshold)
void setFeather(int feather)
void setCloseGap(int gap)
void setUseSelectionAsBoundary(bool useSelectionAsBoundary)
void setAntiAlias(bool antiAlias)
void setStopGrowingAtDarkestPixel(bool stopGrowingAtDarkestPixel)
void setOpacitySpread(int opacitySpread)
QRect bounds() const override
void endTransaction(KisUndoAdapter *undoAdapter)
Finish the undoable paint operation.
void beginTransaction(const KUndo2MagicString &transactionName=KUndo2MagicString(), int timedID=-1)
Begin an undoable paint operation.
void setOpacityF(qreal opacity)
void setProgress(KoUpdater *progressUpdater)
KoColor backgroundColor
void setPaintColor(const KoColor &color)
QVector< QRect > takeDirtyRegion()
void setCompositeOpId(const KoCompositeOp *op)
void setupPainter(KisPainter *painter)
bool isNull() const
virtual KisPaintDeviceSP paintDevice() const =0
bool hasNonEmptyPixelSelection() const