Krita Source Code Documentation
Loading...
Searching...
No Matches
GridIterationTools::PaintDevicePolygonOp Struct Reference

#include <kis_grid_interpolation_tools.h>

Public Member Functions

void operator() (const QPolygonF &srcPolygon, const QPolygonF &dstPolygon)
 
void operator() (const QPolygonF &srcPolygon, const QPolygonF &dstPolygon, const QPolygonF &clipDstPolygon)
 
 PaintDevicePolygonOp (KisPaintDeviceSP srcDev, KisPaintDeviceSP dstDev)
 

Public Attributes

KisPaintDeviceSP m_dstDev
 
KisPaintDeviceSP m_srcDev
 

Detailed Description

Definition at line 165 of file kis_grid_interpolation_tools.h.

Constructor & Destructor Documentation

◆ PaintDevicePolygonOp()

GridIterationTools::PaintDevicePolygonOp::PaintDevicePolygonOp ( KisPaintDeviceSP srcDev,
KisPaintDeviceSP dstDev )
inline

Member Function Documentation

◆ operator()() [1/2]

void GridIterationTools::PaintDevicePolygonOp::operator() ( const QPolygonF & srcPolygon,
const QPolygonF & dstPolygon )
inline

Definition at line 170 of file kis_grid_interpolation_tools.h.

170 {
171 this->operator() (srcPolygon, dstPolygon, dstPolygon);
172 }
void operator()(const QPolygonF &srcPolygon, const QPolygonF &dstPolygon)

References operator()().

◆ operator()() [2/2]

void GridIterationTools::PaintDevicePolygonOp::operator() ( const QPolygonF & srcPolygon,
const QPolygonF & dstPolygon,
const QPolygonF & clipDstPolygon )
inline

We need to make sure that the destination polygon is not too small, otherwise even small rounding will send the src-accessor into infinity

Definition at line 174 of file kis_grid_interpolation_tools.h.

174 {
175 QRect boundRect = clipDstPolygon.boundingRect().toAlignedRect();
176 if (boundRect.isEmpty()) return;
177
178 KisSequentialIterator dstIt(m_dstDev, boundRect);
180
181 KisFourPointInterpolatorBackward interp(srcPolygon, dstPolygon);
182
188 if (interp.isValid(0.1)) {
189 int y = boundRect.top();
190 interp.setY(y);
191
192 while (dstIt.nextPixel()) {
193 int newY = dstIt.y();
194
195 if (y != newY) {
196 y = newY;
197 interp.setY(y);
198 }
199
200 QPointF srcPoint(dstIt.x(), y);
201
202 if (clipDstPolygon.containsPoint(srcPoint, Qt::OddEvenFill)) {
203
204 interp.setX(srcPoint.x());
205 QPointF dstPoint = interp.getValue();
206
207 // brain-blowing part:
208 //
209 // since the interpolator does the inverted
210 // transformation we read data from "dstPoint"
211 // (which is non-transformed) and write it into
212 // "srcPoint" (which is transformed position)
213
214 srcAcc->moveTo(dstPoint);
215 srcAcc->sampledOldRawData(dstIt.rawData());
216 }
217 }
218
219 } else {
220 srcAcc->moveTo(interp.fallbackSourcePoint());
221
222 while (dstIt.nextPixel()) {
223 QPointF srcPoint(dstIt.x(), dstIt.y());
224
225 if (clipDstPolygon.containsPoint(srcPoint, Qt::OddEvenFill)) {
226 srcAcc->sampledOldRawData(dstIt.rawData());
227 }
228 }
229 }
230
231 }
QPointF dstPoint
KisRandomSubAccessorSP createRandomSubAccessor() const
void sampledOldRawData(quint8 *dst)
void moveTo(qreal x, qreal y)
qreal interp(qreal r, qreal a, qreal b)
private functions

References KisPaintDevice::createRandomSubAccessor(), dstPoint, interp(), m_dstDev, m_srcDev, KisRandomSubAccessor::moveTo(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixel(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawData(), KisRandomSubAccessor::sampledOldRawData(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::x(), and KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::y().

Member Data Documentation

◆ m_dstDev

KisPaintDeviceSP GridIterationTools::PaintDevicePolygonOp::m_dstDev

Definition at line 234 of file kis_grid_interpolation_tools.h.

◆ m_srcDev

KisPaintDeviceSP GridIterationTools::PaintDevicePolygonOp::m_srcDev

Definition at line 233 of file kis_grid_interpolation_tools.h.


The documentation for this struct was generated from the following file: