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

#include <kis_selection_filters.h>

+ Inheritance diagram for KisGrowSelectionFilter:

Public Member Functions

QRect changeRect (const QRect &rect, KisDefaultBoundsBaseSP defaultBounds) override
 
 KisGrowSelectionFilter (qint32 xRadius, qint32 yRadius)
 
KUndo2MagicString name () override
 
void process (KisPixelSelectionSP pixelSelection, const QRect &rect) override
 
- Public Member Functions inherited from KisSelectionFilter
virtual ~KisSelectionFilter ()
 

Private Attributes

qint32 m_xRadius
 
qint32 m_yRadius
 

Additional Inherited Members

- Protected Member Functions inherited from KisSelectionFilter
void computeBorder (qint32 *circ, qint32 xradius, qint32 yradius)
 
void computeTransition (quint8 *transition, quint8 **buf, qint32 width)
 
void rotatePointers (quint8 **p, quint32 n)
 

Detailed Description

Definition at line 91 of file kis_selection_filters.h.

Constructor & Destructor Documentation

◆ KisGrowSelectionFilter()

KisGrowSelectionFilter::KisGrowSelectionFilter ( qint32 xRadius,
qint32 yRadius )

Definition at line 542 of file kis_selection_filters.cpp.

543 : m_xRadius(xRadius)
544 , m_yRadius(yRadius)
545{
546}

Member Function Documentation

◆ changeRect()

QRect KisGrowSelectionFilter::changeRect ( const QRect & rect,
KisDefaultBoundsBaseSP defaultBounds )
overridevirtual

Reimplemented from KisSelectionFilter.

Definition at line 553 of file kis_selection_filters.cpp.

554{
555 Q_UNUSED(defaultBounds);
556
557 return rect.adjusted(-m_xRadius, -m_yRadius, m_xRadius, m_yRadius);
558}

References m_xRadius, and m_yRadius.

◆ name()

KUndo2MagicString KisGrowSelectionFilter::name ( )
overridevirtual

Reimplemented from KisSelectionFilter.

Definition at line 548 of file kis_selection_filters.cpp.

549{
550 return kundo2_i18n("Grow Selection");
551}
KUndo2MagicString kundo2_i18n(const char *text)

References kundo2_i18n().

◆ process()

void KisGrowSelectionFilter::process ( KisPixelSelectionSP pixelSelection,
const QRect & rect )
overridevirtual

Much code resembles Shrink filter, so please fix bugs in both filters

Implements KisSelectionFilter.

Definition at line 560 of file kis_selection_filters.cpp.

