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

#include <kis_transform_worker.h>

Public Member Functions

bool forceSubPixelTranslation () const
 
 KisTransformWorker (KisPaintDeviceSP dev, double xscale, double yscale, double xshear, double yshear, double rotation, qreal xtranslate, qreal ytranslate, KoUpdaterPtr progress, KisFilterStrategy *filter)
 
bool run ()
 
bool runPartial (const QRect &processRect)
 
void setForceSubPixelTranslation (bool value)
 
QTransform transform () const
 
void transformPixelSelectionOutline (KisPixelSelectionSP pixelSelection) const
 
 ~KisTransformWorker ()
 

Static Public Member Functions

static void mirror (KisPaintDeviceSP dev, qreal axis, Qt::Orientation orientation)
 
static void mirrorX (KisPaintDeviceSP dev)
 
static void mirrorX (KisPaintDeviceSP dev, qreal axis)
 
static void mirrorY (KisPaintDeviceSP dev)
 
static void mirrorY (KisPaintDeviceSP dev, qreal axis)
 
static void offset (KisPaintDeviceSP device, const QPoint &offsetPosition, const QRect &wrapRect)
 

Private Member Functions

template<class T >
void transformPass (KisPaintDevice *src, KisPaintDevice *dst, double xscale, double shear, double dx, KisFilterStrategy *filterStrategy, int portion)
 

Static Private Member Functions

static QRect rotate180 (KisPaintDeviceSP dev, QRect boundRect, KoUpdaterPtr progressUpdater, int portion)
 
static QRect rotateLeft90 (KisPaintDeviceSP dev, QRect boundRect, KoUpdaterPtr progressUpdater, int portion)
 
static QRect rotateRight90 (KisPaintDeviceSP dev, QRect boundRect, KoUpdaterPtr progressUpdater, int portion)
 

Private Attributes

QRect m_boundRect
 
KisPaintDeviceSP m_dev
 
KisFilterStrategym_filter
 
bool m_forceSubPixelTranslation {false}
 
KoUpdaterPtr m_progressUpdater
 
double m_rotation
 
double m_xscale
 
double m_xshear
 
double m_xshearOrigin
 
qreal m_xtranslate
 
double m_yscale
 
double m_yshear
 
double m_yshearOrigin
 
qreal m_ytranslate
 

Friends

class KisTransformWorkerTest
 

Detailed Description

Definition at line 22 of file kis_transform_worker.h.

Constructor & Destructor Documentation

◆ KisTransformWorker()

KisTransformWorker::KisTransformWorker ( KisPaintDeviceSP dev,
double xscale,
double yscale,
double xshear,
double yshear,
double rotation,
qreal xtranslate,
qreal ytranslate,
KoUpdaterPtr progress,
KisFilterStrategy * filter )

Definition at line 35 of file kis_transform_worker.cc.

42{
43 m_dev = dev;
44 m_xscale = xscale;
45 m_yscale = yscale;
46 m_xshear = xshear;
47 m_yshear = yshear;
48 m_rotation = rotation,
49 m_xtranslate = xtranslate;
50 m_ytranslate = ytranslate;
51 m_progressUpdater = progress;
52 m_filter = filter;
53}
KisFilterStrategy * m_filter

References m_dev, m_filter, m_progressUpdater, m_rotation, m_xscale, m_xshear, m_xtranslate, m_yscale, m_yshear, and m_ytranslate.

◆ ~KisTransformWorker()

KisTransformWorker::~KisTransformWorker ( )

Definition at line 55 of file kis_transform_worker.cc.

56{
57}

Member Function Documentation

◆ forceSubPixelTranslation()

bool KisTransformWorker::forceSubPixelTranslation ( ) const

Definition at line 143 of file kis_transform_worker.cc.

144{
146}

References m_forceSubPixelTranslation.

◆ mirror()

void KisTransformWorker::mirror ( KisPaintDeviceSP dev,
qreal axis,
Qt::Orientation orientation )
static

