Krita Source Code Documentation
Loading...
Searching...
No Matches
FreehandStrokeStrategy Class Reference

#include <freehand_stroke.h>

+ Inheritance diagram for FreehandStrokeStrategy:

Classes

class  Data
 
struct  Private
 

Public Types

enum  Flag { None = 0x0 , SupportsContinuedInterstrokeData = 0x1 , SupportsTimedMergeId = 0x2 }
 
- Public Types inherited from KisSimpleStrokeStrategy
enum  JobType {
  JOB_INIT = 0 , JOB_CANCEL , JOB_FINISH , JOB_DOSTROKE ,
  JOB_SUSPEND , JOB_RESUME , NJOBS
}
 

Public Member Functions

KisStrokeStrategycreateLodClone (int levelOfDetail) override
 
void doStrokeCallback (KisStrokeJobData *data) override
 
void finishStrokeCallback () override
 
 FreehandStrokeStrategy (KisResourcesSnapshotSP resources, KisFreehandStrokeInfo *strokeInfo, const KUndo2MagicString &name, Flags flags=None)
 
 FreehandStrokeStrategy (KisResourcesSnapshotSP resources, QVector< KisFreehandStrokeInfo * > strokeInfos, const KUndo2MagicString &name, Flags flags=None)
 
void initStrokeCallback () override
 
void notifyUserEndedStroke () override
 
void notifyUserStartedStroke () override
 
 ~FreehandStrokeStrategy () override
 
- Public Member Functions inherited from KisPainterBasedStrokeStrategy
void cancelStrokeCallback () override
 
void finishStrokeCallback () override
 
void initStrokeCallback () override
 
 KisPainterBasedStrokeStrategy (const QLatin1String &id, const KUndo2MagicString &name, KisResourcesSnapshotSP resources, KisFreehandStrokeInfo *strokeInfo)
 
 KisPainterBasedStrokeStrategy (const QLatin1String &id, const KUndo2MagicString &name, KisResourcesSnapshotSP resources, QVector< KisFreehandStrokeInfo * > strokeInfos)
 
void resumeStrokeCallback () override
 
void suspendStrokeCallback () override
 
 ~KisPainterBasedStrokeStrategy ()
 
- Public Member Functions inherited from KisRunnableBasedStrokeStrategy
void doStrokeCallback (KisStrokeJobData *data) override
 
 KisRunnableBasedStrokeStrategy (const KisRunnableBasedStrokeStrategy &rhs)
 
 KisRunnableBasedStrokeStrategy (const QLatin1String &id, const KUndo2MagicString &name=KUndo2MagicString())
 
KisRunnableStrokeJobsInterfacerunnableJobsInterface () const
 
 ~KisRunnableBasedStrokeStrategy ()
 
- Public Member Functions inherited from KisSimpleStrokeStrategy
KisStrokeJobDatacreateCancelData () override
 
KisStrokeJobStrategycreateCancelStrategy () override
 
KisStrokeJobStrategycreateDabStrategy () override
 
KisStrokeJobDatacreateFinishData () override
 
KisStrokeJobStrategycreateFinishStrategy () override
 
KisStrokeJobDatacreateInitData () override
 
KisStrokeJobStrategycreateInitStrategy () override
 
KisStrokeJobDatacreateResumeData () override
 
KisStrokeJobStrategycreateResumeStrategy () override
 
KisStrokeJobDatacreateSuspendData () override
 
KisStrokeJobStrategycreateSuspendStrategy () override
 
 KisSimpleStrokeStrategy (const QLatin1String &id, const KUndo2MagicString &name=KUndo2MagicString())
 
- Public Member Functions inherited from KisStrokeStrategy
qreal balancingRatioOverride () const
 
bool canForgetAboutMe () const
 
bool clearsRedoOnStart () const
 
KisLodPreferences currentLodPreferences () const
 
bool forceLodModeIfPossible () const
 
QString id () const
 
bool isAsynchronouslyCancellable () const
 
bool isExclusive () const
 
 KisStrokeStrategy (const QLatin1String &id, const KUndo2MagicString &name=KUndo2MagicString())
 
KUndo2MagicString name () const
 
bool needsExplicitCancel () const
 
bool requestsOtherStrokesToEnd () const
 
void setForceLodModeIfPossible (bool forceLodModeIfPossible)
 
void setMutatedJobsInterface (KisStrokesQueueMutatedJobInterface *mutatedJobsInterface, KisStrokeId strokeId)
 
