|
Krita Source Code Documentation
|
#include <kis_tool_freehand_helper.h>
Inheritance diagram for KisToolFreehandHelper:Classes | |
| struct | Private |
Signals | |
| void | requestExplicitUpdateOutline () |
Public Member Functions | |
| void | cursorMoved (const QPointF &cursorPos) |
| void | endPaint () |
| void | initPaint (KoPointerEvent *event, const QPointF &pixelCoords, KisImageWSP image, KisNodeSP currentNode, KisStrokesFacade *strokesFacade, KisNodeSP overrideNode=0, KisDefaultBoundsBaseSP bounds=0) |
| bool | isRunning () const |
| KisToolFreehandHelper (KisPaintingInformationBuilder *infoBuilder, KoCanvasResourceProvider *resourceManager, const KUndo2MagicString &transactionText=KUndo2MagicString(), KisSmoothingOptions *smoothingOptions=0) | |
| void | paintEvent (KoPointerEvent *event) |
| KisOptimizedBrushOutline | paintOpOutline (const QPointF &savedCursorPos, const KoPointerEvent *event, const KisPaintOpSettingsSP globalSettings, KisPaintOpSettings::OutlineMode mode) const |
| void | setSmoothness (KisSmoothingOptionsSP smoothingOptions) |
| KisSmoothingOptionsSP | smoothingOptions () const |
| ~KisToolFreehandHelper () override | |
Private Slots | |
| void | doAirbrushing () |
| void | finishStroke () |
| void | slotSmoothingTypeChanged () |
| void | stabilizerPollAndPaint () |
Private Member Functions | |
| int | computeAirbrushTimerInterval () const |
| qreal | currentPhysicalZoom () const |
| qreal | currentZoom () const |
| KisPaintInformation | getStabilizedPaintInfo (const QQueue< KisPaintInformation > &queue, const KisPaintInformation &lastPaintInfo) |
| void | paint (KisPaintInformation &info) |
| void | paintBezierSegment (KisPaintInformation pi1, KisPaintInformation pi2, QPointF tangent1, QPointF tangent2) |
| void | stabilizerEnd () |
| void | stabilizerStart (KisPaintInformation firstPaintInfo) |
| void | updateCurrentBrushPosition (const QPointF &pixelPos) |
Private Attributes | |
| Private *const | m_d |
Definition at line 31 of file kis_tool_freehand_helper.h.
| KisToolFreehandHelper::KisToolFreehandHelper | ( | KisPaintingInformationBuilder * | infoBuilder, |
| KoCanvasResourceProvider * | resourceManager, | ||
| const KUndo2MagicString & | transactionText = KUndo2MagicString(), | ||
| KisSmoothingOptions * | smoothingOptions = 0 ) |
Definition at line 136 of file kis_tool_freehand_helper.cpp.
References KisToolFreehandHelper::Private::airbrushingTimer, doAirbrushing(), KisToolFreehandHelper::Private::fakeDabRandomSource, KisToolFreehandHelper::Private::fakeStrokeRandomSource, finishStroke(), KisToolFreehandHelper::Private::infoBuilder, m_d, paintLine(), requestExplicitUpdateOutline(), KisToolFreehandHelper::Private::resourceManager, resourceManager(), KisStabilizerDelayedPaintHelper::setPaintLineCallback(), KisStabilizerDelayedPaintHelper::setUpdateOutlineCallback(), slotSmoothingTypeChanged(), KisToolFreehandHelper::Private::smoothingOptions, smoothingOptions(), KisToolFreehandHelper::Private::stabilizerDelayedPaintHelper, stabilizerPollAndPaint(), KisToolFreehandHelper::Private::stabilizerPollTimer, KisToolFreehandHelper::Private::strokeTimeoutTimer, and KisToolFreehandHelper::Private::transactionText.
|
override |
Definition at line 167 of file kis_tool_freehand_helper.cpp.
References m_d.
|
protected |
Definition at line 751 of file kis_tool_freehand_helper.cpp.
References KisToolFreehandHelper::Private::airbrushingTimer, KisToolFreehandHelper::Private::asyncUpdateHelper, KisStabilizerDelayedPaintHelper::cancel(), KisStrokesFacade::cancelStroke(), KisAsynchronousStrokeUpdateHelper::cancelUpdateStream(), KisAsynchronousStrokeUpdateHelper::isActive(), m_d, KisStabilizerDelayedPaintHelper::running(), KisToolFreehandHelper::Private::stabilizerDelayedPaintHelper, KisToolFreehandHelper::Private::stabilizerPollTimer, KisToolFreehandHelper::Private::strokeId, KisToolFreehandHelper::Private::strokeInfos, KisToolFreehandHelper::Private::strokesFacade, and KisToolFreehandHelper::Private::strokeTimeoutTimer.
|
private |
Definition at line 1001 of file kis_tool_freehand_helper.cpp.
References AIRBRUSH_INTERVAL_FACTOR, KisResourcesSnapshot::airbrushingInterval(), m_d, and KisToolFreehandHelper::Private::resources.
|
protectedvirtual |
Reimplemented in KisToolMultihandHelper.
Definition at line 1077 of file kis_tool_freehand_helper.cpp.
|
private |
Definition at line 1012 of file kis_tool_freehand_helper.cpp.
References KoCanvasResource::EffectivePhysicalZoom, m_d, KoCanvasResourceProvider::resource(), and KisToolFreehandHelper::Private::resourceManager.
|
private |
Definition at line 1007 of file kis_tool_freehand_helper.cpp.
References KoCanvasResource::EffectiveZoom, m_d, KoCanvasResourceProvider::resource(), and KisToolFreehandHelper::Private::resourceManager.
| void KisToolFreehandHelper::cursorMoved | ( | const QPointF & | cursorPos | ) |
Definition at line 253 of file kis_tool_freehand_helper.cpp.
References currentZoom(), KisToolFreehandHelper::Private::lastCursorPos, m_d, and KisPaintOpUtils::PositionHistory::pushThroughHistory().
|
privateslot |
Definition at line 977 of file kis_tool_freehand_helper.cpp.
References KisPaintInformation::canvasMirroredH(), KisPaintInformation::canvasMirroredV(), KisPaintInformation::canvasRotation(), elapsedStrokeTime(), m_d, paint(), KisPaintInformation::perspective(), KisPaintInformation::pos(), KisPaintInformation::pressure(), KisToolFreehandHelper::Private::previousPaintInformation, KisPaintInformation::rotation(), KisPaintInformation::setCanvasMirroredH(), KisPaintInformation::setCanvasMirroredV(), KisPaintInformation::setCanvasRotation(), KisToolFreehandHelper::Private::strokeInfos, KisPaintInformation::tangentialPressure(), KisPaintInformation::xTilt(), and KisPaintInformation::yTilt().
|
protected |
Definition at line 781 of file kis_tool_freehand_helper.cpp.
References m_d, and KisToolFreehandHelper::Private::strokeTime.
| void KisToolFreehandHelper::endPaint | ( | ) |
There might be some timer events still pending, so we should cancel them. Use this flag for the purpose. Please note that we are not in MT here, so no mutex is needed
Definition at line 713 of file kis_tool_freehand_helper.cpp.
References KisStrokesFacade::addJob(), KisToolFreehandHelper::Private::airbrushingTimer, KisToolFreehandHelper::Private::asyncUpdateHelper, KisStrokesFacade::endStroke(), KisAsynchronousStrokeUpdateHelper::endUpdateStream(), finishStroke(), KisToolFreehandHelper::Private::hasPaintAtLeastOnce, KisToolFreehandHelper::Private::infoBuilder, KisAsynchronousStrokeUpdateHelper::isActive(), m_d, KisSmoothingOptions::NO_SMOOTHING, paintAt(), KisToolFreehandHelper::Private::previousPaintInformation, KisPaintingInformationBuilder::reset(), KisToolFreehandHelper::Private::smoothingOptions, KisSmoothingOptions::STABILIZER, stabilizerEnd(), KisToolFreehandHelper::Private::strokeId, KisToolFreehandHelper::Private::strokeInfos, KisToolFreehandHelper::Private::strokesFacade, and KisToolFreehandHelper::Private::strokeTimeoutTimer.
|
privateslot |
Definition at line 961 of file kis_tool_freehand_helper.cpp.
References KisPaintInformation::currentTime(), KisToolFreehandHelper::Private::haveTangent, m_d, KisToolFreehandHelper::Private::olderPaintInformation, paintBezierSegment(), KisPaintInformation::pos(), KisToolFreehandHelper::Private::previousPaintInformation, and KisToolFreehandHelper::Private::previousTangent.
|
private |
The first point is going to be overridden by lastPaintInfo, skip it.
Definition at line 815 of file kis_tool_freehand_helper.cpp.
References KisPaintInformation::canvasMirroredH(), KisPaintInformation::canvasMirroredV(), KisPaintInformation::canvasRotation(), KisPaintInformation::drawingSpeed(), elapsedStrokeTime(), m_d, KisPaintInformation::perspective(), KisPaintInformation::pos(), KisPaintInformation::pressure(), KisPaintInformation::rotation(), KisPaintInformation::setCanvasMirroredH(), KisPaintInformation::setCanvasMirroredV(), KisPaintInformation::setCanvasRotation(), KisToolFreehandHelper::Private::smoothingOptions, KisPaintInformation::tangentialPressure(), KisPaintInformation::xTilt(), and KisPaintInformation::yTilt().
| void KisToolFreehandHelper::initPaint | ( | KoPointerEvent * | event, |
| const QPointF & | pixelCoords, | ||
| KisImageWSP | image, | ||
| KisNodeSP | currentNode, | ||
| KisStrokesFacade * | strokesFacade, | ||
| KisNodeSP | overrideNode = 0, | ||
| KisDefaultBoundsBaseSP | bounds = 0 ) |
| event | The event |
| pixelCoords | The position of the KoPointerEvent, in pixel coordinates. |
| resourceManager | The canvas resource manager |
| image | The image |
| currentNode | The current node |
| strokesFacade | The strokes facade |
| overrideNode | The override node |
| bounds | The bounds |
Definition at line 258 of file kis_tool_freehand_helper.cpp.
References bounds, currentZoom(), KisAlgebra2D::directionBetweenPoints(), elapsedStrokeTime(), KisToolFreehandHelper::Private::infoBuilder, initPaintImpl(), KoPointerEvent::isTouchEvent(), KisToolFreehandHelper::Private::lastCursorPos, m_d, KisPaintOpUtils::PositionHistory::pushThroughHistory(), KisPaintingInformationBuilder::reset(), KisPaintOpUtils::PositionHistory::reset(), KisToolFreehandHelper::Private::resourceManager, KisPaintingInformationBuilder::startStroke(), and KisToolFreehandHelper::Private::strokeTime.
|
protected |
Definition at line 298 of file kis_tool_freehand_helper.cpp.
References KisToolFreehandHelper::Private::airbrushingTimer, KisToolFreehandHelper::Private::asyncUpdateHelper, bounds, computeAirbrushTimerInterval(), createPainters(), KisToolFreehandHelper::Private::distanceHistory, KisToolFreehandHelper::Private::hasLastDrawnPixel, KisToolFreehandHelper::Private::hasPaintAtLeastOnce, KisToolFreehandHelper::Private::hasTentativePixel, KisToolFreehandHelper::Private::haveTangent, KisToolFreehandHelper::Private::history, LONG_TIME, m_d, KisResourcesSnapshot::needsAirbrushing(), KisResourcesSnapshot::needsSpacingUpdates(), paintAt(), KisPaintInformation::pos(), KisResourcesSnapshot::presetNeedsAsynchronousUpdates(), KisToolFreehandHelper::Private::previousPaintInformation, KisToolFreehandHelper::Private::previousTangent, resourceManager(), KisToolFreehandHelper::Private::resources, KisResourcesSnapshot::setCurrentNode(), KisToolFreehandHelper::Private::smoothingOptions, SPACING_UPDATE_INTERVAL, KisSmoothingOptions::STABILIZER, stabilizerStart(), KisStrokesFacade::startStroke(), KisAsynchronousStrokeUpdateHelper::startUpdateStream(), KisToolFreehandHelper::Private::strokeId, KisToolFreehandHelper::Private::strokeInfos, KisToolFreehandHelper::Private::strokesFacade, FreehandStrokeStrategy::SupportsContinuedInterstrokeData, FreehandStrokeStrategy::SupportsTimedMergeId, TIMING_UPDATE_INTERVAL, and KisToolFreehandHelper::Private::transactionText.
| bool KisToolFreehandHelper::isRunning | ( | ) | const |
Definition at line 293 of file kis_tool_freehand_helper.cpp.
References m_d, and KisToolFreehandHelper::Private::strokeId.
|
private |
Smooth the coordinates out using the history and the distance. This is a heavily modified version of an algo used in Gimp and described in https://bugs.kde.org/show_bug.cgi?id=281267 and https://w.atwiki.jp/sigetch_2007/pages/17.html. The main differences are:
1) It uses 'distance' instead of 'velocity', since time measurements are too unstable in realworld environment
2) There is no 'Quality' parameter, since the number of samples is calculated automatically
3) 'Tail Aggressiveness' is used for controlling the end of the stroke
4) The formula is a little bit different: 'Distance' parameter stands for $3 \Sigma$
Definition at line 502 of file kis_tool_freehand_helper.cpp.
References KisStabilizedEventsSampler::addEvent(), KisToolFreehandHelper::Private::airbrushingTimer, KisPaintInformation::currentTime(), distance(), KisToolFreehandHelper::Private::distanceHistory, KisPaintInformation::drawingSpeed(), KisToolFreehandHelper::Private::effectiveSmoothnessDistance(), KisToolFreehandHelper::Private::hasLastDrawnPixel, KisToolFreehandHelper::Private::hasTentativePixel, KisToolFreehandHelper::Private::haveTangent, KisToolFreehandHelper::Private::history, KisToolFreehandHelper::Private::isTentativePixel(), KisToolFreehandHelper::Private::lastDrawnPixel, m_d, M_PI, KisSmoothingOptions::NO_SMOOTHING, KisToolFreehandHelper::Private::olderPaintInformation, paintBezierSegment(), paintLine(), KisStabilizerDelayedPaintHelper::paintSome(), KisSmoothingOptions::PIXEL_PERFECT, KisPaintInformation::pos(), KisPaintInformation::pressure(), KisToolFreehandHelper::Private::previousPaintInformation, KisToolFreehandHelper::Private::previousTangent, KisStabilizerDelayedPaintHelper::running(), KisToolFreehandHelper::Private::setPaintInfoPixelPos(), KisPaintInformation::setPos(), KisPaintInformation::setPressure(), KisSmoothingOptions::SIMPLE_SMOOTHING, KisToolFreehandHelper::Private::smoothingOptions, KisToolFreehandHelper::Private::stabilizedSampler, KisSmoothingOptions::STABILIZER, KisToolFreehandHelper::Private::stabilizerDelayedPaintHelper, KisToolFreehandHelper::Private::strokeTimeoutTimer, KisToolFreehandHelper::Private::tentativePaintInformation, KisToolFreehandHelper::Private::tentativePixel, KisToolFreehandHelper::Private::toPixelPos(), and KisSmoothingOptions::WEIGHTED_SMOOTHING.
|
protectedvirtual |
Reimplemented in KisToolMultihandHelper, and KisToolMultihandHelper.
Definition at line 1083 of file kis_tool_freehand_helper.cpp.
References paintAt().
|
protected |
Definition at line 1017 of file kis_tool_freehand_helper.cpp.
References KisStrokesFacade::addJob(), KisToolFreehandHelper::Private::hasPaintAtLeastOnce, m_d, KisPaintInformation::pos(), KisToolFreehandHelper::Private::strokeId, KisToolFreehandHelper::Private::strokesFacade, and updateCurrentBrushPosition().
|
protectedvirtual |
Reimplemented in KisToolMultihandHelper, and KisToolMultihandHelper.
Definition at line 1094 of file kis_tool_freehand_helper.cpp.
References paintBezierCurve().
|
protected |
Definition at line 1038 of file kis_tool_freehand_helper.cpp.
References KisStrokesFacade::addJob(), KisToolFreehandHelper::Private::hasPaintAtLeastOnce, m_d, paintLine(), KisPaintInformation::pos(), KisPaintInformation::setPos(), KisPaintInformation::setPressure(), KisToolFreehandHelper::Private::strokeId, KisToolFreehandHelper::Private::strokesFacade, and updateCurrentBrushPosition().
|
private |
Definition at line 385 of file kis_tool_freehand_helper.cpp.
References paintBezierCurve(), KisPaintInformation::pos(), ppVar, and warnKrita.
| void KisToolFreehandHelper::paintEvent | ( | KoPointerEvent * | event | ) |
Definition at line 491 of file kis_tool_freehand_helper.cpp.
References KisPaintingInformationBuilder::continueStroke(), elapsedStrokeTime(), KisToolFreehandHelper::Private::infoBuilder, KisUpdateTimeMonitor::instance(), m_d, paint(), KisPaintInformation::pos(), and KisUpdateTimeMonitor::reportMouseMove().
|
protectedvirtual |
Reimplemented in KisToolMultihandHelper, and KisToolMultihandHelper.
Definition at line 1088 of file kis_tool_freehand_helper.cpp.
References paintLine().
|
protected |
Definition at line 1027 of file kis_tool_freehand_helper.cpp.
References KisStrokesFacade::addJob(), KisToolFreehandHelper::Private::hasPaintAtLeastOnce, m_d, KisPaintInformation::pos(), KisToolFreehandHelper::Private::strokeId, KisToolFreehandHelper::Private::strokesFacade, and updateCurrentBrushPosition().
| KisOptimizedBrushOutline KisToolFreehandHelper::paintOpOutline | ( | const QPointF & | savedCursorPos, |
| const KoPointerEvent * | event, | ||
| const KisPaintOpSettingsSP | globalSettings, | ||
| KisPaintOpSettings::OutlineMode | mode ) const |
When LoD mode is active it may happen that the helper has already started a stroke, but it painted noting, because all the work is being calculated by the scaled-down LodN stroke. So at first we try to fetch the data from the lodN stroke ("buddy") and then check if there is at least something has been painted with this distance information object.
Tiny hack alert: here we fetch the distance information directly from the LodN stroke. Ideally, we should upscale its data, but here we just override it with our local copy of the coordinates.
Definition at line 182 of file kis_tool_freehand_helper.cpp.
References KisOptimizedBrushOutline::addEllipse(), KisResourcesSnapshot::currentPaintOpPreset(), currentPhysicalZoom(), currentZoom(), KisAlgebra2D::directionBetweenPoints(), KisResourcesSnapshot::effectiveZoom(), KisToolFreehandHelper::Private::fakeDabRandomSource, KisToolFreehandHelper::Private::fakeStrokeRandomSource, KisStabilizerDelayedPaintHelper::hasLastPaintInformation(), KisPaintingInformationBuilder::hover(), KisToolFreehandHelper::Private::infoBuilder, KisToolFreehandHelper::Private::lastCursorPos, KisStabilizerDelayedPaintHelper::lastPaintInformation(), m_d, KisDistanceInformation::overrideLastValues(), KisPaintInformation::pos(), KisToolFreehandHelper::Private::previousPaintInformation, KisPaintOpUtils::PositionHistory::pushThroughHistory(), R, KisPaintInformation::registerDistanceInformation(), KisToolFreehandHelper::Private::resources, KisStabilizerDelayedPaintHelper::running(), KisPaintInformation::setPerStrokeRandomSource(), KisPaintInformation::setRandomSource(), KisToolFreehandHelper::Private::smoothingOptions, KisSmoothingOptions::STABILIZER, KisToolFreehandHelper::Private::stabilizerDelayedPaintHelper, and KisToolFreehandHelper::Private::strokeInfos.
|
signal |
The signal is emitted when the outline should be updated explicitly by the tool. Used by Stabilizer option, because it paints on internal timer events instead of the on every paint() event
|
protected |
Definition at line 370 of file kis_tool_freehand_helper.cpp.
References m_d, and KisToolFreehandHelper::Private::resourceManager.
| void KisToolFreehandHelper::setSmoothness | ( | KisSmoothingOptionsSP | smoothingOptions | ) |
Definition at line 172 of file kis_tool_freehand_helper.cpp.
References m_d, KisToolFreehandHelper::Private::smoothingOptions, and smoothingOptions().
|
privateslot |
Definition at line 945 of file kis_tool_freehand_helper.cpp.
References isRunning(), m_d, KisToolFreehandHelper::Private::previousPaintInformation, KisToolFreehandHelper::Private::smoothingOptions, KisSmoothingOptions::STABILIZER, stabilizerEnd(), stabilizerStart(), and KisToolFreehandHelper::Private::usingStabilizer.
| KisSmoothingOptionsSP KisToolFreehandHelper::smoothingOptions | ( | ) | const |
Definition at line 177 of file kis_tool_freehand_helper.cpp.
References m_d, and KisToolFreehandHelper::Private::smoothingOptions.
|
private |
Definition at line 924 of file kis_tool_freehand_helper.cpp.
References KisStabilizedEventsSampler::addFinishingEvent(), KisStabilizerDelayedPaintHelper::end(), m_d, KisStabilizerDelayedPaintHelper::running(), KisToolFreehandHelper::Private::smoothingOptions, KisToolFreehandHelper::Private::stabilizedSampler, KisToolFreehandHelper::Private::stabilizerDelayedPaintHelper, KisToolFreehandHelper::Private::stabilizerDeque, stabilizerPollAndPaint(), KisToolFreehandHelper::Private::stabilizerPollTimer, and KisToolFreehandHelper::Private::usingStabilizer.
|
privateslot |
Definition at line 862 of file kis_tool_freehand_helper.cpp.
References KisStabilizedEventsSampler::clear(), KisResourcesSnapshot::effectiveZoom(), getStabilizedPaintInfo(), m_d, KisResourcesSnapshot::needsAirbrushing(), paintLine(), KisPaintInformation::pos(), pow2(), KisToolFreehandHelper::Private::previousPaintInformation, R, KisStabilizedEventsSampler::range(), requestExplicitUpdateOutline(), KisToolFreehandHelper::Private::resources, KisStabilizerDelayedPaintHelper::running(), KisPaintInformation::setPos(), KisToolFreehandHelper::Private::smoothingOptions, KisToolFreehandHelper::Private::stabilizedSampler, KisToolFreehandHelper::Private::stabilizerDelayedPaintHelper, KisToolFreehandHelper::Private::stabilizerDeque, and KisStabilizerDelayedPaintHelper::update().
|
private |
Definition at line 786 of file kis_tool_freehand_helper.cpp.
References KisStabilizedEventsSampler::addEvent(), KisStabilizedEventsSampler::clear(), KisPaintInformation::drawingSpeed(), KisToolFreehandHelper::Private::effectiveSmoothnessDistance(), m_d, KisToolFreehandHelper::Private::stabilizedSampler, KisConfig::stabilizerDelayedPaint(), KisToolFreehandHelper::Private::stabilizerDelayedPaintHelper, KisToolFreehandHelper::Private::stabilizerDeque, KisToolFreehandHelper::Private::stabilizerPollTimer, KisConfig::stabilizerSampleSize(), KisStabilizerDelayedPaintHelper::start(), and KisToolFreehandHelper::Private::usingStabilizer.
|
private |
Publishes the current brush position (in image pixel coordinates) to the canvas resource provider, so scripts can follow where the brush actually is during a stroke (including stabilization delay).
Definition at line 375 of file kis_tool_freehand_helper.cpp.
References KoCanvasResource::CurrentBrushPosition, resourceManager(), and KoCanvasResourceProvider::setResource().
|
private |
Definition at line 160 of file kis_tool_freehand_helper.h.