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 72 of file kis_suspend_projection_updates_stroke_strategy.cpp.

73 {
74 }

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 85 of file kis_suspend_projection_updates_stroke_strategy.cpp.

85 {
86 if (image->currentLevelOfDetail() > 0) return false;
87
88 QMutexLocker l(&m_mutex);
89
90 Q_FOREACH(const QRect &rc, rects) {
91 m_requestsHash[KisNodeSP(node)].append(Request(rc, flags));
92 }
93
94 return true;
95 }
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 97 of file kis_suspend_projection_updates_stroke_strategy.cpp.

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

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

◆ notifyUpdates()

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

Definition at line 109 of file kis_suspend_projection_updates_stroke_strategy.cpp.

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