Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_random_accessor.cc
Go to the documentation of this file.
1/*
2 * copyright (c) 2006,2010 Cyrille Berger <cberger@cberger.net>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9
10#include <kis_debug.h>
11
12
13const quint32 KisRandomAccessor2::CACHESIZE = 4; // Define the number of tiles we keep in cache
14
15KisRandomAccessor2::KisRandomAccessor2(KisTiledDataManager *ktm, qint32 offsetX, qint32 offsetY, bool writable, KisIteratorCompleteListener *completeListener) :
16 m_ktm(ktm),
17 m_tilesCache(new KisTileInfo*[CACHESIZE]),
18 m_tilesCacheSize(0),
19 m_pixelSize(m_ktm->pixelSize()),
20 m_data(0),
21 m_oldData(0),
22 m_writable(writable),
23 m_lastX(0),
24 m_lastY(0),
25 m_offsetX(offsetX),
26 m_offsetY(offsetY),
27 m_completeListener(completeListener)
28{
29 Q_ASSERT(ktm != 0);
30}
31
33{
34 for (uint i = 0; i < m_tilesCacheSize; i++) {
35 unlockTile(m_tilesCache[i]->tile);
36 unlockOldTile(m_tilesCache[i]->oldtile);
37 delete m_tilesCache[i];
38 }
39 delete [] m_tilesCache;
40
43 }
44}
45
46void KisRandomAccessor2::moveTo(qint32 x, qint32 y)
47{
48 m_lastX = x;
49 m_lastY = y;
50
51 x -= m_offsetX;
52 y -= m_offsetY;
53
54 // Look in the cache if the tile if the data is available
55 for (uint i = 0; i < m_tilesCacheSize; i++) {
56 if (x >= m_tilesCache[i]->area_x1 && x <= m_tilesCache[i]->area_x2 &&
57 y >= m_tilesCache[i]->area_y1 && y <= m_tilesCache[i]->area_y2) {
58 KisTileInfo* kti = m_tilesCache[i];
59 quint32 offset = x - kti->area_x1 + (y - kti->area_y1) * KisTileData::WIDTH;
60 offset *= m_pixelSize;
61 m_data = kti->data + offset;
62 m_oldData = kti->oldData + offset;
63 if (i > 0) {
64 memmove(m_tilesCache + 1, m_tilesCache, i * sizeof(KisTileInfo*));
65 m_tilesCache[0] = kti;
66 }
67 return;
68 }
69 }
70 // The tile wasn't in cache
71 if (m_tilesCacheSize == KisRandomAccessor2::CACHESIZE) { // Remove last element of cache
74 delete m_tilesCache[CACHESIZE-1];
75 } else {
77 }
78 quint32 col = xToCol(x);
79 quint32 row = yToRow(y);
80 KisTileInfo* kti = fetchTileData(col, row);
81 quint32 offset = x - kti->area_x1 + (y - kti->area_y1) * KisTileData::WIDTH;
82 offset *= m_pixelSize;
83 m_data = kti->data + offset;
84 m_oldData = kti->oldData + offset;
86 m_tilesCache[0] = kti;
87}
88
89
91{
92 return m_data;
93}
94
95
96const quint8* KisRandomAccessor2::oldRawData() const
97{
98#ifdef DEBUG
99 if (!m_ktm->hasCurrentMemento()) warnTiles << "Accessing oldRawData() when no transaction is in progress.";
100#endif
101 return m_oldData;
102}
103
105{
106 return m_data;
107}
108
110{
111 KisTileInfo* kti = new KisTileInfo;
112
113 m_ktm->getTilesPair(col, row, m_writable, &kti->tile, &kti->oldtile);
114
115 lockTile(kti->tile);
116 kti->data = kti->tile->data();
117
118 lockOldTile(kti->oldtile);
119 kti->oldData = kti->oldtile->data();
120
121 kti->area_x1 = col * KisTileData::HEIGHT;
122 kti->area_y1 = row * KisTileData::WIDTH;
123 kti->area_x2 = kti->area_x1 + KisTileData::HEIGHT - 1;
124 kti->area_y2 = kti->area_y1 + KisTileData::WIDTH - 1;
125
126 return kti;
127}
128
130{
131 return m_ktm->numContiguousColumns(x - m_offsetX, 0, 0);
132}
133
135{
136 return m_ktm->numContiguousRows(y - m_offsetY, 0, 0);
137}
138
139qint32 KisRandomAccessor2::rowStride(qint32 x, qint32 y) const
140{
141 return m_ktm->rowStride(x - m_offsetX, y - m_offsetY);
142}
143
145{
146 return m_lastX;
147}
148
150{
151 return m_lastY;
152}
unsigned int uint
KisRandomAccessor2(KisTiledDataManager *ktm, qint32 offsetX, qint32 offsetY, bool writable, KisIteratorCompleteListener *completeListener)
void lockTile(KisTileSP &tile)
const quint8 * oldRawData() const override
quint8 * rawData() override
qint32 y() const override
void lockOldTile(KisTileSP &tile)
void unlockTile(KisTileSP &tile)
KisTileInfo * fetchTileData(qint32 col, qint32 row)
quint32 xToCol(quint32 x) const
qint32 numContiguousRows(qint32 y) const override
KisTileInfo ** m_tilesCache
const quint8 * rawDataConst() const override
KisIteratorCompleteListener * m_completeListener
qint32 rowStride(qint32 x, qint32 y) const override
qint32 x() const override
quint32 yToRow(quint32 y) const
qint32 numContiguousColumns(qint32 x) const override
void moveTo(qint32 x, qint32 y) override
Move to a given x,y position, fetch tiles and data.
static const quint32 CACHESIZE
KisTiledDataManager * m_ktm
void unlockOldTile(KisTileSP &tile)
static const qint32 HEIGHT
static const qint32 WIDTH
quint8 * data() const
Definition kis_tile.h:85
qint32 rowStride(qint32 x, qint32 y) const
qint32 numContiguousRows(qint32 y, qint32 minX, qint32 maxX) const
qint32 numContiguousColumns(qint32 x, qint32 minY, qint32 maxY) const
void getTilesPair(qint32 col, qint32 row, bool writable, KisTileSP *tile, KisTileSP *oldTile)
#define warnTiles
Definition kis_debug.h:91
The KisIteratorCompleteListener struct is a special interface for notifying the paint device that an ...
virtual void notifyWritableIteratorCompleted()=0