Krita Source Code Documentation
Loading...
Searching...
No Matches
KisWatershedWorker.cpp File Reference
#include "KisWatershedWorker.h"
#include <KoColorSpaceRegistry.h>
#include <KoColorSpace.h>
#include <KoColor.h>
#include <KoAlwaysInline.h>
#include <KoUpdater.h>
#include "kis_lazy_fill_tools.h"
#include "kis_paint_device_debug_utils.h"
#include "kis_paint_device.h"
#include "kis_painter.h"
#include "kis_sequential_iterator.h"
#include "kis_scanline_fill.h"
#include "kis_random_accessor_ng.h"
#include <boost/heap/fibonacci_heap.hpp>
#include <set>
#include <QElapsedTimer>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/mean.hpp>
#include <boost/accumulators/statistics/min.hpp>

Go to the source code of this file.

Classes

struct  KisWatershedWorker::Private
 

Functions

ALWAYS_INLINE void addForeignAlly (qint32 currGroupId, qint32 prevGroupId, FillGroup &currGroup, FillGroup &prevGroup, FillGroup::LevelData &currLevelData, FillGroup::LevelData &prevLevelData, const QPoint &currPt, const QPoint &prevPt, bool sameLevel)
 
ALWAYS_INLINE void decrementLevelEdge (FillGroup::LevelData &currLevelData, FillGroup::LevelData &prevLevelData, quint8 currLevel, quint8 prevLevel)
 
ALWAYS_INLINE void incrementLevelEdge (FillGroup::LevelData &currLevelData, FillGroup::LevelData &prevLevelData, quint8 currLevel, quint8 prevLevel)
 
ALWAYS_INLINE void removeForeignAlly (qint32 currGroupId, qint32 prevGroupId, FillGroup &currGroup, FillGroup &prevGroup, FillGroup::LevelData &currLevelData, FillGroup::LevelData &prevLevelData, const QPoint &currPt, const QPoint &prevPt, bool sameLevel)
 

Function Documentation

◆ addForeignAlly()

ALWAYS_INLINE void addForeignAlly ( qint32 currGroupId,
qint32 prevGroupId,
FillGroup & currGroup,
FillGroup & prevGroup,
FillGroup::LevelData & currLevelData,
FillGroup::LevelData & prevLevelData,
const QPoint & currPt,
const QPoint & prevPt,
bool sameLevel )

Definition at line 400 of file KisWatershedWorker.cpp.

408{
409 if (currGroup.colorIndex != prevGroup.colorIndex || !sameLevel) {
410 prevLevelData.foreignEdgeSize++;
411 currLevelData.foreignEdgeSize++;
412
413 if (sameLevel) {
414 currLevelData.conflictWithGroup[prevGroupId].insert(currPt);
415 prevLevelData.conflictWithGroup[currGroupId].insert(prevPt);
416 }
417
418 } else {
419 prevLevelData.allyEdgeSize++;
420 currLevelData.allyEdgeSize++;
421 }
422
423
424}

◆ decrementLevelEdge()

ALWAYS_INLINE void decrementLevelEdge ( FillGroup::LevelData & currLevelData,
FillGroup::LevelData & prevLevelData,
quint8 currLevel,
quint8 prevLevel )

Definition at line 471 of file KisWatershedWorker.cpp.

475{
476 Q_ASSERT(currLevel != prevLevel);
477
478 if (currLevel > prevLevel) {
479 currLevelData.negativeEdgeSize--;
480 prevLevelData.positiveEdgeSize--;
481 } else {
482 currLevelData.positiveEdgeSize--;
483 prevLevelData.negativeEdgeSize--;
484 }
485}

◆ incrementLevelEdge()

ALWAYS_INLINE void incrementLevelEdge ( FillGroup::LevelData & currLevelData,
FillGroup::LevelData & prevLevelData,
quint8 currLevel,
quint8 prevLevel )

Definition at line 455 of file KisWatershedWorker.cpp.

459{
460 Q_ASSERT(currLevel != prevLevel);
461
462 if (currLevel > prevLevel) {
463 currLevelData.negativeEdgeSize++;
464 prevLevelData.positiveEdgeSize++;
465 } else {
466 currLevelData.positiveEdgeSize++;
467 prevLevelData.negativeEdgeSize++;
468 }
469}

◆ removeForeignAlly()

ALWAYS_INLINE void removeForeignAlly ( qint32 currGroupId,
qint32 prevGroupId,
FillGroup & currGroup,
FillGroup & prevGroup,
FillGroup::LevelData & currLevelData,
FillGroup::LevelData & prevLevelData,
const QPoint & currPt,
const QPoint & prevPt,
bool sameLevel )

Definition at line 426 of file KisWatershedWorker.cpp.

434{
435 if (currGroup.colorIndex != prevGroup.colorIndex || !sameLevel) {
436 prevLevelData.foreignEdgeSize--;
437 currLevelData.foreignEdgeSize--;
438
439 if (sameLevel) {
440 std::multiset<QPoint, CompareQPoints> &currSet = currLevelData.conflictWithGroup[prevGroupId];
441 currSet.erase(currSet.find(currPt));
442
443 std::multiset<QPoint, CompareQPoints> &prevSet = prevLevelData.conflictWithGroup[currGroupId];
444 prevSet.erase(prevSet.find(prevPt));
445 }
446
447 } else {
448 prevLevelData.allyEdgeSize--;
449 currLevelData.allyEdgeSize--;
450 }
451
452
453}