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

#include <kis_perspectivetransform_worker.h>

Public Types

enum  SampleType { NearestNeighbour = 0 , Bilinear }
 

Public Member Functions

QTransform backwardTransform () const
 
bool forceSubPixelTranslation () const
 
QTransform forwardTransform () const
 
 KisPerspectiveTransformWorker (KisPaintDeviceSP dev, const QTransform &transform, bool cropDst, KoUpdaterPtr progress)
 
 KisPerspectiveTransformWorker (KisPaintDeviceSP dev, QPointF center, double aX, double aY, double distance, bool cropDst, KoUpdaterPtr progress)
 
void run (SampleType sampleType=Bilinear)
 
void runPartialDst (KisPaintDeviceSP srcDev, KisPaintDeviceSP dstDev, const QRect &dstRect)
 
void setForceSubPixelTranslation (bool value)
 
void setForwardTransform (const QTransform &transform)
 
 ~KisPerspectiveTransformWorker ()
 

Private Member Functions

void fillParams (const QRectF &srcRect, const QRect &dstBaseClipRect, KisRegion *dstRegion, QPolygonF *dstClipPolygon)
 
void init (const QTransform &transform)
 
template<class SrcAccessorPolicy >
void runImpl ()
 

Private Attributes

QTransform m_backwardTransform
 
bool m_cropDst
 
KisPaintDeviceSP m_dev
 
KisRegion m_dstRegion
 
bool m_forceSubPixelTranslation {false}
 
QTransform m_forwardTransform
 
bool m_isIdentity
 
bool m_isTranslating
 
KoUpdaterPtr m_progressUpdater
 
QRectF m_srcRect
 

Detailed Description

Definition at line 20 of file kis_perspectivetransform_worker.h.

Member Enumeration Documentation

◆ SampleType

Constructor & Destructor Documentation

◆ KisPerspectiveTransformWorker() [1/2]

KisPerspectiveTransformWorker::KisPerspectiveTransformWorker ( KisPaintDeviceSP dev,
QPointF center,
double aX,
double aY,
double distance,
bool cropDst,
KoUpdaterPtr progress )

Definition at line 36 of file kis_perspectivetransform_worker.cpp.

37 : m_dev(dev), m_progressUpdater(progress), m_cropDst(cropDst)
38
39{
40 QMatrix4x4 m;
41 m.rotate(180. * aX / M_PI, QVector3D(1, 0, 0));
42 m.rotate(180. * aY / M_PI, QVector3D(0, 1, 0));
43
44 QTransform project = m.toTransform(distance);
45 QTransform t = QTransform::fromTranslate(center.x(), center.y());
46
47 QTransform forwardTransform = t.inverted() * project * t;
48
50}
qreal distance(const QPointF &p1, const QPointF &p2)
void init(const QTransform &transform)
#define M_PI
Definition kis_global.h:111

References distance(), forwardTransform(), init(), and M_PI.

◆ KisPerspectiveTransformWorker() [2/2]

KisPerspectiveTransformWorker::KisPerspectiveTransformWorker ( KisPaintDeviceSP dev,
const QTransform & transform,
bool cropDst,
KoUpdaterPtr progress )

Definition at line 52 of file kis_perspectivetransform_worker.cpp.

53 : m_dev(dev), m_progressUpdater(progress), m_cropDst(cropDst)
54{
55 init(transform);
56}

References init().

◆ ~KisPerspectiveTransformWorker()

KisPerspectiveTransformWorker::~KisPerspectiveTransformWorker ( )

Definition at line 100 of file kis_perspectivetransform_worker.cpp.

101{
102}

Member Function Documentation

◆ backwardTransform()

QTransform KisPerspectiveTransformWorker::backwardTransform ( ) const

Definition at line 243 of file kis_perspectivetransform_worker.cpp.

References m_backwardTransform.

◆ fillParams()

void KisPerspectiveTransformWorker::fillParams ( const QRectF & srcRect,
const QRect & dstBaseClipRect,
KisRegion * dstRegion,
QPolygonF * dstClipPolygon )
private

Definition at line 58 of file kis_perspectivetransform_worker.cpp.

62{
63 QPolygonF bounds = srcRect;
64 QPolygonF newBounds = m_forwardTransform.map(bounds);
65
66 QRectF clipRect = dstBaseClipRect;
67
68 if (!m_cropDst) {
69 clipRect |= srcRect;
70 clipRect = KisAlgebra2D::blowRect(clipRect, 3.0);
71 }
72
73 newBounds = newBounds.intersected(clipRect);
74 QPainterPath path;
75 path.addPolygon(newBounds);
76 *dstRegion = KritaUtils::splitPath(path);
77 *dstClipPolygon = newBounds;
78}
#define bounds(x, a, b)
Rect blowRect(const Rect &rect, qreal coeff)
KisRegion splitPath(const QPainterPath &path)

References KisAlgebra2D::blowRect(), bounds, m_cropDst, m_forwardTransform, and KritaUtils::splitPath().

