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

#include <kis_multiway_cut.h>

Classes

struct  Private
 

Public Member Functions

void addKeyStroke (KisPaintDeviceSP dev, const KoColor &color)
 
KisPaintDeviceSP dstDevice () const
 
 KisMultiwayCut (KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &boundingRect)
 
void run ()
 
KisPaintDeviceSP srcDevice () const
 
 ~KisMultiwayCut ()
 

Private Attributes

const QScopedPointer< Privatem_d
 

Detailed Description

Definition at line 17 of file kis_multiway_cut.h.

Constructor & Destructor Documentation

◆ KisMultiwayCut()

KisMultiwayCut::KisMultiwayCut ( KisPaintDeviceSP src,
KisPaintDeviceSP dst,
const QRect & boundingRect )

Definition at line 35 of file kis_multiway_cut.cpp.

38 : m_d(new Private)
39{
40 m_d->src = src;
41 m_d->dst = dst;
42 m_d->mask = new KisPaintDevice(KoColorSpaceRegistry::instance()->alpha8());
43 m_d->boundingRect = boundingRect;
44}
const QScopedPointer< Private > m_d
static KoColorSpaceRegistry * instance()

References KoColorSpaceRegistry::instance(), and m_d.

◆ ~KisMultiwayCut()

KisMultiwayCut::~KisMultiwayCut ( )

Definition at line 46 of file kis_multiway_cut.cpp.

47{
48}

Member Function Documentation

◆ addKeyStroke()

void KisMultiwayCut::addKeyStroke ( KisPaintDeviceSP dev,
const KoColor & color )

Definition at line 50 of file kis_multiway_cut.cpp.

51{
52 m_d->keyStrokes << KeyStroke(dev, color);
53}

References m_d.

◆ dstDevice()

KisPaintDeviceSP KisMultiwayCut::dstDevice ( ) const

Definition at line 164 of file kis_multiway_cut.cpp.

165{
166 return m_d->dst;
167}

References m_d.

◆ run()

void KisMultiwayCut::run ( )

First sort all the key strokes in a way that all the transparent strokes go to the beginning of the list.

This is juat an heuristic: the transparent stroke usually represents the background so it is the bigger one. And since our algorithm is greedy, we should cover the biggest area as fast as possible.

Definition at line 94 of file kis_multiway_cut.cpp.

95{
97
108 std::stable_sort(m_d->keyStrokes.begin(), m_d->keyStrokes.end(), keyStrokesOrder);
109
110 while (m_d->keyStrokes.size() > 1) {
111 KeyStroke current = m_d->keyStrokes.takeFirst();
112
113 // if current scribble is empty, it just has no effect
114 if (current.dev->exactBounds().isEmpty()) continue;
115
116 KisPainter gc(other);
117
118 Q_FOREACH (const KeyStroke &s, m_d->keyStrokes) {
119 const QRect rc = s.dev->extent() & m_d->boundingRect;
120 gc.bitBlt(rc.topLeft(), s.dev, rc);
121 }
122
123 // if other is empty, it means that *all* other strokes are
124 // empty, so there is no reason to continue the process
125 if (other->exactBounds().isEmpty()) {
126 m_d->keyStrokes.clear();
127 m_d->keyStrokes << current;
128 break;
129 }
130
132 m_d->src,
133 current.dev,
134 other,
135 m_d->dst,
136 m_d->mask,
137 m_d->boundingRect);
138
139 other->clear();
140 }
141
142 // TODO: check if one can use the last cut for this purpose!
143
144 if (m_d->keyStrokes.size() == 1) {
145 KeyStroke current = m_d->keyStrokes.takeLast();
146
147 m_d->maskOutKeyStroke(current.dev, m_d->mask, m_d->boundingRect);
148
149 QVector<QPoint> points =
151
152 Q_FOREACH (const QPoint &pt, points) {
153 KisScanlineFill fill(m_d->mask, pt, m_d->boundingRect);
154 fill.fill(current.color, m_d->dst);
155 }
156 }
157}
QRect exactBounds() const
QRect extent() const
bool keyStrokesOrder(const KeyStroke &a, const KeyStroke &b)
void cutOneWay(const KoColor &color, KisPaintDeviceSP src, KisPaintDeviceSP colorScribble, KisPaintDeviceSP backgroundScribble, KisPaintDeviceSP resultDevice, KisPaintDeviceSP maskDevice, const QRect &boundingRect)
QVector< QPoint > splitIntoConnectedComponents(KisPaintDeviceSP dev, const QRect &boundingRect)

References KisPainter::bitBlt(), KisPaintDevice::clear(), KisLazyFillTools::KeyStroke::color, KisLazyFillTools::cutOneWay(), KisLazyFillTools::KeyStroke::dev, KisPaintDevice::exactBounds(), KisPaintDevice::extent(), KisScanlineFill::fill(), KoColorSpaceRegistry::instance(), keyStrokesOrder(), m_d, and KisLazyFillTools::splitIntoConnectedComponents().

◆ srcDevice()

KisPaintDeviceSP KisMultiwayCut::srcDevice ( ) const

Definition at line 159 of file kis_multiway_cut.cpp.

160{
161 return m_d->src;
162}

References m_d.

Member Data Documentation

◆ m_d

const QScopedPointer<Private> KisMultiwayCut::m_d
private

Definition at line 34 of file kis_multiway_cut.h.


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