Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_tile.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2004 C. Boemann <cbo@boemann.dk>
3 * (c) 2009 Dmitry Kazakov <dimula73@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7#ifndef KIS_TILE_H_
8#define KIS_TILE_H_
9
10#include <QReadWriteLock>
11
12#include <QMutex>
13#include <QAtomicPointer>
14
15#include <QRect>
16#include <QStack>
17
18#include <kis_shared.h>
19#include <kis_shared_ptr.h>
20
21#include "kis_tile_data.h"
22#include "kis_tile_data_store.h"
23
24//#define DEAD_TILES_SANITY_CHECK
25
26class KisTile;
28
30
31
40class KRITAIMAGE_EXPORT KisTile : public KisShared
41{
42public:
43 KisTile(qint32 col, qint32 row,
44 KisTileData *defaultTileData, KisMementoManager* mm);
45 KisTile(const KisTile& rhs, qint32 col, qint32 row, KisMementoManager* mm);
46 KisTile(const KisTile& rhs, KisMementoManager* mm);
47 KisTile(const KisTile& rhs);
48 ~KisTile();
49
58 void notifyDetachedFromDataManager();
59
65 void notifyDeadWithoutDetaching();
66
71 void notifyAttachedToDataManager(KisMementoManager *mm);
72
73public:
74
75 void debugPrintInfo();
76 void debugDumpTile();
77
78 void lockForRead() const;
79 void lockForWrite();
80 void unlockForWrite();
81 void unlockForRead() const;
82
83
84 /* this allows us work directly on tile's data */
85 inline quint8 *data() const {
86 return m_tileData->data();
87 }
88 inline void setData(const quint8 *data) {
89 m_tileData->setData(data);
90 }
91
92 inline qint32 row() const {
93 return m_row;
94 }
95 inline qint32 col() const {
96 return m_col;
97 }
98
99 inline QRect extent() const {
100 return m_extent;
101//QRect(m_col * KisTileData::WIDTH, m_row * KisTileData::HEIGHT,
102// KisTileData::WIDTH, KisTileData::HEIGHT);
103 }
104
105 inline KisTileSP next() const {
106 return m_nextTile;
107 }
108
109 void setNext(KisTileSP next) {
110 m_nextTile = next;
111 }
112
113 inline qint32 pixelSize() const {
114 /* don't lock here as pixelSize is constant */
115 return m_tileData->pixelSize();
116 }
117
118 inline KisTileData* tileData() const {
119 return m_tileData;
120 }
121
122private:
123 void init(qint32 col, qint32 row,
124 KisTileData *defaultTileData, KisMementoManager* mm);
125
126 inline void blockSwapping() const;
127 inline void unblockSwapping() const;
128
129 inline void safeReleaseOldTileData(KisTileData *td);
130
131private:
134 mutable volatile int m_lockCounter;
135
136 qint32 m_col;
137 qint32 m_row;
138
142 QRect m_extent;
143
148
149 QAtomicPointer<KisMementoManager> m_mementoManager;
150
158
163 mutable QMutex m_swapBarrierLock;
164
165
166#ifdef DEAD_TILES_SANITY_CHECK
167 QAtomicInt m_sanityHasBeenDetached;
168 QAtomicInt m_sanityIsDead;
169 QAtomicInt m_sanityMMHasBeenInitializedManually;
170 QAtomicInt m_sanityNumCOWHappened;
171 QAtomicInt m_sanityLockedForWrite;
172 mutable QAtomicInt m_sanityLockedForRead;
173
174 void sanityCheckIsNotDestroyedYet();
175 void sanityCheckIsNotLockedForWrite();
176#endif
177
178};
179
180#endif // KIS_TILE_H_
181
KisTileSP m_nextTile
Definition kis_tile.h:147
void setData(const quint8 *data)
Definition kis_tile.h:88
qint32 row() const
Definition kis_tile.h:92
QAtomicPointer< KisMementoManager > m_mementoManager
Definition kis_tile.h:149
void setNext(KisTileSP next)
Definition kis_tile.h:109
QMutex m_swapBarrierLock
Definition kis_tile.h:163
KisTileData * m_tileData
Definition kis_tile.h:132
qint32 col() const
Definition kis_tile.h:95
volatile int m_lockCounter
Definition kis_tile.h:134
QRect m_extent
Definition kis_tile.h:142
QRect extent() const
Definition kis_tile.h:99
KisTileData * tileData() const
Definition kis_tile.h:118
qint32 m_col
Definition kis_tile.h:136
KisTileSP next() const
Definition kis_tile.h:105
qint32 m_row
Definition kis_tile.h:137
QMutex m_COWMutex
Definition kis_tile.h:157
QStack< KisTileData * > m_oldTileData
Definition kis_tile.h:133
quint8 * data() const
Definition kis_tile.h:85
qint32 pixelSize() const
Definition kis_tile.h:113
KisSharedPtr< KisTile > KisTileSP
Definition kis_tile.h:27