diff --git a/libs/image/brushengine/kis_paint_information.h b/libs/image/brushengine/kis_paint_information.h --- a/libs/image/brushengine/kis_paint_information.h +++ b/libs/image/brushengine/kis_paint_information.h @@ -273,11 +273,14 @@ static KisPaintInformation mix(qreal t, const KisPaintInformation& pi1, const KisPaintInformation& pi2); static KisPaintInformation mixWithoutTime(const QPointF &p, qreal t, const KisPaintInformation &p1, const KisPaintInformation &p2); static KisPaintInformation mixWithoutTime(qreal t, const KisPaintInformation &pi1, const KisPaintInformation &pi2); + static void mixOnlyPositionInPlace(qreal t, const KisPaintInformation& mixedPi, KisPaintInformation& basePi); + static void mixWithoutTimeInPlace(qreal t, const KisPaintInformation &pi1, KisPaintInformation &pi2); static qreal tiltDirection(const KisPaintInformation& info, bool normalize = true); static qreal tiltElevation(const KisPaintInformation& info, qreal maxTiltX = 60.0, qreal maxTiltY = 60.0, bool normalize = true); private: static KisPaintInformation mixImpl(const QPointF &p, qreal t, const KisPaintInformation &p1, const KisPaintInformation &p2, bool posOnly, bool mixTime); + static void mixImplInPlace(const QPointF &p, qreal t, const KisPaintInformation &p1, KisPaintInformation &p2, bool posOnly, bool mixTime); private: struct Private; diff --git a/libs/image/brushengine/kis_paint_information.cc b/libs/image/brushengine/kis_paint_information.cc --- a/libs/image/brushengine/kis_paint_information.cc +++ b/libs/image/brushengine/kis_paint_information.cc @@ -509,20 +509,33 @@ return mixImpl(p, t, pi1, pi2, false, false); } +void KisPaintInformation::mixOnlyPositionInPlace(qreal t, const KisPaintInformation& mixedPi, KisPaintInformation& basePi) +{ + QPointF pt = (1 - t) * mixedPi.pos() + t * basePi.pos(); + mixImplInPlace(pt, t, mixedPi, basePi, true, false); +} + +void KisPaintInformation::mixWithoutTimeInPlace(qreal t, const KisPaintInformation& pi1, KisPaintInformation& pi2) +{ + QPointF pt = (1 - t) * pi1.pos() + t * pi2.pos(); + mixImplInPlace(pt, t, pi1, pi2, false, false); +} + KisPaintInformation KisPaintInformation::mixImpl(const QPointF &p, qreal t, const KisPaintInformation &pi1, const KisPaintInformation &pi2, bool posOnly, bool mixTime) { + KisPaintInformation result(pi2); + mixImplInPlace(p, t, pi1, result, posOnly, mixTime); + return result; +} + +void KisPaintInformation::mixImplInPlace(const QPointF &p, qreal t, const KisPaintInformation &pi1, KisPaintInformation &pi2, bool posOnly, bool mixTime) +{ if (posOnly) { - KisPaintInformation result(p, - pi2.pressure(), - pi2.xTilt(), - pi2.yTilt(), - pi2.rotation(), - pi2.tangentialPressure(), - pi2.perspective(), - pi2.currentTime(), - pi2.drawingSpeed()); - result.setRandomSource(pi2.randomSource()); - return result; + pi2.d->pos = p; + pi2.d->isHoveringMode = false; + pi2.d->currentDistanceInfo = 0; + pi2.d->levelOfDetail = 0; + return; } else { qreal pressure = (1 - t) * pi1.pressure() + t * pi2.pressure(); @@ -544,15 +557,12 @@ qreal time = mixTime ? ((1 - t) * pi1.currentTime() + t * pi2.currentTime()) : pi2.currentTime(); qreal speed = (1 - t) * pi1.drawingSpeed() + t * pi2.drawingSpeed(); - KisPaintInformation result(p, pressure, xTilt, yTilt, rotation, tangentialPressure, perspective, time, speed); KIS_ASSERT_RECOVER_NOOP(pi1.isHoveringMode() == pi2.isHoveringMode()); - result.d->isHoveringMode = pi1.isHoveringMode(); - result.d->levelOfDetail = pi1.d->levelOfDetail; - result.d->randomSource = pi1.d->randomSource; - result.d->canvasRotation = pi2.canvasRotation(); - result.d->canvasMirroredH = pi2.canvasMirroredH(); - - return result; + pi2 = KisPaintInformation(p, pressure, xTilt, yTilt, rotation, tangentialPressure, perspective, time, speed); + pi2.d->randomSource = pi1.d->randomSource; + pi2.d->isHoveringMode = pi1.isHoveringMode(); + pi2.d->currentDistanceInfo = 0; + pi2.d->levelOfDetail = pi1.d->levelOfDetail; } } diff --git a/libs/ui/tool/kis_tool_freehand_helper.cpp b/libs/ui/tool/kis_tool_freehand_helper.cpp --- a/libs/ui/tool/kis_tool_freehand_helper.cpp +++ b/libs/ui/tool/kis_tool_freehand_helper.cpp @@ -720,14 +720,14 @@ if (m_d->smoothingOptions->stabilizeSensors()) { while (it != end) { qreal k = qreal(i - 1) / i; // coeff for uniform averaging - result = KisPaintInformation::mixWithoutTime(k, *it, result); + KisPaintInformation::mixWithoutTimeInPlace(k, *it, result); it++; i++; } } else{ while (it != end) { qreal k = qreal(i - 1) / i; // coeff for uniform averaging - result = KisPaintInformation::mixOnlyPosition(k, *it, result); + KisPaintInformation::mixOnlyPositionInPlace(k, *it, result); it++; i++; }