◆ forceSubPixelTranslation()

bool KisPerspectiveTransformWorker::forceSubPixelTranslation ( ) const

◆ forwardTransform()

QTransform KisPerspectiveTransformWorker::forwardTransform ( ) const

Definition at line 238 of file kis_perspectivetransform_worker.cpp.

239{
240 return m_forwardTransform;
241}

References m_forwardTransform.

◆ init()

void KisPerspectiveTransformWorker::init ( const QTransform & transform)
private

Definition at line 80 of file kis_perspectivetransform_worker.cpp.

81{
82 m_isIdentity = transform.isIdentity();
83 m_isTranslating = transform.type() == QTransform::TxTranslate;
84
85 m_forwardTransform = transform;
86 m_backwardTransform = transform.inverted();
87
88 if (m_dev) {
90
91 QPolygonF dstClipPolygonUnused;
92
96 &dstClipPolygonUnused);
97 }
98}
virtual QRect bounds() const =0
QRect exactBounds() const
KisDefaultBoundsBaseSP defaultBounds() const
void fillParams(const QRectF &srcRect, const QRect &dstBaseClipRect, KisRegion *dstRegion, QPolygonF *dstClipPolygon)
T kisGrowRect(const T &rect, U offset)
Definition kis_global.h:186

References KisDefaultBoundsBase::bounds(), KisPaintDevice::defaultBounds(), KisPaintDevice::exactBounds(), fillParams(), kisGrowRect(), m_backwardTransform, m_dev, m_dstRegion, m_forwardTransform, m_isIdentity, m_isTranslating, and m_srcRect.

◆ run()

void KisPerspectiveTransformWorker::run ( SampleType sampleType = Bilinear)

Definition at line 192 of file kis_perspectivetransform_worker.cpp.

193{
194 if (sampleType == Bilinear) {
195 runImpl<BilinearWrapper>();
196 } else {
197 runImpl<NearestNeighbourWrapper>();
198 }
199}

References Bilinear.

◆ runImpl()

template<class SrcAccessorWrapper >
void KisPerspectiveTransformWorker::runImpl ( )
private

Definition at line 147 of file kis_perspectivetransform_worker.cpp.

148{
150
151 if (m_isIdentity) return;
152
153 // TODO: check if this optimization is possible. The only blocking issue might be if
154 // some other thread also accesses this device (which should not be the case,
155 // theoretically
156 //
157 // if (m_isTranslating) {
158 // m_dev->moveTo(m_dev->offset() + QPoint(qRound(m_forwardTransform.dx()), qRound(m_forwardTransform.dy())));
159 // return;
160 // }
161
162 KisPaintDeviceSP cloneDevice = new KisPaintDevice(*m_dev.data());
163
164 // Clear the destination device, since all the tiles are already
165 // shared with cloneDevice
166 m_dev->clear();
167
169
171
172 SrcAccessorWrapper srcAcc(cloneDevice);
174
175 Q_FOREACH (const QRect &rect, m_dstRegion.rects()) {
176 for (int y = rect.y(); y < rect.y() + rect.height(); ++y) {
177 for (int x = rect.x(); x < rect.x() + rect.width(); ++x) {
178
179 QPointF dstPoint(x, y);
180 QPointF srcPoint = m_backwardTransform.map(dstPoint);
181
182 if (m_srcRect.contains(srcPoint)) {
183 accessor->moveTo(dstPoint.x(), dstPoint.y());
184 srcAcc.samplePixel(srcPoint, accessor->rawData());
185 }
186 }
187 }
188 progressHelper.step();
189 }
190}
QPointF dstPoint
virtual quint8 * rawData()=0
virtual void clear()
KisRandomAccessorSP createRandomAccessorNG()
virtual void moveTo(qint32 x, qint32 y)=0
int rectCount() const
QVector< QRect > rects() const
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
#define KIS_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:97

References KisPaintDevice::clear(), KisPaintDevice::createRandomAccessorNG(), KisSharedPtr< T >::data(), dstPoint, KIS_ASSERT_RECOVER_NOOP, KIS_ASSERT_RECOVER_RETURN, m_backwardTransform, m_dev, m_dstRegion, m_isIdentity, m_progressUpdater, m_srcRect, KisRandomConstAccessorNG::moveTo(), KisBaseAccessor::rawData(), KisRegion::rectCount(), KisRegion::rects(), and KisProgressUpdateHelper::step().

◆ runPartialDst()

void KisPerspectiveTransformWorker::runPartialDst ( KisPaintDeviceSP srcDev,
KisPaintDeviceSP dstDev,
const QRect & dstRect )

Definition at line 201 of file kis_perspectivetransform_worker.cpp.