Mirror the specified device along the X or Y axis at the coordinate axis.

Definition at line 639 of file kis_transform_worker.cc.

640{
641 mirror_impl(dev, axis, orientation == Qt::Horizontal);
642}
void mirror_impl(KisPaintDeviceSP dev, qreal axis, bool isHorizontal)

References mirror_impl().

◆ mirrorX() [1/2]

void KisTransformWorker::mirrorX ( KisPaintDeviceSP dev)
static

Mirror the device relative to the center of its exactBounds()

Definition at line 627 of file kis_transform_worker.cc.

628{
629 QRect bounds = dev->exactBounds();
630 mirrorX(dev, bounds.x() + 0.5 * bounds.width());
631}
QRect exactBounds() const
static void mirrorX(KisPaintDeviceSP dev, qreal axis)
#define bounds(x, a, b)

References bounds, KisPaintDevice::exactBounds(), and mirrorX().

◆ mirrorX() [2/2]

void KisTransformWorker::mirrorX ( KisPaintDeviceSP dev,
qreal axis )
static

Convenience methods for mirror(dev, axis, orientation)

Definition at line 617 of file kis_transform_worker.cc.

618{
619 mirror_impl(dev, axis, true);
620}

References mirror_impl().

◆ mirrorY() [1/2]

void KisTransformWorker::mirrorY ( KisPaintDeviceSP dev)
static

Definition at line 633 of file kis_transform_worker.cc.

634{
635 QRect bounds = dev->exactBounds();
636 mirrorY(dev, bounds.y() + 0.5 * bounds.height());
637}
static void mirrorY(KisPaintDeviceSP dev, qreal axis)

References bounds, KisPaintDevice::exactBounds(), and mirrorY().

◆ mirrorY() [2/2]

void KisTransformWorker::mirrorY ( KisPaintDeviceSP dev,
qreal axis )
static

Definition at line 622 of file kis_transform_worker.cc.

623{
624 mirror_impl(dev, axis, false);
625}

References mirror_impl().

◆ offset()

void KisTransformWorker::offset ( KisPaintDeviceSP device,
const QPoint & offsetPosition,
const QRect & wrapRect )
static

Offset the specified device with wrapping around edges of rect specified as QRect(0,0,wrapSize.width, wrapSize.height)*

Parameters
devicedevice to be offset
offsetPositionposition where the new origin will be
wrapRectwidth and height of the wrap edge, usual scenario is to use canvas width&height

Definition at line 644 of file kis_transform_worker.cc.

645{
646 Q_ASSERT(wrapRect == wrapRect.normalized());
647
648 // inspired by gimp offset code, only wrap mode supported
649 int sx = wrapRect.x();
650 int sy = wrapRect.y();
651
652 int width = wrapRect.width();
653 int height = wrapRect.height();
654
655 // offset coords are relative to space wrapRect
656 int offsetX = offsetPosition.x();
657 int offsetY = offsetPosition.y();
658
659 while (offsetX < 0)
660 {
661 offsetX += width;
662 }
663
664 while (offsetY < 0)
665 {
666 offsetY += height;
667 }
668
669 if ((offsetX == 0) && (offsetY == 0))
670 {
671 return;
672 }
673
674 KisPaintDeviceSP offsetDevice = new KisPaintDevice(device->colorSpace());
675
676 int srcX = 0;
677 int srcY = 0;
678
679 int destX = offsetX;
680 int destY = offsetY;
681
682 width = qBound<int>(0, width - offsetX, width);
683 height = qBound<int>(0, height - offsetY, height);
684
685 if ((width != 0) && (height != 0)) {
686 // convert back to paint device space
687 KisPainter::copyAreaOptimized(QPoint(destX + sx, destY + sy), device, offsetDevice, QRect(srcX + sx, srcY + sy, width, height));
688 }
689
690 srcX = wrapRect.width() - offsetX;
691 srcY = wrapRect.height() - offsetY;
692
693 destX = (srcX + offsetX) % wrapRect.width();
694 destY = (srcY + offsetY) % wrapRect.height();
695
696 if (offsetX != 0 && offsetY != 0) {
697 KisPainter::copyAreaOptimized(QPoint(destX + sx, destY + sy), device, offsetDevice, QRect(srcX + sx, srcY + sy, offsetX, offsetY));
698 }
699
700 if (offsetX != 0) {
701 KisPainter::copyAreaOptimized(QPoint(destX + sx, (destY + offsetY) + sy), device, offsetDevice, QRect(srcX + sx, 0 + sy, offsetX, wrapRect.height() - offsetY));
702 }
703
704 if (offsetY != 0) {
705 KisPainter::copyAreaOptimized(QPoint((destX + offsetX) + sx, destY + sy), device, offsetDevice, QRect(0 + sx, srcY + sy, wrapRect.width() - offsetX, offsetY));
706 }
707
708 // bitblt the result back
709 QRect resultRect(sx, sy, wrapRect.width(), wrapRect.height());
710 KisPainter::copyAreaOptimized(resultRect.topLeft(), offsetDevice, device, resultRect);
711}
const KoColorSpace * colorSpace() const
static void copyAreaOptimized(const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &originalSrcRect)