561{
562 if (m_xRadius <= 0 || m_yRadius <= 0) return;
563
569 quint8 **buf; // caches the region's pixel data
570 quint8 **max; // caches the largest values for each column
571
572 max = new quint8* [rect.width() + 2 * m_xRadius];
573 buf = new quint8* [m_yRadius + 1];
574 for (qint32 i = 0; i < m_yRadius + 1; i++) {
575 buf[i] = new quint8[rect.width()];
576 }
577 quint8* buffer = new quint8[(rect.width() + 2 * m_xRadius) *(m_yRadius + 1)];
578 for (qint32 i = 0; i < rect.width() + 2 * m_xRadius; i++) {
579 if (i < m_xRadius)
580 max[i] = buffer;
581 else if (i < rect.width() + m_xRadius)
582 max[i] = &buffer[(m_yRadius + 1) * (i - m_xRadius)];
583 else
584 max[i] = &buffer[(m_yRadius + 1) * (rect.width() + m_xRadius - 1)];
585
586 for (qint32 j = 0; j < m_xRadius + 1; j++)
587 max[i][j] = 0;
588 }
589 /* offset the max pointer by m_xRadius so the range of the array
590 is [-m_xRadius] to [region->w + m_xRadius] */
591 max += m_xRadius;
592
593 quint8* out = new quint8[ rect.width()]; // holds the new scan line we are computing
594
595 qint32* circ = new qint32[ 2 * m_xRadius + 1 ]; // holds the y coords of the filter's mask
597
598 /* offset the circ pointer by m_xRadius so the range of the array
599 is [-m_xRadius] to [m_xRadius] */
600 circ += m_xRadius;
601
602 memset(buf[0], 0, rect.width());
603 for (qint32 i = 0; i < m_yRadius && i < rect.height(); i++) { // load top of image
604 pixelSelection->readBytes(buf[i + 1], rect.x(), rect.y() + i, rect.width(), 1);
605 }
606
607 for (qint32 x = 0; x < rect.width() ; x++) { // set up max for top of image
608 max[x][0] = 0; // buf[0][x] is always 0
609 max[x][1] = buf[1][x]; // MAX (buf[1][x], max[x][0]) always = buf[1][x]
610 for (qint32 j = 2; j < m_yRadius + 1; j++) {
611 max[x][j] = MAX(buf[j][x], max[x][j-1]);
612 }
613 }
614
615 for (qint32 y = 0; y < rect.height(); y++) {
616 rotatePointers(buf, m_yRadius + 1);
617 if (y < rect.height() - (m_yRadius))
618 pixelSelection->readBytes(buf[m_yRadius], rect.x(), rect.y() + y + m_yRadius, rect.width(), 1);
619 else
620 memset(buf[m_yRadius], 0, rect.width());
621 for (qint32 x = 0; x < rect.width(); x++) { /* update max array */
622 for (qint32 i = m_yRadius; i > 0; i--) {
623 max[x][i] = MAX(MAX(max[x][i - 1], buf[i - 1][x]), buf[i][x]);
624 }
625 max[x][0] = buf[0][x];
626 }
627 qint32 last_max = max[0][circ[-1]];
628 qint32 last_index = 1;
629 for (qint32 x = 0; x < rect.width(); x++) { /* render scan line */
630 last_index--;
631 if (last_index >= 0) {
632 if (last_max == 255)
633 out[x] = 255;
634 else {
635 last_max = 0;
636 for (qint32 i = m_xRadius; i >= 0; i--)
637 if (last_max < max[x + i][circ[i]]) {
638 last_max = max[x + i][circ[i]];
639 last_index = i;
640 }
641 out[x] = last_max;
642 }
643 } else {
644 last_index = m_xRadius;
645 last_max = max[x + m_xRadius][circ[m_xRadius]];
646 for (qint32 i = m_xRadius - 1; i >= -m_xRadius; i--)
647 if (last_max < max[x + i][circ[i]]) {
648 last_max = max[x + i][circ[i]];
649 last_index = i;
650 }
651 out[x] = last_max;
652 }
653 }
654 pixelSelection->writeBytes(out, rect.x(), rect.y() + y, rect.width(), 1);
655 }
656 /* undo the offsets to the pointers so we can free the malloced memory */
657 circ -= m_xRadius;
658 max -= m_xRadius;
659
660 delete[] circ;
661 delete[] buffer;
662 delete[] max;
663 for (qint32 i = 0; i < m_yRadius + 1; i++)
664 delete[] buf[i];
665 delete[] buf;
666 delete[] out;
667}
void readBytes(quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h) const
void writeBytes(const quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h)
void rotatePointers(quint8 **p, quint32 n)
void computeBorder(qint32 *circ, qint32 xradius, qint32 yradius)
#define MAX(a, b)
constexpr std::enable_if< sizeof...(values)==0, size_t >::type max()

References KisSelectionFilter::computeBorder(), m_xRadius, m_yRadius, MAX, KisPaintDevice::readBytes(), KisSelectionFilter::rotatePointers(), and KisPaintDevice::writeBytes().

Member Data Documentation

◆ m_xRadius

qint32 KisGrowSelectionFilter::m_xRadius
private

Definition at line 103 of file kis_selection_filters.h.

◆ m_yRadius

qint32 KisGrowSelectionFilter::m_yRadius
private

Definition at line 104 of file kis_selection_filters.h.


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