13#include <QPainterPath>
84 inline QPointF
imageToThumb(
const QPointF &pt,
bool useFlakeOptimization);
92 : m_d(new
Private(this, converter, currentArgs, transaction, manager))
102 return m_d->helper.brushOutline(*
m_d->currentArgs.liquifyProperties());
108 Q_UNUSED(perspectiveModifierActive);
109 Q_UNUSED(shiftModifierActive);
114 return Qt::BlankCursor;
119 Q_UNUSED(displayRendererInterface)
122 if (
m_d->recalculateOnNextRedraw) {
123 m_d->recalculateTransformations();
124 m_d->recalculateOnNextRedraw =
false;
129 gc.setOpacity(
m_d->transaction.basePreviewOpacity());
130 gc.setTransform(
m_d->paintingTransform,
true);
131 gc.drawImage(
m_d->paintingOffset,
m_d->transformedImage);
138 if (!
m_d->currentArgs.liquifyWorker())
return;
139 m_d->recalculateTransformations();
149 m_d->lastDocPos =
event->point;
150 m_d->helper.configurePaintOp(*
m_d->currentArgs.liquifyProperties(),
m_d->currentArgs.liquifyWorker());
151 m_d->helper.startPaint(event,
m_d->manager);
153 m_d->recalculateTransformations();
160 m_d->lastDocPos =
event->point;
161 m_d->helper.continuePaint(event);
164 m_d->recalculateOnNextRedraw =
true;
170 m_d->lastDocPos =
event->point;
171 if (
m_d->helper.endPaint(event)) {
172 m_d->recalculateTransformations();
181 m_d->lastDocPos =
event->point;
182 m_d->helper.hoverPaint(event);
209 m_d->lastDocPos =
event->point;
211 QPointF widgetPoint =
m_d->converter->documentToWidget(event->
point);
212 m_d->lastMouseWidgetPos = widgetPoint;
213 m_d->startResizeImagePos =
m_d->converter->documentToImage(event->
point);
214 m_d->startResizeGlobalCursorPos =
event->globalPos();
227 m_d->lastDocPos =
event->point;
229 QPointF widgetPoint =
m_d->converter->documentToWidget(event->
point);
231 QPointF diff = widgetPoint -
m_d->lastMouseWidgetPos;
235 const qreal newSize = qBound(props->
minSize(), props->
size() + linearizedOffset, props->
maxSize());
237 props->
setSize(floor(newSize));
241 m_d->currentArgs.saveLiquifyTransformMode();
243 m_d->lastMouseWidgetPos = widgetPoint;
255 m_d->lastDocPos =
event->point;
281 qreal oldSize = props->
size();
285 newSize =
m_d->standardBrushSizes.increaseBrushSize(oldSize);
287 newSize =
m_d->standardBrushSizes.decreaseBrushSize(oldSize);
307 QTransform resultThumbTransform = q->thumbToImageTransform() * scaleTransform;
309 bool useFlakeOptimization = scale < 1.0 &&
312 paintingOffset = transaction.originalTopLeft();
313 if (!q->originalImage().isNull()) {
314 if (useFlakeOptimization) {
315 transformedImage = q->originalImage().transformed(resultThumbTransform);
316 paintingTransform = QTransform();
318 transformedImage = q->originalImage();
319 paintingTransform = resultThumbTransform;
322 QTransform imageToRealThumbTransform =
323 useFlakeOptimization ?
325 q->thumbToImageTransform().inverted();
327 QPointF origTLInFlake =
328 imageToRealThumbTransform.map(transaction.originalTopLeft());
331 currentArgs.liquifyWorker()->runOnQImage(transformedImage,
333 imageToRealThumbTransform,
336 transformedImage = q->originalImage();
337 paintingOffset = imageToThumb(transaction.originalTopLeft(),
false);
338 paintingTransform = resultThumbTransform;
341 handlesTransform = scaleTransform;
342 Q_EMIT q->requestImageRecalculation();
_Private::Traits< T >::Result documentToFlake(const T &obj) const
_Private::Traits< T >::Result imageToDocument(const T &obj) const
void setReverseDirection(bool value)
void setSize(qreal value)
bool reverseDirection() const
QPointF point
The point in document coordinates.
#define KIS_ASSERT_RECOVER_RETURN(cond)