bool supportsWrapAroundMode () const
 
virtual void tryCancelCurrentStrokeJobAsync ()
 tryCancelCurrentStrokeJobAsync is called by the strokes queue when the stroke is being cancelled. The stroke strategy may or may not handle this request and cancel the currently running long action.
 
virtual ~KisStrokeStrategy ()
 

Protected Member Functions

 FreehandStrokeStrategy (const FreehandStrokeStrategy &rhs, int levelOfDetail)
 
- Protected Member Functions inherited from KisPainterBasedStrokeStrategy
KisSelectionSP activeSelection () const
 
QVector< KisRunnableStrokeJobData * > doMaskingBrushUpdates (const QVector< QRect > &rects)
 
 KisPainterBasedStrokeStrategy (const KisPainterBasedStrokeStrategy &rhs, int levelOfDetail)
 
KisMaskedFreehandStrokePaintermaskedPainter (int strokeInfoId)
 
bool needsMaskingUpdates () const
 
int numMaskedPainters () const
 
void setSupportsContinuedInterstrokeData (bool value)
 
void setSupportsIndirectPainting (bool value)
 
void setSupportsMaskingBrush (bool value)
 
void setSupportsTimedMergeId (bool value)
 
void setUndoEnabled (bool value)
 
bool supportsContinuedInterstrokeData () const
 
bool supportsIndirectPainting () const
 
bool supportsMaskingBrush () const
 
bool supportsTimedMergeId () const
 
KisPaintDeviceSP targetDevice () const
 
KisNodeSP targetNode () const
 
