Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_scanline_fill.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef __KIS_SCANLINE_FILL_H
8#define __KIS_SCANLINE_FILL_H
9
10#include <QScopedPointer>
11
12#include <kritaimage_export.h>
13#include <kis_types.h>
14#include <kis_paint_device.h>
15
16class KisFillInterval;
18
19class KRITAIMAGE_EXPORT KisScanlineFill
20{
21public:
22 KisScanlineFill(KisPaintDeviceSP device, const QPoint &startPoint, const QRect &boundingRect);
24
28 void fill(const KoColor &fillColor);
29
33 void fillUntilColor(const KoColor &fillColor, const KoColor &boundaryColor);
34
39 void fill(const KoColor &fillColor, KisPaintDeviceSP externalDevice);
40
45 void fillUntilColor(const KoColor &fillColor, const KoColor &boundaryColor, KisPaintDeviceSP externalDevice);
46
51 void fillSelection(KisPixelSelectionSP pixelSelection, KisPaintDeviceSP boundarySelection);
52
56 void fillSelection(KisPixelSelectionSP pixelSelection);
57
64 void fillSelectionUntilColor(KisPixelSelectionSP pixelSelection, const KoColor &boundaryColor, KisPaintDeviceSP boundarySelection);
65
71 void fillSelectionUntilColor(KisPixelSelectionSP pixelSelection, const KoColor &boundaryColor);
72
79 void fillSelectionUntilColorOrTransparent(KisPixelSelectionSP pixelSelection, const KoColor &boundaryColor, KisPaintDeviceSP boundarySelection);
80
86 void fillSelectionUntilColorOrTransparent(KisPixelSelectionSP pixelSelection, const KoColor &boundaryColor);
87
93 void clearNonZeroComponent();
94
103 void fillContiguousGroup(KisPaintDeviceSP groupMapDevice, qint32 groupIndex);
104
110 void setThreshold(int threshold);
111
123 void setOpacitySpread(int opacitySpread);
124
133 void setCloseGap(int closeGap);
134
138 QRect fillExtent() const;
139
140private:
141 friend class KisScanlineFillTest;
142 Q_DISABLE_COPY(KisScanlineFill)
143
144 template <typename DifferencePolicy, typename SelectionPolicy, typename PixelAccessPolicy>
145 void processLine(KisFillInterval interval, const int rowIncrement,
146 DifferencePolicy &differencePolicy,
147 SelectionPolicy &selectionPolicy,
148 PixelAccessPolicy &pixelAccessPolicy);
149
150 template <typename DifferencePolicy, typename SelectionPolicy, typename PixelAccessPolicy>
151 void extendedPass(KisFillInterval *currentInterval, int srcRow, bool extendRight,
152 DifferencePolicy &differencePolicy,
153 SelectionPolicy &selectionPolicy,
154 PixelAccessPolicy &pixelAccessPolicy);
155
156 template <typename DifferencePolicy, typename SelectionPolicy, typename PixelAccessPolicy>
157 void runImpl(DifferencePolicy &differencePolicy,
158 SelectionPolicy &selectionPolicy,
159 PixelAccessPolicy &pixelAccessPolicy);
160
161 template <template <typename SrcPixelType> typename OptimizedDifferencePolicy,
162 typename SlowDifferencePolicy,
163 typename SelectionPolicy, typename PixelAccessPolicy>
164 void selectDifferencePolicyAndRun(const KoColor &srcColor,
165 SelectionPolicy &selectionPolicy,
166 PixelAccessPolicy &pixelAccessPolicy);
167
168 template <typename DifferencePolicy, typename SelectionPolicy, typename PixelAccessPolicy>
169 KisFillInterval closeGapPass(DifferencePolicy &differencePolicy,
170 SelectionPolicy &selectionPolicy,
171 PixelAccessPolicy &pixelAccessPolicy);
172
173 template <typename DifferencePolicy, typename SelectionPolicy, typename PixelAccessPolicy>
174 bool fillOpacity(DifferencePolicy &differencePolicy,
175 SelectionPolicy &selectionPolicy,
176 PixelAccessPolicy &pixelAccessPolicy,
177 KisPaintDevice* const devicePtr,
178 const QRect& rect) const;
179
180 inline bool tryPushingCloseGapSeed(int x, int y, bool allowExpand);
181
182private:
183 void testingProcessLine(const KisFillInterval &processInterval);
184 QVector<KisFillInterval> testingGetForwardIntervals() const;
185 KisFillIntervalMap* testingGetBackwardIntervals() const;
186private:
187 struct Private;
188 const QScopedPointer<Private> m_d;
189};
190
191#endif /* __KIS_SCANLINE_FILL_H */
QRect fillExtent() const
const QScopedPointer< Private > m_d