Krita Source Code Documentation
Loading...
Searching...
No Matches
KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates Class Reference
+ Inheritance diagram for KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates:

Classes

struct  FullRefreshRequest
 
struct  Request
 

Public Member Functions

void addExplicitUIUpdateRect (const QRect &rc) override
 
QRect explicitUIUpdateRequest () const
 
bool filter (KisImage *image, KisNode *node, const QVector< QRect > &rects, KisProjectionUpdateFlags flags) override
 
bool filterRefreshGraph (KisImage *image, KisNode *node, const QVector< QRect > &rects, const QRect &cropRect, KisProjectionUpdateFlags flags) override
 
void notifyUpdates (KisImageSP image)
 
 SuspendLod0Updates ()
 
- Public Member Functions inherited from KisProjectionUpdatesFilter
virtual ~KisProjectionUpdatesFilter ()
 

Private Types

typedef QHash< KisNodeSP, QVector< FullRefreshRequest > > RefreshesHash
 
typedef QHash< KisNodeSP, QVector< Request > > UpdatesHash
 

Private Attributes

QRect m_explicitUIUpdateRequest
 
QMutex m_mutex
 
RefreshesHash m_refreshesHash
 
UpdatesHash m_requestsHash
 

Detailed Description

Member Typedef Documentation

◆ RefreshesHash

◆ UpdatesHash

Constructor & Destructor Documentation

◆ SuspendLod0Updates()

KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::SuspendLod0Updates ( )
inline

Definition at line 74 of file kis_suspend_projection_updates_stroke_strategy.cpp.

75 {
76 }

Member Function Documentation

◆ addExplicitUIUpdateRect()

void KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::addExplicitUIUpdateRect ( const QRect & rc)
inlineoverridevirtual

◆ explicitUIUpdateRequest()

QRect KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::explicitUIUpdateRequest ( ) const
inline

◆ filter()

bool KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::filter ( KisImage * image,
KisNode * node,
const QVector< QRect > & rects,
KisProjectionUpdateFlags flags )
inlineoverridevirtual
Returns
true if an update should be dropped by the image

Implements KisProjectionUpdatesFilter.

Definition at line 87 of file kis_suspend_projection_updates_stroke_strategy.cpp.

87 {
88 if (image->currentLevelOfDetail() > 0) return false;
89
90 QMutexLocker l(&m_mutex);
91
92 Q_FOREACH(const QRect &rc, rects) {
93 m_requestsHash[KisNodeSP(node)].append(Request(rc, flags));
94 }
95
96 return true;
97 }
int currentLevelOfDetail() const
KisSharedPtr< KisNode > KisNodeSP
Definition kis_types.h:86

References KisImage::currentLevelOfDetail(), KisSuspendProjectionUpdatesStrokeStrategy::Private::image, m_mutex, and m_requestsHash.

◆ filterRefreshGraph()

bool KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::filterRefreshGraph ( KisImage * image,
KisNode * node,
const QVector< QRect > & rects,
const QRect & cropRect,
KisProjectionUpdateFlags flags )
inlineoverridevirtual

Implements KisProjectionUpdatesFilter.

Definition at line 99 of file kis_suspend_projection_updates_stroke_strategy.cpp.

99 {
100 if (image->currentLevelOfDetail() > 0) return false;
101
102 QMutexLocker l(&m_mutex);
103
104 Q_FOREACH(const QRect &rc, rects) {
105 m_refreshesHash[KisNodeSP(node)].append(FullRefreshRequest(rc, cropRect, flags));
106 }
107
108 return true;
109 }

References KisImage::currentLevelOfDetail(), KisSuspendProjectionUpdatesStrokeStrategy::Private::image, m_mutex, and m_refreshesHash.

◆ notifyUpdates()

void KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::notifyUpdates ( KisImageSP image)
inline

Definition at line 111 of file kis_suspend_projection_updates_stroke_strategy.cpp.