- Protected Member Functions inherited from KisSimpleStrokeStrategy
void enableJob (JobType type, bool enable=true, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
 
 KisSimpleStrokeStrategy (const KisSimpleStrokeStrategy &rhs)
 
- Protected Member Functions inherited from KisStrokeStrategy
void addMutatedJob (KisStrokeJobData *data)
 
void addMutatedJobs (const QVector< KisStrokeJobData * > list)
 
 KisStrokeStrategy (const KisStrokeStrategy &rhs)
 
void setAsynchronouslyCancellable (bool value)
 
void setBalancingRatioOverride (qreal value)
 
void setCanForgetAboutMe (bool value)
 
void setClearsRedoOnStart (bool value)
 
void setExclusive (bool value)
 
void setNeedsExplicitCancel (bool value)
 
void setRequestsOtherStrokesToEnd (bool value)
 
void setSupportsWrapAroundMode (bool value)
 

Private Member Functions

void init (FreehandStrokeStrategy::Flags flags)
 
void issueSetDirtySignals ()
 
void tryDoUpdate (bool forceEnd=false)
 

Private Attributes

const QScopedPointer< Privatem_d
 

Additional Inherited Members

- Static Public Member Functions inherited from KisSimpleStrokeStrategy
static QLatin1String jobTypeToString (JobType type)
 

Detailed Description

Definition at line 23 of file freehand_stroke.h.

Member Enumeration Documentation

◆ Flag

Enumerator
None 
SupportsContinuedInterstrokeData 
SupportsTimedMergeId 

Definition at line 26 of file freehand_stroke.h.

Constructor & Destructor Documentation

◆ FreehandStrokeStrategy() [1/3]

FreehandStrokeStrategy::FreehandStrokeStrategy ( KisResourcesSnapshotSP resources,
KisFreehandStrokeInfo * strokeInfo,
const KUndo2MagicString & name,
Flags flags = None )

Definition at line 69 of file freehand_stroke.cpp.

73 : KisPainterBasedStrokeStrategy(QLatin1String("FREEHAND_STROKE"), name,
74 resources, strokeInfo),
75 m_d(new Private(resources))
76{
77 init(flags);
78}
const QScopedPointer< Private > m_d
KisPainterBasedStrokeStrategy(const QLatin1String &id, const KUndo2MagicString &name, KisResourcesSnapshotSP resources, QVector< KisFreehandStrokeInfo * > strokeInfos)
KUndo2MagicString name() const

References KisPainterBasedStrokeStrategy::init().

◆ FreehandStrokeStrategy() [2/3]

FreehandStrokeStrategy::FreehandStrokeStrategy ( KisResourcesSnapshotSP resources,
QVector< KisFreehandStrokeInfo * > strokeInfos,
const KUndo2MagicString & name,
Flags flags = None )

Definition at line 80 of file freehand_stroke.cpp.

84 : KisPainterBasedStrokeStrategy(QLatin1String("FREEHAND_STROKE"), name,
85 resources, strokeInfos),
86 m_d(new Private(resources))
87{
88 init(flags);
89}

References KisPainterBasedStrokeStrategy::init().

◆ ~FreehandStrokeStrategy()

FreehandStrokeStrategy::~FreehandStrokeStrategy ( )
override

Definition at line 98 of file freehand_stroke.cpp.

99{
100 KisStrokeSpeedMonitor::instance()->notifyStrokeFinished(m_d->efficiencyMeasurer.averageCursorSpeed(),
101 m_d->efficiencyMeasurer.averageRenderingSpeed(),
102 m_d->efficiencyMeasurer.averageFps(),
103 m_d->resources->currentPaintOpPreset());
104
106}
static KisStrokeSpeedMonitor * instance()
void notifyStrokeFinished(qreal cursorSpeed, qreal renderingSpeed, qreal fps, KisPaintOpPresetSP preset)
static KisUpdateTimeMonitor * instance()

References KisUpdateTimeMonitor::endStrokeMeasure(), KisUpdateTimeMonitor::instance(), KisStrokeSpeedMonitor::instance(), m_d, and KisStrokeSpeedMonitor::notifyStrokeFinished().

◆ FreehandStrokeStrategy() [3/3]

FreehandStrokeStrategy::FreehandStrokeStrategy ( const FreehandStrokeStrategy & rhs,
int levelOfDetail )
protected

Definition at line 91 of file freehand_stroke.cpp.

92 : KisPainterBasedStrokeStrategy(rhs, levelOfDetail),
93 m_d(new Private(*rhs.m_d))
94{
95 m_d->randomSource.setLevelOfDetail(levelOfDetail);
96}

References m_d.

Member Function Documentation

◆ createLodClone()

KisStrokeStrategy * FreehandStrokeStrategy::createLodClone ( int levelOfDetail)
overridevirtual

Reimplemented from KisStrokeStrategy.

Definition at line 331 of file freehand_stroke.cpp.

332{
333 if (!m_d->resources->presetAllowsLod()) return 0;
334 if (!m_d->resources->currentNode()->supportsLodPainting()) return 0;
335
336 FreehandStrokeStrategy *clone = new FreehandStrokeStrategy(*this, levelOfDetail);
337 return clone;
338}
FreehandStrokeStrategy(KisResourcesSnapshotSP resources, KisFreehandStrokeInfo *strokeInfo, const KUndo2MagicString &name, Flags flags=None)

References FreehandStrokeStrategy(), and m_d.

◆ doStrokeCallback()

void FreehandStrokeStrategy::doStrokeCallback ( KisStrokeJobData * data)
overridevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 143 of file freehand_stroke.cpp.

144{
147
148 // this job is lod-clonable in contrast to FreehandStrokeRunnableJobDataWithUpdate!
149 tryDoUpdate(d->forceUpdate);
150
151 } else if (Data *d = dynamic_cast<Data*>(data)) {
153
155 KisRandomSourceSP rnd = m_d->randomSource.source();
156 KisPerStrokeRandomSourceSP strokeRnd = m_d->randomSource.perStrokeSource();
157
158 switch(d->type) {
159 case Data::POINT:
160 d->pi1.setRandomSource(rnd);
161 d->pi1.setPerStrokeRandomSource(strokeRnd);
162 maskedPainter->paintAt(d->pi1);
163 m_d->efficiencyMeasurer.addSample(d->pi1.pos());
164 break;
165 case Data::LINE:
166 d->pi1.setRandomSource(rnd);
167 d->pi2.setRandomSource(rnd);
168 d->pi1.setPerStrokeRandomSource(strokeRnd);
169 d->pi2.setPerStrokeRandomSource(strokeRnd);
170 maskedPainter->paintLine(d->pi1, d->pi2);
171 m_d->efficiencyMeasurer.addSample(d->pi2.pos());
172 break;
173 case Data::CURVE:
174 d->pi1.setRandomSource(rnd);
175 d->pi2.setRandomSource(rnd);
176 d->pi1.setPerStrokeRandomSource(strokeRnd);
177 d->pi2.setPerStrokeRandomSource(strokeRnd);
179 d->control1,
180 d->control2,
181 d->pi2);
182 m_d->efficiencyMeasurer.addSample(d->pi2.pos());
183 break;
184 case Data::POLYLINE:
185 maskedPainter->paintPolyline(d->points, 0, d->points.size());
186 m_d->efficiencyMeasurer.addSamples(d->points);
187 break;
188 case Data::POLYGON:
189 maskedPainter->paintPolygon(d->points);
190 m_d->efficiencyMeasurer.addSamples(d->points);
191 break;
192 case Data::RECT:
193 maskedPainter->paintRect(d->rect);
194 m_d->efficiencyMeasurer.addSample(d->rect.topLeft());
195 m_d->efficiencyMeasurer.addSample(d->rect.topRight());
196 m_d->efficiencyMeasurer.addSample(d->rect.bottomRight());
197 m_d->efficiencyMeasurer.addSample(d->rect.bottomLeft());
198 break;
199 case Data::ELLIPSE:
201 // TODO: add speed measures
202 break;
205 // TODO: add speed measures
206 break;
208 maskedPainter->drawPainterPath(d->path, d->pen);
209 break;
211 maskedPainter->drawAndFillPainterPath(d->path, d->pen, d->customColor);
212 break;
213 };
214
215 tryDoUpdate();
216 } else {
218
220 dynamic_cast<FreehandStrokeRunnableJobDataWithUpdate*>(data);
221
222 if (dataWithUpdate) {
223 tryDoUpdate();
224 }
225 }
226}
void tryDoUpdate(bool forceEnd=false)
void paintPolygon(const QVector< QPointF > &points)
void paintPainterPath(const QPainterPath &path)
void paintAt(const KisPaintInformation &pi)
void drawPainterPath(const QPainterPath &path, const QPen &pen)
void paintBezierCurve(const KisPaintInformation &pi1, const QPointF &control1, const QPointF &control2, const KisPaintInformation &pi2)
void paintLine(const KisPaintInformation &pi1, const KisPaintInformation &pi2)
void drawAndFillPainterPath(const QPainterPath &path, const QPen &pen, const KoColor &customColor)
void paintPolyline(const QVector< QPointF > &points, int index=0, int numPoints=-1)
KisMaskedFreehandStrokePainter * maskedPainter(int strokeInfoId)
virtual void doStrokeCallback(KisStrokeJobData *data)
void reportPaintOpPreset(KisPaintOpPresetSP preset)

