48 Request(
const QRect &_rect, KisProjectionUpdateFlags _flags)
90 Q_FOREACH(
const QRect &rc, rects) {
102 Q_FOREACH(
const QRect &rc, rects) {
112 auto processRefreshes = [&] (
bool noFilthyUpdates) {
116 for (; it != end; ++it) {
119 QHash<QRect, QVector<QRect>> fullRefreshRequests;
121 bool invalidateFrames =
false;
134 auto reqIt = fullRefreshRequests.begin();
135 for (; reqIt != fullRefreshRequests.end(); ++reqIt) {
142 processRefreshes(
false);
143 processRefreshes(
true);
145 auto processUpdates = [&] (
bool noFilthyUpdates) {
149 for (; it != end; ++it) {
154 bool invalidateFrames =
false;
156 Q_FOREACH (
const Request &req, it.value()) {
158 dirtyRects += req.
rect;
174 processUpdates(
false);
175 processUpdates(
true);
346 const QRect totalRect =
348 std::accumulate(totalDirtyRects.begin(), totalDirtyRects.end(), QRect(), std::bit_or<QRect>());
358 Q_FOREACH (
const QRect &rc,
m_strategy->
m_d->accumulatedDirtyRects) {
426 QLatin1String(
"suspend_stroke_strategy") :
427 QLatin1String(
"resume_stroke_strategy")),
431 m_d->suspend = suspend;
432 m_d->sharedData = sharedData;
455 qDeleteAll(
m_d->executedCommands);
520 m_d->executedCommands.append(command);
542 if (!this->
sharedData->installedFilterCookie)
return;
560 filter->notifyUpdates(image.
data());
562 if (!filter->explicitUIUpdateRequest().isEmpty()) {
563 accumulatedDirtyRects.append(filter->explicitUIUpdateRequest());
576 for (
auto it =
m_d->executedCommands.rbegin(); it !=
m_d->executedCommands.rend(); ++it) {
580 m_d->tryFetchUsedUpdatesFilter(image);
582 if (
m_d->haveDisabledGUILodSync) {
608 !
m_d->sanityResumingFinished ||
609 (
m_d->sanityResumingFinished &&
610 m_d->usedFilters.isEmpty() &&
611 m_d->accumulatedDirtyRects.isEmpty()));
613 for (
auto it =
m_d->executedCommands.rbegin(); it !=
m_d->executedCommands.rend(); ++it) {
628 m_d->executedCommands.clear();
void emitRequestLodPlanesSyncBlocked(bool value)
void emitNotifyBatchUpdateStarted()
void emitNotifyBatchUpdateEnded()
void disableUIUpdates() override
void refreshGraphAsync(KisNodeSP root, const QVector< QRect > &rects, const QRect &cropRect, KisProjectionUpdateFlags flags=KisProjectionUpdateFlag::None) override
KisProjectionUpdatesFilterSP removeProjectionUpdatesFilter(KisProjectionUpdatesFilterCookie cookie) override
removes already installed filter from the stack of updates filers
KisProjectionUpdatesFilterCookie currentProjectionUpdatesFilter() const override
QVector< QRect > enableUIUpdates() override
int currentLevelOfDetail() const
KisImageSignalRouter * signalRouter()
QRect bounds() const override
KisProjectionUpdatesFilterCookie addProjectionUpdatesFilter(KisProjectionUpdatesFilterSP filter) override
void notifyProjectionUpdated(const QRect &rc) override
void requestProjectionUpdate(KisNode *node, const QVector< QRect > &rects, KisProjectionUpdateFlags flags) override
static KisRegion fromOverlappingRects(const QVector< QRect > &rects, int gridSize)
QVector< QRect > rects() const
KisRunnableStrokeJobsInterface * runnableJobsInterface() const
virtual void addRunnableJobs(const QVector< KisRunnableStrokeJobDataBase * > &list)=0
void enableJob(JobType type, bool enable=true, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
Exclusivity m_exclusivity
Sequentiality m_sequentiality
void setClearsRedoOnStart(bool value)
void setNeedsExplicitCancel(bool value)
void addExplicitUIUpdateRect(const QRect &rc) override
QHash< KisNodeSP, QVector< Request > > UpdatesHash
bool filterRefreshGraph(KisImage *image, KisNode *node, const QVector< QRect > &rects, const QRect &cropRect, KisProjectionUpdateFlags flags) override
UpdatesHash m_requestsHash
QRect explicitUIUpdateRequest() const
bool filter(KisImage *image, KisNode *node, const QVector< QRect > &rects, KisProjectionUpdateFlags flags) override
void notifyUpdates(KisImageSP image)
RefreshesHash m_refreshesHash
QRect m_explicitUIUpdateRequest
QHash< KisNodeSP, QVector< FullRefreshRequest > > RefreshesHash
static SharedDataSP createSharedData()
KisSuspendProjectionUpdatesStrokeStrategy(KisImageWSP image, bool suspend, SharedDataSP sharedData)
void suspendStrokeCallback() override
static QList< KisStrokeJobData * > createSuspendJobsData(KisImageWSP image)
void cancelStrokeCallback() override
const QScopedPointer< Private > m_d
static QList< KisStrokeJobData * > createResumeJobsData(KisImageWSP image)
void initStrokeCallback() override
void resumeStrokeCallback() override
~KisSuspendProjectionUpdatesStrokeStrategy() override
void doStrokeCallback(KisStrokeJobData *data) override
KisSharedPtr< T > toStrongRef() const
toStrongRef returns a KisSharedPtr which may be dereferenced.
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
QSharedPointer< T > toQShared(T *ptr)
uint qHash(const QRect &rc)
void * KisProjectionUpdatesFilterCookie
KisSharedPtr< KisNode > KisNodeSP
QVector< QRect > splitAndFilterDabRect(const QRect &totalRect, const QVector< QRect > &dabRects, int idealPatchSize)
BlockUILodSync(bool block, KisSuspendProjectionUpdatesStrokeStrategy *strategy)
KisSuspendProjectionUpdatesStrokeStrategy * m_strategy
KisSuspendProjectionUpdatesStrokeStrategy * m_strategy
EndBatchUIUpdatesCommand(KisSuspendProjectionUpdatesStrokeStrategy *strategy)
ResumeAndIssueGraphUpdatesCommand(Private *d)
StartBatchUIUpdatesCommand(KisSuspendProjectionUpdatesStrokeStrategy *strategy)
KisSuspendProjectionUpdatesStrokeStrategy * m_strategy
KisStrokeJobData::Exclusivity m_exclusivity
KisStrokeJobData::Sequentiality m_sequentiality
StrokeJobCommand(KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
FullRefreshRequest(const QRect &_rect, const QRect &_cropRect, KisProjectionUpdateFlags _flags)
KisProjectionUpdateFlags flags
Request(const QRect &_rect, KisProjectionUpdateFlags _flags)
KisProjectionUpdateFlags flags
SuspendUpdatesCommand(Private *d)
UndoableData(StrokeJobCommand *command)
QScopedPointer< StrokeJobCommand > m_command
KisSuspendProjectionUpdatesStrokeStrategy * m_strategy
UploadDataToUIData(const QRect &rc, int updateEpoch, KisSuspendProjectionUpdatesStrokeStrategy *strategy)
void tryFetchUsedUpdatesFilter(KisImageSP image)
QVector< StrokeJobCommand * > executedCommands
bool sanityResumingFinished
bool haveDisabledGUILodSync
QVector< QSharedPointer< SuspendLod0Updates > > usedFilters
void tryIssueRecordedDirtyRequests(KisImageSP image)
QVector< QRect > accumulatedDirtyRects