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;
121 if (
m_d->recalculateOnNextRedraw) {
122 m_d->recalculateTransformations();
123 m_d->recalculateOnNextRedraw =
false;
128 gc.setOpacity(
m_d->transaction.basePreviewOpacity());
129 gc.setTransform(
m_d->paintingTransform,
true);
130 gc.drawImage(
m_d->paintingOffset,
m_d->transformedImage);
137 if (!
m_d->currentArgs.liquifyWorker())
return;
138 m_d->recalculateTransformations();
148 m_d->lastDocPos =
event->point;
149 m_d->helper.configurePaintOp(*
m_d->currentArgs.liquifyProperties(),
m_d->currentArgs.liquifyWorker());
150 m_d->helper.startPaint(event,
m_d->manager);
152 m_d->recalculateTransformations();
159 m_d->lastDocPos =
event->point;
160 m_d->helper.continuePaint(event);
163 m_d->recalculateOnNextRedraw =
true;
169 m_d->lastDocPos =
event->point;
170 if (
m_d->helper.endPaint(event)) {
171 m_d->recalculateTransformations();
180 m_d->lastDocPos =
event->point;
181 m_d->helper.hoverPaint(event);
208 m_d->lastDocPos =
event->point;
210 QPointF widgetPoint =
m_d->converter->documentToWidget(event->
point);
211 m_d->lastMouseWidgetPos = widgetPoint;
212 m_d->startResizeImagePos =
m_d->converter->documentToImage(event->
point);
213 m_d->startResizeGlobalCursorPos =
event->globalPos();
226 m_d->lastDocPos =
event->point;
228 QPointF widgetPoint =
m_d->converter->documentToWidget(event->
point);
230 QPointF diff = widgetPoint -
m_d->lastMouseWidgetPos;
234 const qreal newSize = qBound(props->
minSize(), props->
size() + linearizedOffset, props->
maxSize());
236 props->
setSize(floor(newSize));
240 m_d->currentArgs.saveLiquifyTransformMode();
242 m_d->lastMouseWidgetPos = widgetPoint;
254 m_d->lastDocPos =
event->point;
280 qreal oldSize = props->
size();
284 newSize =
m_d->standardBrushSizes.increaseBrushSize(oldSize);
286 newSize =
m_d->standardBrushSizes.decreaseBrushSize(oldSize);
306 QTransform resultThumbTransform = q->thumbToImageTransform() * scaleTransform;
308 bool useFlakeOptimization = scale < 1.0 &&
311 paintingOffset = transaction.originalTopLeft();
312 if (!q->originalImage().isNull()) {
313 if (useFlakeOptimization) {
314 transformedImage = q->originalImage().transformed(resultThumbTransform);
315 paintingTransform = QTransform();
317 transformedImage = q->originalImage();
318 paintingTransform = resultThumbTransform;
321 QTransform imageToRealThumbTransform =
322 useFlakeOptimization ?
324 q->thumbToImageTransform().inverted();
326 QPointF origTLInFlake =
327 imageToRealThumbTransform.map(transaction.originalTopLeft());
330 currentArgs.liquifyWorker()->runOnQImage(transformedImage,
332 imageToRealThumbTransform,
335 transformedImage = q->originalImage();
336 paintingOffset = imageToThumb(transaction.originalTopLeft(),
false);
337 paintingTransform = resultThumbTransform;
340 handlesTransform = scaleTransform;
341 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)