References KisPaintDevice::colorSpace(), and KisPainter::copyAreaOptimized().

◆ rotate180()

QRect KisTransformWorker::rotate180 ( KisPaintDeviceSP dev,
QRect boundRect,
KoUpdaterPtr progressUpdater,
int portion )
staticprivate

Definition at line 133 of file kis_transform_worker.cc.

137{
138 QRect r = rotateWithTf(180, dev, boundRect, progressUpdater, portion);
139 dev->moveTo(dev->x() - 1, dev->y() -1);
140 return QRect(- r.x() - r.width(), - r.top() - r.height(), r.width(), r.height());
141}
void moveTo(qint32 x, qint32 y)
QRect rotateWithTf(int rotation, KisPaintDeviceSP dev, QRect boundRect, KoUpdaterPtr progressUpdater, int portion)

References KisPaintDevice::moveTo(), rotateWithTf(), KisPaintDevice::x(), and KisPaintDevice::y().

◆ rotateLeft90()

QRect KisTransformWorker::rotateLeft90 ( KisPaintDeviceSP dev,
QRect boundRect,
KoUpdaterPtr progressUpdater,
int portion )
staticprivate

Definition at line 123 of file kis_transform_worker.cc.

127{
128 QRect r = rotateWithTf(270, dev, boundRect, progressUpdater, portion);
129 dev->moveTo(dev->x(), dev->y() - 1);
130 return QRect(r.top(), - r.x() - r.width(), r.height(), r.width());
131}

References KisPaintDevice::moveTo(), rotateWithTf(), KisPaintDevice::x(), and KisPaintDevice::y().

◆ rotateRight90()

QRect KisTransformWorker::rotateRight90 ( KisPaintDeviceSP dev,
QRect boundRect,
KoUpdaterPtr progressUpdater,
int portion )
staticprivate

Definition at line 113 of file kis_transform_worker.cc.

117{
118 QRect r = rotateWithTf(90, dev, boundRect, progressUpdater, portion);
119 dev->moveTo(dev->x() - 1, dev->y());
120 return QRect(- r.top() - r.height(), r.x(), r.height(), r.width());
121}

References KisPaintDevice::moveTo(), rotateWithTf(), KisPaintDevice::x(), and KisPaintDevice::y().

◆ run()

bool KisTransformWorker::run ( )

Definition at line 229 of file kis_transform_worker.cc.

230{
231 return runPartial(m_dev->exactBounds());
232}
bool runPartial(const QRect &processRect)

References KisPaintDevice::exactBounds(), m_dev, and runPartial().

◆ runPartial()

bool KisTransformWorker::runPartial ( const QRect & processRect)