204{
205 KIS_SAFE_ASSERT_RECOVER_RETURN(srcDev->pixelSize() == dstDev->pixelSize());
206 KIS_SAFE_ASSERT_RECOVER_NOOP(*srcDev->colorSpace() == *dstDev->colorSpace());
207
208 QRectF srcClipRect = kisGrowRect(srcDev->exactBounds(), 1) | srcDev->defaultBounds()->imageBorderRect();
209 if (srcClipRect.isEmpty()) return;
210
212 KisPainter gc(dstDev);
213 gc.setCompositeOpId(COMPOSITE_COPY);
214 gc.bitBlt(dstRect.topLeft(), srcDev, m_backwardTransform.mapRect(dstRect));
215 } else {
216 KisProgressUpdateHelper progressHelper(m_progressUpdater, 100, dstRect.height());
217
219 KisRandomAccessorSP accessor = dstDev->createRandomAccessorNG();
220
221 for (int y = dstRect.y(); y < dstRect.y() + dstRect.height(); ++y) {
222 for (int x = dstRect.x(); x < dstRect.x() + dstRect.width(); ++x) {
223
224 QPointF dstPoint(x, y);
225 QPointF srcPoint = m_backwardTransform.map(dstPoint);
226
227 if (srcClipRect.contains(srcPoint) || srcDev->defaultBounds()->wrapAroundMode()) {
228 accessor->moveTo(dstPoint.x(), dstPoint.y());
229 srcAcc->moveTo(srcPoint.x(), srcPoint.y());
230 srcAcc->sampledOldRawData(accessor->rawData());
231 }
232 }
233 progressHelper.step();
234 }
235 }
236}
const QString COMPOSITE_COPY
virtual bool wrapAroundMode() const =0
virtual QRect imageBorderRect() const
quint32 pixelSize() const
const KoColorSpace * colorSpace() const
KisRandomSubAccessorSP createRandomSubAccessor() const
void sampledOldRawData(quint8 *dst)
void moveTo(qreal x, qreal y)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130

References KisPainter::bitBlt(), KisPaintDevice::colorSpace(), COMPOSITE_COPY, KisPaintDevice::createRandomAccessorNG(), KisPaintDevice::createRandomSubAccessor(), KisPaintDevice::defaultBounds(), dstPoint, KisPaintDevice::exactBounds(), KisDefaultBoundsBase::imageBorderRect(), KIS_SAFE_ASSERT_RECOVER_NOOP, KIS_SAFE_ASSERT_RECOVER_RETURN, kisGrowRect(), m_backwardTransform, m_forceSubPixelTranslation, m_isIdentity, m_isTranslating, m_progressUpdater, KisRandomConstAccessorNG::moveTo(), KisRandomSubAccessor::moveTo(), KisPaintDevice::pixelSize(), KisBaseAccessor::rawData(), KisRandomSubAccessor::sampledOldRawData(), KisPainter::setCompositeOpId(), KisProgressUpdateHelper::step(), and KisDefaultBoundsBase::wrapAroundMode().

◆ setForceSubPixelTranslation()

void KisPerspectiveTransformWorker::setForceSubPixelTranslation ( bool value)

Definition at line 253 of file kis_perspectivetransform_worker.cpp.

254{
256}
float value(const T *src, size_t ch)

References m_forceSubPixelTranslation, and value().

◆ setForwardTransform()

void KisPerspectiveTransformWorker::setForwardTransform ( const QTransform & transform)

Definition at line 104 of file kis_perspectivetransform_worker.cpp.

105{
106 init(transform);
107}

References init().

Member Data Documentation

◆ m_backwardTransform

QTransform KisPerspectiveTransformWorker::m_backwardTransform
private

Definition at line 62 of file kis_perspectivetransform_worker.h.

◆ m_cropDst

bool KisPerspectiveTransformWorker::m_cropDst
private

Definition at line 66 of file kis_perspectivetransform_worker.h.

◆ m_dev

KisPaintDeviceSP KisPerspectiveTransformWorker::m_dev
private

Definition at line 58 of file kis_perspectivetransform_worker.h.

◆ m_dstRegion

KisRegion KisPerspectiveTransformWorker::m_dstRegion
private

Definition at line 60 of file kis_perspectivetransform_worker.h.

◆ m_forceSubPixelTranslation

bool KisPerspectiveTransformWorker::m_forceSubPixelTranslation {false}
private

Definition at line 67 of file kis_perspectivetransform_worker.h.

67{false};

◆ m_forwardTransform

QTransform KisPerspectiveTransformWorker::m_forwardTransform
private

Definition at line 63 of file kis_perspectivetransform_worker.h.

◆ m_isIdentity

bool KisPerspectiveTransformWorker::m_isIdentity
private

Definition at line 64 of file kis_perspectivetransform_worker.h.

◆ m_isTranslating

bool KisPerspectiveTransformWorker::m_isTranslating
private

Definition at line 65 of file kis_perspectivetransform_worker.h.

◆ m_progressUpdater

KoUpdaterPtr KisPerspectiveTransformWorker::m_progressUpdater
private

Definition at line 59 of file kis_perspectivetransform_worker.h.

◆ m_srcRect

QRectF KisPerspectiveTransformWorker::m_srcRect
private

Definition at line 61 of file kis_perspectivetransform_worker.h.


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