92 virtual bool read(uint32_t x0,
97 const uint32_t dest_col_stride,
98 const uint32_t dest_line_stride,
115 const uint32_t dest_col_stride,
116 const uint32_t dest_line_stride,
140 const uint32_t src_col_stride,
141 const uint32_t src_line_stride,
164 data =
new int32_t[block_area];
168 memset(
data, 0, block_area *
sizeof(int32_t));
190 throw std::runtime_error(
"invalid window for sparse buffer");
194 uint32_t grid_width = ceildivpow2<uint32_t>(
bounds.
width(), LBW);
195 uint32_t grid_height = ceildivpow2<uint32_t>(
bounds.
height(), LBH);
198 grid_off_x+grid_width,
199 grid_off_y + grid_height);
202 for (uint64_t i = 0; i < block_count; ++i){
206 #ifdef GRK_DEBUG_VALGRIND
241 const uint32_t dest_col_stride,
242 const uint32_t dest_line_stride,
255 const uint32_t dest_col_stride,
256 const uint32_t dest_line_stride,
274 const uint32_t src_col_stride,
275 const uint32_t src_line_stride,
299 uint32_t block_y = y0 >> LBH;
300 for (uint32_t y = y0; y < y1; block_y ++, y += y_incr) {
302 y_incr = min<uint32_t>(y_incr, y1 - y);
303 uint32_t block_x = x0 >> LBW;
305 for (uint32_t x = x0; x < x1; block_x ++, x += x_incr) {
307 x_incr = min<uint32_t>(x_incr, x1 - x);
309 GRK_ERROR(
"Attempt to allocate a block (%d,%d) outside block grid bounds", block_x, block_y);
312 auto src_block =
getBlock(block_x, block_y);
331 #ifdef GRK_DEBUG_VALGRIND
374 const uint32_t buf_col_stride,
375 const uint32_t buf_line_stride,
380 if (forgiving && is_read_op){
382 for (uint32_t y = y0; y < y1; ++y){
383 int32_t *bufPtr = buf + (y - y0) * buf_line_stride;
384 for (uint32_t x = x0; x < x1; ++x){
386 bufPtr += buf_col_stride;
393 const uint64_t line_stride = buf_line_stride;
394 const uint64_t col_stride = buf_col_stride;
395 uint32_t block_y = y0 >> LBH;
397 for (uint32_t y = y0; y < y1; block_y ++, y += y_incr) {
400 y_incr = min<uint32_t>(y_incr, y1 - y);
401 uint32_t block_x = x0 >> LBW;
403 for (uint32_t x = x0; x < x1; block_x ++, x += x_incr) {
406 x_incr = min<uint32_t>(x_incr, x1 - x);
408 GRK_ERROR(
"Attempt to access a block (%d,%d) outside block grid bounds", block_x, block_y);
411 auto src_block =
getBlock(block_x, block_y);
414 GRK_WARN(
"Sparse buffer %s op: missing block (%d,%d,%d,%d) for %s (%d,%d,%d,%d)",
415 is_read_op ?
"read" :
"write",
420 is_read_op ?
"read" :
"write",
426 src_block->data + ((uint64_t)block_y_offset << LBW) + block_x_offset;
427 int32_t*
GRK_RESTRICT dest_ptr = buf + (y - y0) * line_stride +
428 (x - x0) * col_stride;
430 for (uint32_t j = 0; j < y_incr; j++) {
432 for (uint32_t k = 0; k < x_incr; k++){
433 #ifdef GRK_DEBUG_VALGRIND
434 grk_pt pt((uint32_t)(x+k), y_);
436 size_t val = grk_memcheck<int32_t>(src_ptr+k,1);
437 if (val != grk_mem_ok)
438 GRK_ERROR(
"sparse buffer read block(%d,%d) : uninitialized at location (%d,%d)",
439 block_x, block_y, x+k,y_);
442 dest_ptr[ind] = src_ptr[k];
445 dest_ptr += line_stride;
450 const int32_t*
GRK_RESTRICT src_ptr = buf + (y - y0) * line_stride + (x - x0) * col_stride;
451 int32_t*
GRK_RESTRICT dest_ptr = src_block->data + ((uint64_t)block_y_offset << LBW) + block_x_offset;
454 for (uint32_t j = 0; j < y_incr; j++) {
456 for (uint32_t k = 0; k < x_incr; k++) {
457 #ifdef GRK_DEBUG_VALGRIND
458 grk_pt pt((uint32_t)(x+k), y_);
460 size_t val = grk_memcheck<int32_t>(src_ptr+ind,1);
461 if (val != grk_mem_ok)
462 GRK_ERROR(
"sparse buffer write block(%d,%d): uninitialized at location (%d,%d)",
463 block_x, block_y, x+k,y_);
466 dest_ptr[k] = src_ptr[ind];
469 src_ptr += line_stride;
485 #ifdef GRK_DEBUG_VALGRIND
Definition: SparseBuffer.h:72
virtual bool read(grk_rect_u32 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 alloc(grk_rect_u32 window)=0
Allocate all blocks for a rectangular window into the sparse buffer from a user buffer.
virtual bool read(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, 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(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, 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.
virtual ~ISparseBuffer()
Definition: SparseBuffer.h:75
Definition: SparseBuffer.h:174
bool is_window_valid(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1)
Returns whether window bounds are valid (non empty and within array bounds)
Definition: SparseBuffer.h:361
bool write(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, 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: SparseBuffer.h:269
grk_rect_u32 bounds
Definition: SparseBuffer.h:483
SparseBlock ** data_blocks
Definition: SparseBuffer.h:482
bool read_or_write(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, int32_t *buf, const uint32_t buf_col_stride, const uint32_t buf_line_stride, bool forgiving, bool is_read_op)
Definition: SparseBuffer.h:369
bool alloc(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1)
Definition: SparseBuffer.h:291
const uint32_t block_height
Definition: SparseBuffer.h:481
bool read(grk_rect_u32 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: SparseBuffer.h:253
const uint32_t block_width
Definition: SparseBuffer.h:480
SparseBuffer(uint32_t width, uint32_t height)
Creates a new sparse buffer.
Definition: SparseBuffer.h:219
bool read(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, 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: SparseBuffer.h:236
grk_rect_u32 grid_bounds
Definition: SparseBuffer.h:484
SparseBuffer(grk_rect_u32 bds)
Creates a new sparse buffer.
Definition: SparseBuffer.h:184
SparseBlock * getBlock(uint32_t block_x, uint32_t block_y)
Definition: SparseBuffer.h:328
~SparseBuffer()
Frees a sparse buffer.
Definition: SparseBuffer.h:226
bool alloc(grk_rect_u32 window)
Allocate all blocks for a rectangular window into the sparse buffer from a user buffer.
Definition: SparseBuffer.h:286
#define GRK_RESTRICT
Definition: grk_includes.h:101
Copyright (C) 2016-2021 Grok Image Compression Inc.
Definition: BitIO.cpp:23
static uint32_t uint_floordivpow2(uint32_t a, uint32_t b)
Divide an unsigned integer by a power of 2 and round downwards.
Definition: grk_intmath.h:55
void GRK_ERROR(const char *fmt,...)
Definition: logger.cpp:57
void GRK_WARN(const char *fmt,...)
Definition: logger.cpp:49
grk_rectangle< uint32_t > grk_rect_u32
Definition: util.h:56
Definition: SparseBuffer.h:157
SparseBlock(void)
Definition: SparseBuffer.h:158
int32_t * data
Definition: SparseBuffer.h:171
bool alloc(uint32_t block_area)
Definition: SparseBuffer.h:163
~SparseBlock()
Definition: SparseBuffer.h:160
T x0
Definition: util.h:84
T y1
Definition: util.h:84
bool contains(grk_point< T > pt)
Definition: util.h:105
T y0
Definition: util.h:84
uint64_t area(void) const
Definition: util.h:180
T height() const
Definition: util.h:186
T width() const
Definition: util.h:183
T x1
Definition: util.h:84