Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_tile_data_interface.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2009 Dmitry Kazakov <dimula73@gmail.com>
3 * SPDX-FileCopyrightText: 2018 Andrey Kamakin <a.kamakin@icloud.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8#ifndef KIS_TILE_DATA_INTERFACE_H_
9#define KIS_TILE_DATA_INTERFACE_H_
10
11#include <QReadWriteLock>
12#include <QAtomicInt>
13
14#include "kis_lockless_stack.h"
16
17class KisTileData;
19
24#define __TILE_DATA_WIDTH 64
25#define __TILE_DATA_HEIGHT 64
26
28
29typedef QLinkedList<KisTileData*> KisTileDataList;
30typedef KisTileDataList::iterator KisTileDataListIterator;
31typedef KisTileDataList::const_iterator KisTileDataListConstIterator;
32
33
35{
36public:
37 SimpleCache() = default;
39
40 bool push(int pixelSize, quint8 *&ptr)
41 {
42 QReadLocker l(&m_cacheLock);
43 switch (pixelSize) {
44 case 4:
45 m_4Pool.push(ptr);
46 break;
47 case 8:
48 m_8Pool.push(ptr);
49 break;
50 case 16:
51 m_16Pool.push(ptr);
52 break;
53 default:
54 return false;
55 }
56
57 return true;
58 }
59
60 bool pop(int pixelSize, quint8 *&ptr)
61 {
62 QReadLocker l(&m_cacheLock);
63 switch (pixelSize) {
64 case 4:
65 return m_4Pool.pop(ptr);
66 case 8:
67 return m_8Pool.pop(ptr);
68 case 16:
69 return m_16Pool.pop(ptr);
70 default:
71 return false;
72 }
73 }
74
75 void clear();
76
77private:
78 QReadWriteLock m_cacheLock;
82};
83
84
88class KRITAIMAGE_EXPORT KisTileData
89{
90public:
91 KisTileData(qint32 pixelSize, const quint8 *defPixel, KisTileDataStore *store, bool checkFreeMemory = true);
92
93private:
94 KisTileData(const KisTileData& rhs, bool checkFreeMemory = true);
95
96public:
98
102 SWAPPED
103 };
104
108 inline quint8* data() const;
109 inline void setData(const quint8 *data);
110 inline quint32 pixelSize() const;
111
116 inline bool acquire();
117
122 inline bool release();
123
129 inline bool ref() const;
130
136 inline bool deref();
137
142 inline KisTileData* clone();
143
147 inline void blockSwapping();
148 inline void unblockSwapping();
149
153 inline KisChunk swapChunk() const;
154 inline void setSwapChunk(KisChunk chunk);
155
159 inline bool mementoed() const;
160 inline void setMementoed(bool value);
161
165 inline int age() const;
166 inline void resetAge();
167 inline void markOld();
168
173 inline qint32 numUsers() const;
174
181 inline bool historical() const;
182
188 void releaseMemory();
189
199 void allocateMemory();
200
209 static void releaseInternalPools();
210
211private:
212 void fillWithPixel(const quint8 *defPixel);
213
214 static quint8* allocateData(const qint32 pixelSize);
215 static void freeData(quint8 *ptr, const qint32 pixelSize);
216private:
217 friend class KisTileDataPooler;
218 friend class KisTileDataPoolerTest;
225
226private:
227 friend class KisTile;
228 friend class KisTileDataStore;
229
233
241
246 int m_tileNumber = -1;
247
248private:
254
255
264
270 //FIXME: make memory aligned
271 int m_age;
272
273
281 QReadWriteLock m_swapLock;
282
283private:
284 friend class KisLowMemoryTests;
285
290 mutable quint8* m_data;
291
296 mutable QAtomicInt m_usersCount;
297
301 mutable QAtomicInt m_refCount;
302
303
305 //qint32 m_timeStamp;
306
309
310public:
311 static const qint32 WIDTH;
312 static const qint32 HEIGHT;
313};
314
315#endif /* KIS_TILE_DATA_INTERFACE_H_ */
float value(const T *src, size_t ch)
QReadWriteLock m_swapLock
EnumTileDataState m_state
KisTileDataStore * m_store
KisTileDataCache m_clonesStack
static SimpleCache m_cache
static const qint32 HEIGHT
static const qint32 WIDTH
bool pop(int pixelSize, quint8 *&ptr)
KisLocklessStack< quint8 * > m_16Pool
bool push(int pixelSize, quint8 *&ptr)
QReadWriteLock m_cacheLock
SimpleCache()=default
KisLocklessStack< quint8 * > m_4Pool
KisLocklessStack< quint8 * > m_8Pool
KisTileDataList::iterator KisTileDataListIterator
KisTileDataList::const_iterator KisTileDataListConstIterator
QLinkedList< KisTileData * > KisTileDataList
KisLocklessStack< KisTileData * > KisTileDataCache