111 {
112 const int step = 64;
113
114 auto processRefreshes = [&] (bool noFilthyUpdates) {
115 RefreshesHash::const_iterator it = m_refreshesHash.constBegin();
116 RefreshesHash::const_iterator end = m_refreshesHash.constEnd();
117
118 for (; it != end; ++it) {
119 KisNodeSP node = it.key();
120
121 QHash<QRect, QVector<QRect>> fullRefreshRequests;
122
123 bool invalidateFrames = false;
124
125 Q_FOREACH (const FullRefreshRequest &req, it.value()) {
126 if (req.flags.testFlag(KisProjectionUpdateFlag::NoFilthy) == noFilthyUpdates) {
127 fullRefreshRequests[req.cropRect] += req.rect;
128 invalidateFrames |= !req.flags.testFlag(KisProjectionUpdateFlag::DontInvalidateFrames);
129 }
130 }
131
132 KisProjectionUpdateFlags finalFlags(KisProjectionUpdateFlag::None);
133 finalFlags.setFlag(KisProjectionUpdateFlag::DontInvalidateFrames, !invalidateFrames);
134 finalFlags.setFlag(KisProjectionUpdateFlag::NoFilthy, noFilthyUpdates);
135
136 auto reqIt = fullRefreshRequests.begin();
137 for (; reqIt != fullRefreshRequests.end(); ++reqIt) {
138 const QVector<QRect> simplifiedRects = KisRegion::fromOverlappingRects(reqIt.value(), step).rects();
139 image->refreshGraphAsync(node, simplifiedRects, reqIt.key(), finalFlags);
140 }
141 }
142 };
143
144 processRefreshes(false);
145 processRefreshes(true);
146
147 auto processUpdates = [&] (bool noFilthyUpdates) {
148 UpdatesHash::const_iterator it = m_requestsHash.constBegin();
149 UpdatesHash::const_iterator end = m_requestsHash.constEnd();
150
151 for (; it != end; ++it) {
152 KisNodeSP node = it.key();
153
154 QVector<QRect> dirtyRects;
155
156 bool invalidateFrames = false;
157
158 Q_FOREACH (const Request &req, it.value()) {
159 if (req.flags.testFlag(KisProjectionUpdateFlag::NoFilthy) == noFilthyUpdates) {
160 dirtyRects += req.rect;
161 invalidateFrames |= !req.flags.testFlag(KisProjectionUpdateFlag::DontInvalidateFrames);
162 }
163 }
164
165 KisProjectionUpdateFlags finalFlags(KisProjectionUpdateFlag::None);
166 finalFlags.setFlag(KisProjectionUpdateFlag::DontInvalidateFrames, !invalidateFrames);
167 finalFlags.setFlag(KisProjectionUpdateFlag::NoFilthy, noFilthyUpdates);
168
169 const QVector<QRect> simplifiedRects = KisRegion::fromOverlappingRects(dirtyRects, step).rects();
170
171 // FIXME: constness: port requestProjectionUpdate to shared pointers
172 image->requestProjectionUpdate(const_cast<KisNode*>(node.data()), simplifiedRects, finalFlags);
173 }
174 };
175
176 processUpdates(false);
177 processUpdates(true);
178 }
void refreshGraphAsync(KisNodeSP root, const QVector< QRect > &rects, const QRect &cropRect, KisProjectionUpdateFlags flags=KisProjectionUpdateFlag::None) 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

References KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::FullRefreshRequest::cropRect, KisSharedPtr< T >::data(), DontInvalidateFrames, KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::Request::flags, KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::FullRefreshRequest::flags, KisRegion::fromOverlappingRects(), KisSuspendProjectionUpdatesStrokeStrategy::Private::image, m_refreshesHash, m_requestsHash, NoFilthy, None, KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::Request::rect, KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::FullRefreshRequest::rect, KisRegion::rects(), KisImage::refreshGraphAsync(), and KisImage::requestProjectionUpdate().

Member Data Documentation

◆ m_explicitUIUpdateRequest

QRect KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::m_explicitUIUpdateRequest
private

◆ m_mutex

QMutex KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::m_mutex
private

◆ m_refreshesHash

RefreshesHash KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::m_refreshesHash
private

◆ m_requestsHash

UpdatesHash KisSuspendProjectionUpdatesStrokeStrategy::Private::SuspendLod0Updates::m_requestsHash
private

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