13#include <QPainterPath>
79 inline QPointF
imageToThumb(
const QPointF &pt,
bool useFlakeOptimization);
87 : m_d(new
Private(this, converter, currentArgs, transaction, manager))
97 return m_d->helper.brushOutline(*
m_d->currentArgs.liquifyProperties());
103 Q_UNUSED(perspectiveModifierActive);
104 Q_UNUSED(shiftModifierActive);
109 return Qt::BlankCursor;
116 if (
m_d->recalculateOnNextRedraw) {
117 m_d->recalculateTransformations();
118 m_d->recalculateOnNextRedraw =
false;
123 gc.setOpacity(
m_d->transaction.basePreviewOpacity());
124 gc.setTransform(
m_d->paintingTransform,
true);
125 gc.drawImage(
m_d->paintingOffset,
m_d->transformedImage);
132 if (!
m_d->currentArgs.liquifyWorker())
return;
133 m_d->recalculateTransformations();
143 m_d->helper.configurePaintOp(*
m_d->currentArgs.liquifyProperties(),
m_d->currentArgs.liquifyWorker());
144 m_d->helper.startPaint(event,
m_d->manager);
146 m_d->recalculateTransformations();
153 m_d->helper.continuePaint(event);
156 m_d->recalculateOnNextRedraw =
true;
162 if (
m_d->helper.endPaint(event)) {
163 m_d->recalculateTransformations();
172 m_d->helper.hoverPaint(event);
200 QPointF widgetPoint =
m_d->converter->documentToWidget(event->
point);
201 m_d->lastMouseWidgetPos = widgetPoint;
202 m_d->startResizeImagePos =
m_d->converter->documentToImage(event->
point);
203 m_d->startResizeGlobalCursorPos = QCursor::pos();
217 QPointF widgetPoint =
m_d->converter->documentToWidget(event->
point);
219 QPointF diff = widgetPoint -
m_d->lastMouseWidgetPos;
223 const qreal newSize = qBound(props->
minSize(), props->
size() + linearizedOffset, props->
maxSize());
225 props->
setSize(floor(newSize));
229 m_d->currentArgs.saveLiquifyTransformMode();
231 m_d->lastMouseWidgetPos = widgetPoint;
267 QTransform resultThumbTransform = q->thumbToImageTransform() * scaleTransform;
269 bool useFlakeOptimization = scale < 1.0 &&
272 paintingOffset = transaction.originalTopLeft();
273 if (!q->originalImage().isNull()) {
274 if (useFlakeOptimization) {
275 transformedImage = q->originalImage().transformed(resultThumbTransform);
276 paintingTransform = QTransform();
278 transformedImage = q->originalImage();
279 paintingTransform = resultThumbTransform;
282 QTransform imageToRealThumbTransform =
283 useFlakeOptimization ?
285 q->thumbToImageTransform().inverted();
287 QPointF origTLInFlake =
288 imageToRealThumbTransform.map(transaction.originalTopLeft());
291 currentArgs.liquifyWorker()->runOnQImage(transformedImage,
293 imageToRealThumbTransform,
296 transformedImage = q->originalImage();
297 paintingOffset = imageToThumb(transaction.originalTopLeft(),
false);
298 paintingTransform = resultThumbTransform;
301 handlesTransform = scaleTransform;
302 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)