81 int32_t* dest,
const uint32_t dest_col_stride,
82 const uint32_t dest_line_stride,
bool forgiving) = 0;
100 const int32_t* src,
const uint32_t src_col_stride,
101 const uint32_t src_line_stride,
bool forgiving) = 0;
121 void alloc(uint32_t block_area,
bool zeroOutBuffer)
123 data =
new int32_t[block_area];
125 memset(
data, 0, block_area *
sizeof(int32_t));
132 template<u
int32_t LBW, u
int32_t LBH>
147 throw std::runtime_error(
"invalid window for sparse buffer");
151 uint32_t grid_x = ceildivpow2<uint32_t>(
bounds.
x1, LBW);
152 uint32_t grid_y = ceildivpow2<uint32_t>(
bounds.
y1, LBH);
156 for(uint64_t i = 0; i < block_count; ++i)
183 const uint32_t dest_col_stride,
const uint32_t dest_line_stride,
bool forgiving)
185 return read_or_write(resno, window, dest, dest_col_stride, dest_line_stride, forgiving,
189 const int32_t* src,
const uint32_t src_col_stride,
const uint32_t src_line_stride,
192 return read_or_write(resno, window, (int32_t*)src, src_col_stride, src_line_stride,
201 uint32_t block_y = win.
y0 >> LBH;
202 for(uint32_t y = win.
y0; y < win.
y1; block_y++, y += y_incr)
205 y_incr = (std::min<uint32_t>)(y_incr, win.
y1 - y);
206 uint32_t block_x = win.
x0 >> LBW;
208 for(uint32_t x = win.
x0; x < win.
x1; block_x++, x += x_incr)
211 x_incr = (std::min<uint32_t>)(x_incr, win.
x1 - x);
214 GRK_ERROR(
"sparse buffer : attempt to allocate a block (%d,%d) outside block "
219 auto src_block =
getBlock(block_x, block_y);
253 const uint32_t buf_line_stride,
bool forgiving,
bool is_read_op)
258 if(forgiving && is_read_op)
260 GRK_WARN(
"Sparse buffer @ res %d, attempt to read invalid window (%d,%d,%d,%d). "
261 "Filling with zeros.",
262 resno, win.
x0, win.
y0, win.
x1, win.
y1);
263 for(uint32_t y = win.
y0; y < win.
y1; ++y)
265 int32_t* bufPtr = buf + (y - win.
y0) * buf_line_stride;
266 for(uint32_t x = win.
x0; x < win.
x1; ++x)
269 bufPtr += buf_col_stride;
277 const uint64_t line_stride = buf_line_stride;
278 const uint64_t col_stride = buf_col_stride;
279 uint32_t block_y = win.
y0 >> LBH;
281 for(uint32_t y = win.
y0; y < win.
y1; block_y++, y += y_incr)
285 y_incr = (std::min<uint32_t>)(y_incr, win.
y1 - y);
286 uint32_t block_x = win.
x0 >> LBW;
288 for(uint32_t x = win.
x0; x < win.
x1; block_x++, x += x_incr)
292 x_incr = (std::min<uint32_t>)(x_incr, win.
x1 - x);
295 GRK_ERROR(
"sparse buffer @ resno %d, Attempt to access a block (%d,%d) outside "
297 resno, block_x, block_y);
300 auto src_block =
getBlock(block_x, block_y);
304 GRK_WARN(
"sparse buffer @ resno %d, %s op: missing block (%d,%d,%d,%d) for %s "
306 resno, is_read_op ?
"read" :
"write",
310 is_read_op ?
"read" :
"write", win.
x0, win.
y0, win.
x1, win.
y1);
316 src_block->data + ((uint64_t)block_y_offset << LBW) + block_x_offset;
318 buf + (y - win.
y0) * line_stride + (x - win.
x0) * col_stride;
320 for(uint32_t j = 0; j < y_incr; j++)
323 for(uint32_t k = 0; k < x_incr; k++)
325 #ifdef GRK_DEBUG_VALGRIND
326 size_t val = grk_memcheck<int32_t>(src_ptr + k, 1);
327 if(val != grk_mem_ok)
328 GRK_ERROR(
"sparse buffer @resno %d, read block(%d,%d) : "
329 "uninitialized at location (%d,%d)",
330 resno, block_x, block_y, x + k, y_);
332 dest_ptr[ind] = src_ptr[k];
335 dest_ptr += line_stride;
344 src_ptr = buf + (y - win.
y0) * line_stride + (x - win.
x0) * col_stride;
346 src_block->data + ((uint64_t)block_y_offset << LBW) + block_x_offset;
349 for(uint32_t j = 0; j < y_incr; j++)
352 for(uint32_t k = 0; k < x_incr; k++)
354 #ifdef GRK_DEBUG_VALGRIND
358 size_t val = grk_memcheck<int32_t>(src_ptr + ind, 1);
359 if(val != grk_mem_ok)
360 GRK_ERROR(
"sparse buffer @ resno %d, write block(%d,%d): "
361 "uninitialized at location (%d,%d)",
362 resno, block_x, block_y, x + k, y_);
365 dest_ptr[k] = src_ptr ? src_ptr[ind] : 0;
369 src_ptr += line_stride;
Definition: SparseCanvas.h:61
virtual ~ISparseCanvas()=default
virtual bool alloc(grkRectU32 window, bool zeroOutBuffer)=0
Allocate all blocks for a rectangular window into the sparse buffer from a user buffer.
virtual bool read(uint8_t resno, eBandOrientation bandOrientation, grkRectU32 window, int32_t *dest, const uint32_t dest_col_stride, const uint32_t dest_line_stride, bool forgiving)=0
Read the content of a rectangular window of the sparse buffer into a user buffer.
virtual bool write(uint8_t resno, eBandOrientation bandOrientation, grkRectU32 window, const int32_t *src, const uint32_t src_col_stride, const uint32_t src_line_stride, bool forgiving)=0
Write the content of a rectangular window into the sparse buffer from a user buffer.
Definition: SparseCanvas.h:134
grkRectU32 bounds
Definition: SparseCanvas.h:384
const uint32_t block_height
Definition: SparseCanvas.h:382
SparseCanvas(uint32_t width, uint32_t height)
SparseCanvas constructor.
Definition: SparseCanvas.h:169
bool is_window_valid(grkRectU32 win)
Returns whether window bounds are valid (non empty and within bounds)
Definition: SparseCanvas.h:247
SparseCanvas(grkRectU32 bds)
SparseCanvas constructor.
Definition: SparseCanvas.h:143
bool alloc(grkRectU32 win, bool zeroOutBuffer)
Allocate all blocks for a rectangular window into the sparse buffer from a user buffer.
Definition: SparseCanvas.h:195
SparseBlock * getBlock(uint32_t block_x, uint32_t block_y)
Definition: SparseCanvas.h:237
~SparseCanvas()
Definition: SparseCanvas.h:170
grkRectU32 grid_bounds
Definition: SparseCanvas.h:385
SparseBlock ** data_blocks
Definition: SparseCanvas.h:383
bool write(uint8_t resno, eBandOrientation bandOrientation, grkRectU32 window, const int32_t *src, const uint32_t src_col_stride, const uint32_t src_line_stride, bool forgiving)
Write the content of a rectangular window into the sparse buffer from a user buffer.
Definition: SparseCanvas.h:188
bool read_or_write(uint8_t resno, grkRectU32 win, int32_t *buf, const uint32_t buf_col_stride, const uint32_t buf_line_stride, bool forgiving, bool is_read_op)
Definition: SparseCanvas.h:252
bool read(uint8_t resno, eBandOrientation bandOrientation, grkRectU32 window, int32_t *dest, const uint32_t dest_col_stride, const uint32_t dest_line_stride, bool forgiving)
Read the content of a rectangular window of the sparse buffer into a user buffer.
Definition: SparseCanvas.h:182
const uint32_t block_width
Definition: SparseCanvas.h:381
#define GRK_RESTRICT
Definition: grk_includes.h:77
Copyright (C) 2016-2021 Grok Image Compression Inc.
Definition: ICacheable.h:20
grkRect< uint32_t > grkRectU32
Definition: util.h:56
static uint32_t floordivpow2(uint32_t a, uint32_t b)
Divide an unsigned integer by a power of 2 and round downwards.
Definition: grk_intmath.h:48
void GRK_ERROR(const char *fmt,...)
Definition: logger.cpp:58
void GRK_WARN(const char *fmt,...)
Definition: logger.cpp:49
eBandOrientation
Definition: Subband.h:25
Definition: SparseCanvas.h:115
SparseBlock(void)
Definition: SparseCanvas.h:116
void alloc(uint32_t block_area, bool zeroOutBuffer)
Definition: SparseCanvas.h:121
int32_t * data
Definition: SparseCanvas.h:129
~SparseBlock()
Definition: SparseCanvas.h:117
T x1
Definition: util.h:96
T y0
Definition: util.h:96
uint64_t area(void) const
Definition: util.h:205
T width() const
Definition: util.h:209
bool contains(grkPoint< T > pt)
Definition: util.h:125
T height() const
Definition: util.h:213
T y1
Definition: util.h:96
T x0
Definition: util.h:96