References FreehandStrokeStrategy::Data::CURVE, KisSimpleStrokeStrategy::doStrokeCallback(), KisMaskedFreehandStrokePainter::drawAndFillPainterPath(), KisMaskedFreehandStrokePainter::drawPainterPath(), FreehandStrokeStrategy::Data::ELLIPSE, KisUpdateTimeMonitor::instance(), FreehandStrokeStrategy::Data::LINE, m_d, KisPainterBasedStrokeStrategy::maskedPainter(), KisMaskedFreehandStrokePainter::paintAt(), KisMaskedFreehandStrokePainter::paintBezierCurve(), KisMaskedFreehandStrokePainter::paintEllipse(), FreehandStrokeStrategy::Data::PAINTER_PATH, KisMaskedFreehandStrokePainter::paintLine(), KisMaskedFreehandStrokePainter::paintPainterPath(), KisMaskedFreehandStrokePainter::paintPolygon(), KisMaskedFreehandStrokePainter::paintPolyline(), KisMaskedFreehandStrokePainter::paintRect(), FreehandStrokeStrategy::Data::POINT, FreehandStrokeStrategy::Data::POLYGON, FreehandStrokeStrategy::Data::POLYLINE, KisMaskedFreehandStrokePainter::preset(), FreehandStrokeStrategy::Data::QPAINTER_PATH, FreehandStrokeStrategy::Data::QPAINTER_PATH_FILL, FreehandStrokeStrategy::Data::RECT, KisUpdateTimeMonitor::reportPaintOpPreset(), and tryDoUpdate().

◆ finishStrokeCallback()

void FreehandStrokeStrategy::finishStrokeCallback ( )
overridevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 136 of file freehand_stroke.cpp.

137{
138 m_d->efficiencyMeasurer.notifyRenderingFinished();
140}

References KisPainterBasedStrokeStrategy::finishStrokeCallback(), and m_d.

◆ init()

void FreehandStrokeStrategy::init ( FreehandStrokeStrategy::Flags flags)
private

In case the paintop uses asynchronous updates, we should set priority to it, because FPS is controlled separately, not by the queue's merging algorithm.

Definition at line 108 of file freehand_stroke.cpp.

