45 virtual bool read(uint8_t resno,
grk_rect32 window, int32_t* dest,
const uint32_t destChunkY,
46 const uint32_t destChunkX) = 0;
50 virtual bool write(uint8_t resno,
grk_rect32 window,
const int32_t* src,
const uint32_t srcChunkY,
51 const uint32_t srcChunkX) = 0;
62 void alloc(uint32_t block_area,
bool zeroOutBuffer)
64 data =
new int32_t[block_area];
66 memset(
data, 0, block_area *
sizeof(int32_t));
70template<u
int32_t LBW, u
int32_t LBH>
78 throw std::runtime_error(
"invalid window for sparse canvas");
80 auto blockCount =
grid.area();
82 for(uint64_t i = 0; i < blockCount; ++i)
90 for(uint64_t i = 0; i < (uint64_t)
grid.width() *
grid.height(); i++)
98 bool read(uint8_t resno,
grk_rect32 window, int32_t* dest,
const uint32_t destChunkY,
99 const uint32_t destChunkX)
101 return readWrite(resno, window, dest, destChunkY, destChunkX,
true);
103 bool write(uint8_t resno,
grk_rect32 window,
const int32_t* src,
const uint32_t srcChunkY,
104 const uint32_t srcChunkX)
106 return readWrite(resno, window, (int32_t*)src, srcChunkY, srcChunkX,
false);
112 uint32_t blockWinHeight = 0;
113 uint32_t gridY = win.
y0 >> LBH;
114 for(uint32_t y = win.
y0; y < win.
y1; gridY++, y += blockWinHeight)
117 blockWinHeight = (std::min<uint32_t>)(blockWinHeight, win.
y1 - y);
118 uint32_t gridX = win.
x0 >> LBW;
119 uint32_t blockWinWidth = 0;
120 for(uint32_t x = win.
x0; x < win.
x1; gridX++, x += blockWinWidth)
123 blockWinWidth = (std::min<uint32_t>)(blockWinWidth, win.
x1 - x);
124 if(!
grid.contains(gridX, gridY))
126 grklog.warn(
"sparse canvas : attempt to allocate a block (%u,%u) outside block "
127 "grid bounds (%u,%u,%u,%u)",
131 auto srcBlock =
getBlock(gridX, gridY);
136 assert(
grid.contains(gridX, gridY));
138 uint64_t blockInd = (uint64_t)(gridY -
grid.y0) *
grid.width() + (gridX -
grid.x0);
149 uint64_t index = (uint64_t)(block_y -
grid.y0) *
grid.width() + (block_x -
grid.x0);
158 const uint32_t spacingY,
bool isReadOperation)
162 assert(!isReadOperation || buf);
166 grklog.warn(
"Sparse canvas @ res %u, attempt to read/write invalid window (%u,%u,%u,%u) "
167 "for bounds (%u,%u,%u,%u).",
172 assert(spacingY != 0 || win.
height() == 1);
173 assert((spacingY <= 1 && spacingX >= 1) || (spacingY >= 1 && spacingX == 1));
175 uint32_t gridY = win.
y0 >> LBH;
176 uint32_t blockWinHeight = 0;
177 for(uint32_t y = win.
y0; y < win.
y1; gridY++, y += blockWinHeight)
180 uint32_t blockOffsetY =
blockHeight - blockWinHeight;
181 blockWinHeight = (std::min<uint32_t>)(blockWinHeight, win.
y1 - y);
182 uint32_t gridX = win.
x0 >> LBW;
183 uint32_t blockWinWidth = 0;
184 for(uint32_t x = win.
x0; x < win.
x1; gridX++, x += blockWinWidth)
187 uint32_t blockOffsetX =
blockWidth - blockWinWidth;
188 blockWinWidth = (std::min<uint32_t>)(blockWinWidth, win.
x1 - x);
189 if(!
grid.contains(gridX, gridY))
191 grklog.warn(
"sparse canvas @ resno %u, Attempt to access a block (%u,%u) outside "
193 resno, gridX, gridY);
196 auto srcBlock =
getBlock(gridX, gridY);
199 grklog.warn(
"sparse canvas @ resno %u, %s op: missing block (%u,%u,%u,%u) for %s "
200 "(%u,%u,%u,%u). Skipping.",
209 auto src = srcBlock->data + ((uint64_t)blockOffsetY << LBW) + blockOffsetX;
210 auto dest = buf + (y - win.
y0) * spacingY + (x - win.
x0) * spacingX;
211 for(uint32_t blockY = 0; blockY < blockWinHeight; blockY++)
213 uint64_t destInd = 0;
214 for(uint32_t blockX = 0; blockX < blockWinWidth; blockX++)
216#ifdef GRK_DEBUG_VALGRIND
217 size_t val = grk_memcheck<int32_t>(src + blockX, 1);
218 if(val != grk_mem_ok)
219 grklog.error(
"sparse canvas @resno %u, read block(%u,%u) : "
220 "uninitialized at location (%u,%u)",
221 resno, gridX, gridY, x + blockX, y_);
223 dest[destInd] = src[blockX];
232 const int32_t* src =
nullptr;
234 src = buf + (y - win.
y0) * spacingY + (x - win.
x0) * spacingX;
235 auto dest = srcBlock->data + ((uint64_t)blockOffsetY << LBW) + blockOffsetX;
236 for(uint32_t blockY = 0; blockY < blockWinHeight; blockY++)
239 for(uint32_t blockX = 0; blockX < blockWinWidth; blockX++)
241#ifdef GRK_DEBUG_VALGRIND
244 grk_pt32 pt((uint32_t)(x + blockX), y_);
245 size_t val = grk_memcheck<int32_t>(src + srcInd, 1);
246 if(val != grk_mem_ok)
247 grklog.error(
"sparse canvas @ resno %u, write block(%u,%u): "
248 "uninitialized at location (%u,%u)",
249 resno, gridX, gridY, x + blockX, y_);
252 dest[blockX] = src ? src[srcInd] : 0;
Definition SparseCanvas.h:39
virtual ~ISparseCanvas()=default
virtual bool alloc(grk_rect32 window, bool zeroOutBuffer)=0
virtual bool read(uint8_t resno, grk_rect32 window, int32_t *dest, const uint32_t destChunkY, const uint32_t destChunkX)=0
Read window of data into dest buffer.
virtual bool write(uint8_t resno, grk_rect32 window, const int32_t *src, const uint32_t srcChunkY, const uint32_t srcChunkX)=0
Write window of data from src buffer.
SparseBlock * getBlock(uint32_t block_x, uint32_t block_y)
Definition SparseCanvas.h:147
grk_rect32 bounds
Definition SparseCanvas.h:269
SparseCanvas(uint32_t width, uint32_t height)
Definition SparseCanvas.h:85
const uint32_t blockWidth
Definition SparseCanvas.h:266
bool alloc(grk_rect32 win, bool zeroOutBuffer)
Definition SparseCanvas.h:108
SparseBlock ** blocks
Definition SparseCanvas.h:268
bool readWrite(uint8_t resno, grk_rect32 win, int32_t *buf, const uint32_t spacingX, const uint32_t spacingY, bool isReadOperation)
Definition SparseCanvas.h:157
~SparseCanvas()
Definition SparseCanvas.h:86
bool read(uint8_t resno, grk_rect32 window, int32_t *dest, const uint32_t destChunkY, const uint32_t destChunkX)
Read window of data into dest buffer.
Definition SparseCanvas.h:98
SparseCanvas(grk_rect32 bds)
Definition SparseCanvas.h:74
bool write(uint8_t resno, grk_rect32 window, const int32_t *src, const uint32_t srcChunkY, const uint32_t srcChunkX)
Write window of data from src buffer.
Definition SparseCanvas.h:103
const uint32_t blockHeight
Definition SparseCanvas.h:267
grk_rect32 grid
Definition SparseCanvas.h:270
bool isWindowValid(grk_rect32 win)
Definition SparseCanvas.h:152
Copyright (C) 2016-2025 Grok Image Compression Inc.
Definition ICacheable.h:20
grk_rect< uint32_t > grk_rect32
Definition geometry.h:61
grk_pt< uint32_t > grk_pt32
Definition geometry.h:40
Logger & grklog
Definition Logger.cpp:20
Definition SparseCanvas.h:56
SparseBlock(void)
Definition SparseCanvas.h:57
void alloc(uint32_t block_area, bool zeroOutBuffer)
Definition SparseCanvas.h:62
int32_t * data
Definition SparseCanvas.h:68
~SparseBlock()
Definition SparseCanvas.h:58
T y1
Definition geometry.h:125
T x0
Definition geometry.h:125
T x1
Definition geometry.h:125
T height() const
Definition geometry.h:339
bool valid(void) const
Definition geometry.h:186
T y0
Definition geometry.h:125