18
18
#ifndef KIS_TILE_DATA_STORE_H_
19
19
#define KIS_TILE_DATA_STORE_H_
21
#include "krita_export.h"
22
23
#include <QReadWriteLock>
23
#include "kis_tile_data.h"
24
#include "kis_tile_data_interface.h"
25
26
#include "kis_tile_data_pooler.h"
27
#include "swap/kis_tile_data_swapper.h"
28
#include "swap/kis_swapped_data_store.h"
30
class KisTileDataStoreIterator;
31
class KisTileDataStoreReverseIterator;
32
class KisTileDataStoreClockIterator;
29
35
* Stores tileData objects. When needed compresses them and swaps.
31
class KisTileDataStore
37
class KRITAIMAGE_EXPORT KisTileDataStore
43
static KisTileDataStore* instance();
35
45
~KisTileDataStore();
37
47
void debugPrintList();
39
void ensureTileDataLoaded(const KisTileData *td);
40
KisTileData *duplicateTileData(KisTileData *rhs);
44
* Increments usersCount of a TD and refs shared pointer counter
45
* Used by KisTile for COW
47
inline quint32 acquireTileData(const KisTileData *td) const {
48
qint32 ref = refTileData(td);
49
td->m_usersCount.ref();
54
* Decrements usersCount of a TD and derefs shared pointer counter
55
* Used by KisTile for COW
57
inline quint32 releaseTileData(KisTileData *td) {
58
td->m_usersCount.deref();
59
qint32 ref = derefTileData(td);
64
* Only refs shared pointer counter.
65
* Used only by KisMementoManager without
66
* consideration of COW.
68
inline quint32 refTileData(const KisTileData *td) const {
69
return td->m_refCount.ref();
73
* Only refs shared pointer counter.
74
* Used only by KisMementoManager without
75
* consideration of COW.
77
inline quint32 derefTileData(KisTileData *td) {
78
if (!(td->m_refCount.deref())) {
82
return td->m_refCount;
50
* Returns total number of tiles present: in memory
53
inline qint32 numTiles() const {
54
return m_numTiles + m_swappedStore.numTiles();
58
* Returns the number of tiles present in memory only
60
inline qint32 numTilesInMemory() const {
64
inline void checkFreeMemory() {
65
m_swapper.checkFreeMemory();
71
inline qint64 memoryMetric() const {
72
return m_memoryMetric;
75
KisTileDataStoreIterator* beginIteration();
76
void endIteration(KisTileDataStoreIterator* iterator);
78
KisTileDataStoreReverseIterator* beginReverseIteration();
79
void endIteration(KisTileDataStoreReverseIterator* iterator);
81
KisTileDataStoreClockIterator* beginClockIteration();
82
void endIteration(KisTileDataStoreClockIterator* iterator);
85
84
inline KisTileData* createDefaultTileData(qint32 pixelSize, const quint8 *defPixel) {
86
85
return allocTileData(pixelSize, defPixel);
89
88
// Called by The Memento Manager after every commit
90
89
inline void kickPooler() {
92
//FIXME: maybe, rename a function?
97
* Try swap out the tile data.
98
* It may fail in case the tile is being accessed
99
* at the same moment of time.
101
bool trySwapTileData(KisTileData *td);
105
* WARN: The following three method are only for usage
106
* in KisTileData. Do not call them directly!
109
KisTileData *duplicateTileData(KisTileData *rhs);
111
void freeTileData(KisTileData *td);
114
* Ensures that the tile data is totally present in memory
115
* and it's swapping is blocked by holding td->m_swapLock
117
* PRECONDITIONS: td->m_swapLock is *unlocked*
118
* m_listRWLock is *unlocked*
119
* POSTCONDITIONS: td->m_data is in memory and
120
* td->m_swapLock is locked
121
* m_listRWLock is unlocked
123
void ensureTileDataLoaded(KisTileData *td);
95
126
KisTileData *allocTileData(qint32 pixelSize, const quint8 *defPixel);
96
void freeTileData(KisTileData *td);
98
void tileListAppend(KisTileData *td);
99
void tileListDetach(KisTileData *td);
100
void tileListClear();
128
void registerTileData(KisTileData *td);
129
void unregisterTileData(KisTileData *td);
130
inline void registerTileDataImp(KisTileData *td);
131
inline void unregisterTileDataImp(KisTileData *td);
132
void freeRegisteredTiles();
103
friend class KisTileDataPooler;
104
137
KisTileDataPooler m_pooler;
106
QReadWriteLock m_listRWLock;
107
KisTileData *m_tileDataListHead;
138
KisTileDataSwapper m_swapper;
140
friend class KisTileDataStoreTest;
141
KisSwappedDataStore m_swappedStore;
143
KisTileDataListIterator m_clockIterator;
146
KisTileDataList m_tileDataList;
150
* This metric is used for computing the volume
151
* of memory occupied by tile data objects.
152
* metric = num_bytes / (KisTileData::WIDTH * KisTileData::HEIGHT)
154
qint64 m_memoryMetric;
110
extern KisTileDataStore globalTileDataStore;
112
157
#endif /* KIS_TILE_DATA_STORE_H_ */