109{
115
117
118 if (m_d->needsAsynchronousUpdates) {
123 setBalancingRatioOverride(0.01); // set priority to updates
124 }
125
127 m_d->efficiencyMeasurer.setEnabled(KisStrokeSpeedMonitor::instance()->haveStrokeSpeedMeasurement());
128}
void enableJob(JobType type, bool enable=true, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
void setBalancingRatioOverride(qreal value)
void setSupportsWrapAroundMode(bool value)

References KisSimpleStrokeStrategy::enableJob(), KisUpdateTimeMonitor::instance(), KisStrokeSpeedMonitor::instance(), KisSimpleStrokeStrategy::JOB_DOSTROKE, m_d, KisStrokeStrategy::setBalancingRatioOverride(), KisPainterBasedStrokeStrategy::setSupportsContinuedInterstrokeData(), KisPainterBasedStrokeStrategy::setSupportsIndirectPainting(), KisPainterBasedStrokeStrategy::setSupportsMaskingBrush(), KisPainterBasedStrokeStrategy::setSupportsTimedMergeId(), KisStrokeStrategy::setSupportsWrapAroundMode(), KisUpdateTimeMonitor::startStrokeMeasure(), SupportsContinuedInterstrokeData, and SupportsTimedMergeId.

◆ initStrokeCallback()

void FreehandStrokeStrategy::initStrokeCallback ( )
overridevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 130 of file freehand_stroke.cpp.

131{
133 m_d->efficiencyMeasurer.notifyRenderingStarted();
134}

References KisPainterBasedStrokeStrategy::initStrokeCallback(), and m_d.

◆ issueSetDirtySignals()

void FreehandStrokeStrategy::issueSetDirtySignals ( )
private

Definition at line 281 of file freehand_stroke.cpp.

282{
283 QVector<QRect> dirtyRects;
284
285 for (int i = 0; i < numMaskedPainters(); i++) {
287 dirtyRects.append(maskedPainter->takeDirtyRegion());
288 }
289
290 if (needsMaskingUpdates()) {
291
292 // optimize the rects so that they would never intersect with each other!
293 // that is a mandatory step for the multithreaded execution of merging jobs
294
295 // sanity check: updates from the brush should have already been normalized
296 // to the wrapping rect
297 const KisDefaultBoundsBaseSP defaultBounds = targetNode()->projection()->defaultBounds();
298 if (defaultBounds->wrapAroundMode()) {
299 const QRect wrapRect = defaultBounds->imageBorderRect();
300 for (auto it = dirtyRects.begin(); it != dirtyRects.end(); ++it) {
301 KIS_SAFE_ASSERT_RECOVER(wrapRect.contains(*it)) {
302 ENTER_FUNCTION() << ppVar(*it) << ppVar(wrapRect);
303 *it = *it & wrapRect;
304 }
305 }
306 }
307
308 const int maxPatchSizeForMaskingUpdates = 64;
309 const QRect totalRect =
310 std::accumulate(dirtyRects.constBegin(), dirtyRects.constEnd(), QRect(), std::bit_or<QRect>());
311
312 dirtyRects = KisPaintOpUtils::splitAndFilterDabRect(totalRect, dirtyRects, maxPatchSizeForMaskingUpdates);
313
315
317 [this, dirtyRects] () {
318 this->targetNode()->setDirty(dirtyRects);
319 }
320 );
321
323
324 } else {
325 targetNode()->setDirty(dirtyRects);
326 }
327
328 //KisUpdateTimeMonitor::instance()->reportJobFinished(data, dirtyRects);
329}
virtual bool wrapAroundMode() const =0
virtual QRect imageBorderRect() const
KisDefaultBoundsBaseSP defaultBounds() const
QVector< KisRunnableStrokeJobData * > doMaskingBrushUpdates(const QVector< QRect > &rects)
KisRunnableStrokeJobsInterface * runnableJobsInterface() const
virtual void addRunnableJobs(const QVector< KisRunnableStrokeJobDataBase * > &list)=0
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126
#define ENTER_FUNCTION()
Definition kis_debug.h:178
#define ppVar(var)
Definition kis_debug.h:155
QVector< QRect > splitAndFilterDabRect(const QRect &totalRect, const QVector< QRect > &dabRects, int idealPatchSize)
void addJobSequential(QVector< Job * > &jobs, Func func)
virtual KisPaintDeviceSP projection() const =0
virtual void setDirty()
Definition kis_node.cpp:577