We don't check for xtranslate and ytranslate to be integers here, because people expect the translation to be lossless, that is, not doing any resampling.

Theoretically, we could implement a separate option to allow translations with resampling in the transform tool, but I don't know how useful it would be. People who wo pixel art can set scale to something like 99.99% and it should do the trick.

See: https://bugs.kde.org/show_bug.cgi?id=445714

Pre-rotate the image to ensure the actual resampling is done for an angle -pi/4...pi/4. This is faster and produces better quality.

First X-pass, then Y-pass | a 0 0 | | 1 d 0 | m = | b 1 0 | x | 0 e 0 | (matrices are in Qt's notation) | c 0 1 | | 0 f 1 |

Purge the tiles which might be left after scaling down the image

Definition at line 234 of file kis_transform_worker.cc.

235{
236 /* Check for nonsense and let the user know, this helps debugging.
237 Otherwise the program will crash at a later point, in a very obscure way, probably by division by zero */
238 /* Note that because KisFilterWeightsBuffer uses KisFixedPoint, we need to check the fixed point as well
239 * since it has different precision than qreal or double */
240 KisFixedPoint m_xscale_fixedPoint = KisFixedPoint(m_xscale);
241 KisFixedPoint m_yscale_fixedPoint = KisFixedPoint(m_yscale);
242 Q_ASSERT_X(m_xscale != 0 && m_xscale_fixedPoint != 0, "KisTransformer::run() validation step", "xscale == 0");
243 Q_ASSERT_X(m_yscale != 0 && m_yscale_fixedPoint != 0, "KisTransformer::run() validation step", "yscale == 0");
244
245 // Fallback safety line in case Krita is compiled without ASSERTS
246 if (m_xscale == 0 || m_yscale == 0 || m_xscale_fixedPoint == 0 || m_yscale_fixedPoint == 0) return false;
247
248 m_boundRect = processRect;
249
250 if (m_boundRect.isNull()) {
251 if (!m_progressUpdater.isNull()) {
252 m_progressUpdater->setProgress(100);
253 }
254 return true;
255 }
256
257 double xscale = m_xscale;
258 double yscale = m_yscale;
259 double rotation = m_rotation;
260 qreal xtranslate = m_xtranslate;
261 qreal ytranslate = m_ytranslate;
262
263 // Apply shearX/Y separately. In Krita it is demanded separately
264 // most of the times.
265 if (m_xshear != 0 || m_yshear != 0) {
266 int portion = 50;
267
268 bool scalePresent = !(qFuzzyCompare(xscale, 1.0) && qFuzzyCompare(yscale, 1.0));
269 bool xShearPresent = !qFuzzyCompare(m_xshear, 0.0);
270 bool yShearPresent = !qFuzzyCompare(m_yshear, 0.0);
271
272 if (scalePresent || (xShearPresent && yShearPresent)) {
273 transformPass <KisHLineIteratorSP>(m_dev.data(), m_dev.data(), xscale, yscale * m_xshear, 0, m_filter, portion);
274 transformPass <KisVLineIteratorSP>(m_dev.data(), m_dev.data(), yscale, m_yshear, 0, m_filter, portion);
275 } else if (xShearPresent) {
276 transformPass <KisHLineIteratorSP>(m_dev.data(), m_dev.data(), xscale, m_xshear, 0, m_filter, portion);
277 } else if (yShearPresent) {
278 transformPass <KisVLineIteratorSP>(m_dev.data(), m_dev.data(), yscale, m_yshear, 0, m_filter, portion);
279 }
280
281 yscale = 1.;
282 xscale = 1.;
283 }
284
285 if (rotation < 0.0) {
286 rotation = -fmod(-rotation, 2 * M_PI) + 2 * M_PI;
287 } else {
288 rotation = fmod(rotation, 2 * M_PI);
289 }
290
291 int rotQuadrant = int(rotation / (M_PI / 2) + 0.5) & 3;
292 rotation -= rotQuadrant * M_PI / 2;
293
294
306 const bool simpleTransform =
308 (qFuzzyCompare(rotation, 0.0)) &&
309 (qFuzzyCompare(xscale, 1.0) ||
310 qFuzzyCompare(xscale, -1.0)) &&
311 (qFuzzyCompare(yscale, 1.0) ||
312 qFuzzyCompare(yscale, -1.0));
313
314
315 int progressTotalSteps = qMax(1, 2 * (!simpleTransform) + (rotQuadrant != 0));
316 int progressPortion = 100 / progressTotalSteps;
317
323 switch (rotQuadrant) {
324 case 1:
325 swapValues(&xscale, &yscale);
327 break;
328 case 2:
330 break;
331 case 3:
332 swapValues(&xscale, &yscale);
334 break;
335 default:
336 /* do nothing */
337 break;
338 }
339
340 if (simpleTransform) {
341
342 // Flipping horizontally
343 if (qFuzzyCompare(xscale, -1.0)) {
344 QRect bounds = m_dev->exactBounds();
345 double center_x = bounds.topLeft().x() + bounds.width() / 2.0;
346 xtranslate -= 2 * center_x;
347 mirrorX(m_dev);
348 }
349
350 // Flipping vertically
351 if (qFuzzyCompare(yscale, -1.0)) {
352 QRect bounds = m_dev->exactBounds();
353 double center_y = bounds.topLeft().y() + bounds.height() / 2.0;
354 ytranslate -= 2 * center_y;
355 mirrorY(m_dev);
356 }
357
358 // Simple translation
359 const int intXTranslate = qRound(xtranslate);
360 const int intYTranslate = qRound(ytranslate);
361
362 m_boundRect.translate(intXTranslate, intYTranslate);
363 m_dev->moveTo(m_dev->x() + intXTranslate, m_dev->y() + intYTranslate);
364
365 } else {
366 QTransform SC = QTransform::fromScale(xscale, yscale);
367 QTransform R; R.rotateRadians(rotation);
368 QTransform T = QTransform::fromTranslate(xtranslate, ytranslate);
369 QTransform m = SC * R * T;
370
377 qreal a = m.m11();
378 qreal b = m.m21();
379 qreal c = m.m31();
380 qreal d = m.m12() / m.m11();
381 qreal e = m.m22() - m.m21() * m.m12() / m.m11();
382 qreal f = m.m32() - m.m31() * m.m12() / m.m11();
383
384 // First Pass (X)
385 transformPass <KisHLineIteratorSP>(m_dev.data(), m_dev.data(), a, b, c, m_filter, progressPortion);
386
387 // Second Pass (Y)
388 transformPass <KisVLineIteratorSP>(m_dev.data(), m_dev.data(), e, d, f, m_filter, progressPortion);
389
390#if 0
391 /************************************************************/
398 qreal a = m.m11() - m.m21() * m.m12() / m.m22();
399 qreal b = m.m21() / m.m22();
400 qreal c = m.m31() - m.m21() * m.m32() / m.m22();
401 qreal d = m.m12();
402 qreal e = m.m22();
403 qreal f = m.m32();
404 // First Pass (X)
405 transformPass <KisHLineIteratorSP>(m_dev.data(), m_dev.data(), a, b, c, m_filter, progressPortion);
406 // Second Pass (Y)
407 transformPass <KisVLineIteratorSP>(m_dev.data(), m_dev.data(), e, d, f, m_filter, progressPortion);
408 /************************************************************/
409#endif /* 0 */
410
411#if 0
412 /************************************************************/
413 // Old three-pass implementation (for testing purposes)
414 yshear = sin(rotation);
415 xshear = -tan(rotation / 2);
416 xtranslate -= int(xshear * ytranslate);
417
418 transformPass <KisHLineIteratorSP>(m_dev.data(), m_dev.data(), xscale, yscale*xshear, 0, m_filter, 0);
419 transformPass <KisVLineIteratorSP>(m_dev.data(), m_dev.data(), yscale, yshear, ytranslate, m_filter, 0);
420 if (xshear != 0.0) {
421 transformPass <KisHLineIteratorSP>(m_dev.data(), m_dev.data(), 1.0, xshear, xtranslate, m_filter, 0);
422 } else {
423 m_dev->move(m_dev->x() + xtranslate, m_dev->y());
425 }
426 /************************************************************/
427#endif /* 0 */
428
429 }
430
431 if (!m_progressUpdater.isNull()) {
432 m_progressUpdater->setProgress(100);
433 }
434
440
441 return true;
442}
Eigen::Matrix< double, 4, 2 > R
static QRect rotate180(KisPaintDeviceSP dev, QRect boundRect, KoUpdaterPtr progressUpdater, int portion)
static QRect rotateRight90(KisPaintDeviceSP dev, QRect boundRect, KoUpdaterPtr progressUpdater, int portion)
static QRect rotateLeft90(KisPaintDeviceSP dev, QRect boundRect, KoUpdaterPtr progressUpdater, int portion)
static bool qFuzzyCompare(half p1, half p2)
#define M_PI
Definition kis_global.h:111
void swapValues(T *a, T *b)
void updateBounds< KisHLineIteratorSP >(QRect &boundRect, const KisFilterWeightsApplicator::LinePos &newBounds)

References bounds, KisSharedPtr< T >::data(), KisPaintDevice::exactBounds(), m_boundRect, m_dev, m_filter, m_forceSubPixelTranslation, M_PI, m_progressUpdater, m_rotation, m_xscale, m_xshear, m_xtranslate, m_yscale, m_yshear, m_ytranslate, mirrorX(), mirrorY(), KisPaintDevice::moveTo(), KisPaintDevice::purgeDefaultPixels(), qFuzzyCompare(), R, rotate180(), rotateLeft90(), rotateRight90(), swapValues(), updateBounds< KisHLineIteratorSP >(), KisPaintDevice::x(), and KisPaintDevice::y().

◆ setForceSubPixelTranslation()

void KisTransformWorker::setForceSubPixelTranslation ( bool value)

Definition at line 148 of file kis_transform_worker.cc.

149{
151}
float value(const T *src, size_t ch)

References m_forceSubPixelTranslation, and value().

◆ transform()

QTransform KisTransformWorker::transform ( ) const

Returns a matrix of the transformation executed by the worker. Resulting transformation has the following form (in Qt's matrix notation (all the matrices are transposed)):

transform = SC * S * R * T

,where: SC - scale S - shear itself (shearX * shearY) R - rotation (rotation parameter) T - translation (xtranslate, ytranslate)

WARNING: due to some rounding problems in the worker the work it does not correspond to the matrix exactly! The result always differs 1-3 pixel. So be careful with it (or fix it)

Definition at line 59 of file kis_transform_worker.cc.

60{
61 QTransform SC = QTransform::fromScale(m_xscale, m_yscale);
62 QTransform S; S.shear(0, m_yshear); S.shear(m_xshear, 0);
63 QTransform R; R.rotateRadians(m_rotation);
64 QTransform T = QTransform::fromTranslate(m_xtranslate, m_ytranslate);
65
66 return SC * S * R * T;
67}
Eigen::Matrix< double, 4, 2 > S

References m_rotation, m_xscale, m_xshear, m_xtranslate, m_yscale, m_yshear, m_ytranslate, R, and S.

◆ transformPass()

template<class T >
void KisTransformWorker::transformPass ( KisPaintDevice * src,
KisPaintDevice * dst,
double xscale,
double shear,
double dx,
KisFilterStrategy * filterStrategy,
int portion )
private

Definition at line 193 of file kis_transform_worker.cc.

197{
198 bool clampToEdge = shear == 0.0;
199
200 qint32 srcStart, srcLen, firstLine, numLines;
201 calcDimensions<T>(m_boundRect, srcStart, srcLen, firstLine, numLines);
202
203 KisProgressUpdateHelper progressHelper(m_progressUpdater, portion, numLines);
204 KisFilterWeightsBuffer buf(filterStrategy, qAbs(floatscale));
205 KisFilterWeightsApplicator applicator(src, dst, floatscale, shear, dx, clampToEdge);
206
208
209 for (int i = firstLine; i < firstLine + numLines; i++) {
211 KisFilterWeightsApplicator::LinePos srcPos(srcStart, srcLen);
212
213 dstPos = applicator.processLine<T>(srcPos, i, &buf, filterStrategy->support(buf.weightsPositionScale().toFloat()));
214 dstBounds.unite(dstPos);
215
216 progressHelper.step();
217 }
218
219 updateBounds<T>(m_boundRect, dstBounds);
220}
virtual qreal support(qreal weightsPositionScale)

References m_boundRect, m_progressUpdater, KisFilterWeightsApplicator::processLine(), KisProgressUpdateHelper::step(), KisFilterStrategy::support(), and KisFilterWeightsApplicator::LinePos::unite().

◆ transformPixelSelectionOutline()

void KisTransformWorker::transformPixelSelectionOutline ( KisPixelSelectionSP pixelSelection) const

Transforms the outline of the pixel selection (if it is valid)

Definition at line 69 of file kis_transform_worker.cc.

70{
71 if (pixelSelection->outlineCacheValid()) {
72 QPainterPath outlineCache = pixelSelection->outlineCache();
73 pixelSelection->setOutlineCache(transform().map(outlineCache));
74 }
75}
QTransform transform() const
void setOutlineCache(const QPainterPath &cache)

References KisPixelSelection::outlineCache, KisPixelSelection::outlineCacheValid, KisPixelSelection::setOutlineCache(), and transform().

Friends And Related Symbol Documentation

◆ KisTransformWorkerTest

friend class KisTransformWorkerTest
friend

Definition at line 109 of file kis_transform_worker.h.

Member Data Documentation

◆ m_boundRect

QRect KisTransformWorker::m_boundRect
private

Definition at line 134 of file kis_transform_worker.h.

◆ m_dev

KisPaintDeviceSP KisTransformWorker::m_dev
private

Definition at line 127 of file kis_transform_worker.h.

◆ m_filter

KisFilterStrategy* KisTransformWorker::m_filter
private

Definition at line 133 of file kis_transform_worker.h.

◆ m_forceSubPixelTranslation

bool KisTransformWorker::m_forceSubPixelTranslation {false}
private

Definition at line 135 of file kis_transform_worker.h.

135{false};

◆ m_progressUpdater

KoUpdaterPtr KisTransformWorker::m_progressUpdater
private

Definition at line 132 of file kis_transform_worker.h.

◆ m_rotation

double KisTransformWorker::m_rotation
private

Definition at line 129 of file kis_transform_worker.h.

◆ m_xscale

double KisTransformWorker::m_xscale
private

Definition at line 128 of file kis_transform_worker.h.

◆ m_xshear

double KisTransformWorker::m_xshear
private

Definition at line 129 of file kis_transform_worker.h.

◆ m_xshearOrigin

double KisTransformWorker::m_xshearOrigin
private

Definition at line 130 of file kis_transform_worker.h.

◆ m_xtranslate

qreal KisTransformWorker::m_xtranslate
private

Definition at line 131 of file kis_transform_worker.h.

◆ m_yscale

double KisTransformWorker::m_yscale
private

Definition at line 128 of file kis_transform_worker.h.

◆ m_yshear

double KisTransformWorker::m_yshear
private

Definition at line 129 of file kis_transform_worker.h.

◆ m_yshearOrigin

double KisTransformWorker::m_yshearOrigin
private

Definition at line 130 of file kis_transform_worker.h.

◆ m_ytranslate

qreal KisTransformWorker::m_ytranslate
private

Definition at line 131 of file kis_transform_worker.h.


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