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

#include <waveletdecompose.h>

+ Inheritance diagram for WaveletDecompose:

Public Member Functions

 WaveletDecompose (QObject *parent, const QVariantList &)
 
 ~WaveletDecompose () override
 
- Public Member Functions inherited from KisActionPlugin
 KisActionPlugin (QObject *parent=0)
 
 ~KisActionPlugin () override
 

Private Slots

void slotWaveletDecompose ()
 

Additional Inherited Members

- Protected Member Functions inherited from KisActionPlugin
void addAction (const QString &name, KisAction *action)
 
void addOperation (KisOperation *operation)
 
void addUIFactory (KisOperationUIFactory *factory)
 
KisActioncreateAction (const QString &name)
 
QPointer< KisViewManagerviewManager () const
 

Detailed Description

Definition at line 14 of file waveletdecompose.h.

Constructor & Destructor Documentation

◆ WaveletDecompose()

WaveletDecompose::WaveletDecompose ( QObject * parent,
const QVariantList &  )

Definition at line 45 of file waveletdecompose.cpp.

46 : KisActionPlugin(parent)
47{
48 KisAction *action = createAction("waveletdecompose");
49 connect(action, SIGNAL(triggered()), this, SLOT(slotWaveletDecompose()));
50}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisAction * createAction(const QString &name)
KisActionPlugin(QObject *parent=0)

References connect().

◆ ~WaveletDecompose()

WaveletDecompose::~WaveletDecompose ( )
override

Definition at line 52 of file waveletdecompose.cpp.

53{
54}

Member Function Documentation

◆ slotWaveletDecompose

void WaveletDecompose::slotWaveletDecompose ( )
privateslot

Definition at line 56 of file waveletdecompose.cpp.

57{
58 DlgWaveletDecompose dlg(viewManager()->mainWindowAsQWidget(), "WaveletDecompose");
59
60 if (dlg.exec() == QDialog::Accepted) {
61
62 KisCursorOverrideLock cursorLock(Qt::WaitCursor);
63
64 QPointer<KoUpdater> updater = viewManager()->createUnthreadedUpdater(i18n("Wavelet Decompose"));
65
66 KisImageSP image = viewManager()->image();
67 if (!image) return;
68
69 if (!viewManager()->blockUntilOperationsFinished(image)) return;
70
71 image->barrierLock();
72
73 KisPaintDeviceSP projection = new KisPaintDevice(*(image->projection()));
74 if (!projection) return;
75
76 const KoColorSpace *cs = projection->colorSpace();
77
79
80 int scales = dlg.scales();
81
83 const QBitArray flags(0);
84
85 QRect rc = image->bounds();
86
87 KisPaintDeviceSP original = projection;
88
89 //main loop
90 for(int level = 0; level < scales; ++level){
91
92 //copy original
93 KisPaintDeviceSP blur = new KisPaintDevice(*original);
94
95 //blur it
96 KisWaveletKernel::applyWavelet(blur, rc, 1 << level, 1 << level, flags, 0);
97
98 //do grain extract blur from original
99 KisPainter painter(original);
100 painter.setCompositeOpId(op);
101 painter.bitBlt(0, 0, blur, 0, 0, rc.width(), rc.height());
102 painter.end();
103
104 //original is new scale and blur is new original
105 results << original;
106 original = blur;
107 updater->setProgress((level * 100) / scales);
108 }
109 //add new layers
110 KisUndoAdapter *undo = image->undoAdapter();
111 undo->beginMacro(kundo2_i18n("Wavelet decompose"));
112
114
115 KisGroupLayerSP baseGroup = image->rootLayer();
116
117 //add layer group
118 KisGroupLayerSP grp = new KisGroupLayer(image, i18n("Wavelet decompose"), OPACITY_OPAQUE_U8);
119 adapter.addNode(grp, baseGroup, baseGroup->lastChild());
120 baseGroup = grp;
121
122 //add scales
123 int i = 1;
125 Q_FOREACH (const KisPaintDeviceSP &l, results) {
126 KisPaintLayerSP paintLayer = new KisPaintLayer(image, QStringLiteral("Scale %1").arg(i), OPACITY_OPAQUE_U8, l);
127 adapter.addNode(paintLayer, baseGroup, 0);
128 adapter.setCompositeOp(paintLayer, op2);
129 ++i;
130 }
131
132 //add residual
133 KisPaintLayerSP paintLayer = new KisPaintLayer(image, "Residual", OPACITY_OPAQUE_U8, original);
134 adapter.addNode(paintLayer, baseGroup, 0);
135
136 undo->endMacro();
137 updater->setProgress(100);
138 image->unlock();
139 }
140}
const quint8 OPACITY_OPAQUE_U8
const QString COMPOSITE_GRAIN_MERGE
const QString COMPOSITE_GRAIN_EXTRACT
QPointer< KisViewManager > viewManager() const
KisUndoAdapter * undoAdapter() const
KisGroupLayerSP rootLayer() const
void unlock()
Definition kis_image.cc:805
void barrierLock(bool readOnly=false)
Wait until all the queued background jobs are completed and lock the image.
Definition kis_image.cc:756
KisPaintDeviceSP projection() const
QRect bounds() const override
const KoColorSpace * colorSpace() const
static void applyWavelet(KisPaintDeviceSP device, const QRect &rect, qreal xRadius, qreal yRadius, const QBitArray &channelFlags, KoUpdater *updater)
const KoCompositeOp * compositeOp(const QString &id, const KoColorSpace *srcSpace=nullptr) const
KUndo2MagicString kundo2_i18n(const char *text)
QAction * undo(const QObject *recvr, const char *slot, QObject *parent)
KisNodeSP lastChild() const
Definition kis_node.cpp:367

References KisNodeCommandsAdapter::addNode(), KisWaveletKernel::applyWavelet(), KisImage::barrierLock(), KisPainter::bitBlt(), KisImage::bounds(), KisPaintDevice::colorSpace(), COMPOSITE_GRAIN_EXTRACT, COMPOSITE_GRAIN_MERGE, KoColorSpace::compositeOp(), KisPainter::end(), kundo2_i18n(), KisNode::lastChild(), OPACITY_OPAQUE_U8, KisImage::projection(), KisImage::rootLayer(), DlgWaveletDecompose::scales(), KisNodeCommandsAdapter::setCompositeOp(), KisPainter::setCompositeOpId(), KisImage::undoAdapter(), KisImage::unlock(), and KisActionPlugin::viewManager().


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