22#include <unordered_map>
44template<
typename T, u
int32_t LBW, u
int32_t LBH>
51 throw std::runtime_error(
"invalid window for sparse canvas");
60 bool read(uint8_t resno,
Rect32 window, T* dest,
const uint32_t destChunkY,
61 const uint32_t destChunkX)
63 return readWrite(resno, window, dest, destChunkY, destChunkX,
true);
65 bool write(uint8_t resno,
Rect32 window,
const T* src,
const uint32_t srcChunkY,
66 const uint32_t srcChunkX)
68 return readWrite(resno, window, (T*)src, srcChunkY, srcChunkX,
false);
74 uint32_t blockWinHeight = 0;
75 uint32_t gridY = win.
y0 >> LBH;
76 for(uint32_t y = win.
y0; y < win.
y1; gridY++, y += blockWinHeight)
79 blockWinHeight = (std::min<uint32_t>)(blockWinHeight, win.
y1 - y);
80 uint32_t gridX = win.
x0 >> LBW;
81 uint32_t blockWinWidth = 0;
82 for(uint32_t x = win.
x0; x < win.
x1; gridX++, x += blockWinWidth)
85 blockWinWidth = (std::min<uint32_t>)(blockWinWidth, win.
x1 - x);
86 if(!
grid.contains(gridX, gridY))
88 grklog.warn(
"sparse canvas : attempt to allocate a block (%u,%u) outside block "
89 "grid bounds (%u,%u,%u,%u)",
93 uint64_t blockInd = (uint64_t)(gridY -
grid.y0) *
grid.width() + (gridX -
grid.x0);
98 assert(
grid.contains(gridX, gridY));
110 uint64_t index = (uint64_t)(block_y -
grid.y0) *
grid.width() + (block_x -
grid.x0);
111 auto it =
blocks.find(index);
112 return it !=
blocks.end() ? it->second :
nullptr;
120 const uint32_t spacingY,
bool isReadOperation)
124 assert(!isReadOperation || buf);
128 grklog.warn(
"Sparse canvas @ res %u, attempt to read/write invalid window (%u,%u,%u,%u) "
129 "for bounds (%u,%u,%u,%u).",
134 assert(spacingY != 0 || win.
height() == 1);
135 assert((spacingY <= 1 && spacingX >= 1) || (spacingY >= 1 && spacingX == 1));
137 uint32_t gridY = win.
y0 >> LBH;
138 uint32_t blockWinHeight = 0;
139 for(uint32_t y = win.
y0; y < win.
y1; gridY++, y += blockWinHeight)
142 uint32_t blockOffsetY =
blockHeight - blockWinHeight;
143 blockWinHeight = (std::min<uint32_t>)(blockWinHeight, win.
y1 - y);
144 uint32_t gridX = win.
x0 >> LBW;
145 uint32_t blockWinWidth = 0;
146 for(uint32_t x = win.
x0; x < win.
x1; gridX++, x += blockWinWidth)
149 uint32_t blockOffsetX =
blockWidth - blockWinWidth;
150 blockWinWidth = (std::min<uint32_t>)(blockWinWidth, win.
x1 - x);
151 if(!
grid.contains(gridX, gridY))
153 grklog.warn(
"sparse canvas @ resno %u, Attempt to access a block (%u,%u) outside "
155 resno, gridX, gridY);
158 auto srcBlock =
getBlock(gridX, gridY);
161 grklog.warn(
"sparse canvas @ resno %u, %s op: missing block (%u,%u,%u,%u) for %s "
162 "(%u,%u,%u,%u). Skipping.",
171 auto src = srcBlock->data + ((uint64_t)blockOffsetY << LBW) + blockOffsetX;
172 auto dest = buf + (y - win.
y0) * spacingY + (x - win.
x0) * spacingX;
173 for(uint32_t blockY = 0; blockY < blockWinHeight; blockY++)
175 uint64_t destInd = 0;
176 for(uint32_t blockX = 0; blockX < blockWinWidth; blockX++)
178#ifdef GRK_DEBUG_VALGRIND
179 size_t val = grk_memcheck<int32_t>(src + blockX, 1);
180 if(val != grk_mem_ok)
181 grklog.error(
"sparse canvas @resno %u, read block(%u,%u) : "
182 "uninitialized at location (%u,%u)",
183 resno, gridX, gridY, x + blockX, y_);
185 dest[destInd] = src[blockX];
194 const T* src =
nullptr;
196 src = buf + (y - win.
y0) * spacingY + (x - win.
x0) * spacingX;
197 auto dest = srcBlock->data + ((uint64_t)blockOffsetY << LBW) + blockOffsetX;
198 for(uint32_t blockY = 0; blockY < blockWinHeight; blockY++)
201 for(uint32_t blockX = 0; blockX < blockWinWidth; blockX++)
203#ifdef GRK_DEBUG_VALGRIND
206 Point32 pt((uint32_t)(x + blockX), y_);
207 size_t val = grk_memcheck<int32_t>(src + srcInd, 1);
208 if(val != grk_mem_ok)
209 grklog.error(
"sparse canvas @ resno %u, write block(%u,%u): "
210 "uninitialized at location (%u,%u)",
211 resno, gridX, gridY, x + blockX, y_);
214 dest[blockX] = src ? src[srcInd] : 0;
230 std::unordered_map<uint64_t, SparseBlock<T>*>
blocks;
Definition ISparseCanvas.h:42
bool readWrite(uint8_t resno, Rect32 win, T *buf, const uint32_t spacingX, const uint32_t spacingY, bool isReadOperation)
Definition SparseCanvas.h:119
SparseBlock< T > * getBlock(uint32_t block_x, uint32_t block_y)
Definition SparseCanvas.h:108
const uint32_t blockWidth
Definition SparseCanvas.h:228
SparseCanvas(Rect32 bds)
Definition SparseCanvas.h:48
bool isWindowValid(Rect32 win)
Definition SparseCanvas.h:114
Rect32 bounds
Definition SparseCanvas.h:231
Rect32 grid
Definition SparseCanvas.h:232
const uint32_t blockHeight
Definition SparseCanvas.h:229
std::unordered_map< uint64_t, SparseBlock< T > * > blocks
Definition SparseCanvas.h:230
bool alloc(Rect32 win, bool zeroOutBuffer)
Definition SparseCanvas.h:70
SparseCanvas(uint32_t width, uint32_t height)
Definition SparseCanvas.h:54
bool read(uint8_t resno, Rect32 window, T *dest, const uint32_t destChunkY, const uint32_t destChunkX)
Read window of data into dest buffer.
Definition SparseCanvas.h:60
~SparseCanvas()
Definition SparseCanvas.h:55
bool write(uint8_t resno, Rect32 window, const T *src, const uint32_t srcChunkY, const uint32_t srcChunkX)
Write window of data from src buffer.
Definition SparseCanvas.h:65
ResWindow.
Definition CompressedChunkCache.h:36
ILogger & grklog
Definition Logger.cpp:24
Rect< uint32_t > Rect32
Definition geometry.h:64
Point< uint32_t > Point32
Definition geometry.h:42
bool valid(void) const
Definition geometry.h:246
T x1
Definition geometry.h:192
T height() const
Definition geometry.h:415
T x0
Definition geometry.h:192
T y0
Definition geometry.h:192
T y1
Definition geometry.h:192
Definition ISparseCanvas.h:60