References KritaUtils::addJobSequential(), KisRunnableStrokeJobsInterface::addRunnableJobs(), KisPaintDevice::defaultBounds(), KisPainterBasedStrokeStrategy::doMaskingBrushUpdates(), ENTER_FUNCTION, KisDefaultBoundsBase::imageBorderRect(), KIS_SAFE_ASSERT_RECOVER, KisPainterBasedStrokeStrategy::maskedPainter(), KisPainterBasedStrokeStrategy::needsMaskingUpdates(), KisPainterBasedStrokeStrategy::numMaskedPainters(), ppVar, KisBaseNode::projection(), KisRunnableBasedStrokeStrategy::runnableJobsInterface(), KisNode::setDirty(), KisPaintOpUtils::splitAndFilterDabRect(), KisMaskedFreehandStrokePainter::takeDirtyRegion(), KisPainterBasedStrokeStrategy::targetNode(), and KisDefaultBoundsBase::wrapAroundMode().

◆ notifyUserEndedStroke()

void FreehandStrokeStrategy::notifyUserEndedStroke ( )
overridevirtual

notifyUserEndedStroke() is a callback used by the strokes system to notify when the user ends the stroke. That moment corresponds to the user calling strokesFacade->endStroke(id) and might happen much earlier when the stroke even started its execution.

NOTE: this method will be executed in the context of the GUI thread!

Reimplemented from KisStrokeStrategy.

Definition at line 345 of file freehand_stroke.cpp.

346{
347 m_d->efficiencyMeasurer.notifyCursorMoveFinished();
348}

References m_d.

◆ notifyUserStartedStroke()

void FreehandStrokeStrategy::notifyUserStartedStroke ( )
overridevirtual

notifyUserStartedStroke() is a callback used by the strokes system to notify when the user adds the stroke to the strokes queue. That moment corresponds to the user calling strokesFacade->startStroke(strategy) and might happen much earlier than the first job being executed.

NOTE: this method will be executed in the context of the GUI thread!

Reimplemented from KisStrokeStrategy.

Definition at line 340 of file freehand_stroke.cpp.

341{
342 m_d->efficiencyMeasurer.notifyCursorMoveStarted();
343}

References m_d.

◆ tryDoUpdate()

void FreehandStrokeStrategy::tryDoUpdate ( bool forceEnd = false)
private

Definition at line 228 of file freehand_stroke.cpp.

229{
230 // we should enter this function only once!
231 std::unique_lock<std::mutex> entryLock(m_d->updateEntryMutex, std::try_to_lock);
232 if (!entryLock.owns_lock()) return;
233
234 if (m_d->needsAsynchronousUpdates) {
235 if (forceEnd || m_d->timeSinceLastUpdate.elapsed() > m_d->currentUpdatePeriod) {
236 m_d->timeSinceLastUpdate.restart();
237
238 for (int i = 0; i < numMaskedPainters(); i++) {
240
241 // TODO: well, we should count all N simultaneous painters for FPS rate!
243
244 bool needsMoreUpdates = false;
245
246 std::tie(m_d->currentUpdatePeriod, needsMoreUpdates) =
248
249 if (!jobs.isEmpty() ||
251 (forceEnd && needsMoreUpdates)) {
252
254 [this] () {
255 this->issueSetDirtySignals();
256 }
257 );
258
259 if (forceEnd && needsMoreUpdates) {
261 [this] () {
262 this->tryDoUpdate(true);
263 }
264 );
265 }
266
267
269 m_d->efficiencyMeasurer.notifyFrameRenderingStarted();
270 }
271
272 }
273 }
274 } else {
276 }
277
278
279}
std::pair< int, bool > doAsynchronousUpdate(QVector< KisRunnableStrokeJobData * > &jobs)

References KritaUtils::addJobSequential(), KisRunnableStrokeJobsInterface::addRunnableJobs(), KisMaskedFreehandStrokePainter::doAsynchronousUpdate(), KisMaskedFreehandStrokePainter::hasDirtyRegion(), issueSetDirtySignals(), m_d, KisPainterBasedStrokeStrategy::maskedPainter(), KisPainterBasedStrokeStrategy::numMaskedPainters(), KisRunnableBasedStrokeStrategy::runnableJobsInterface(), and tryDoUpdate().

Member Data Documentation

◆ m_d

const QScopedPointer<Private> FreehandStrokeStrategy::m_d
private

Definition at line 211 of file freehand_stroke.h.


The documentation for this class was generated from the following files: