Go to the documentation of this file.
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,
186 throw std::runtime_error(
"invalid window for sparse array");
190 uint32_t grid_width = ceildivpow2<uint32_t>(
bounds.
width(), LBW);
191 uint32_t grid_height = ceildivpow2<uint32_t>(
bounds.
height(), LBH);
194 grid_off_x+grid_width,
195 grid_off_y + grid_height);
198 for (uint64_t i = 0; i < block_count; ++i)
221 const uint32_t dest_col_stride,
222 const uint32_t dest_line_stride,
235 const uint32_t dest_col_stride,
236 const uint32_t dest_line_stride,
254 const uint32_t src_col_stride,
255 const uint32_t src_line_stride,
279 uint32_t block_y = y0 >> LBH;
280 for (uint32_t y = y0; y < y1; block_y ++, y += y_incr) {
282 y_incr = min<uint32_t>(y_incr, y1 - y);
283 uint32_t block_x = x0 >> LBW;
285 for (uint32_t x = x0; x < x1; block_x ++, x += x_incr) {
287 x_incr = min<uint32_t>(x_incr, x1 - x);
289 GRK_ERROR(
"Attempt to allocate a block (%d,%d) outside block grid bounds", block_x, block_y);
292 auto src_block =
getBlock(block_x, block_y);
298 src_block = (int32_t*)
grk_calloc(block_area,
sizeof(int32_t));
300 GRK_ERROR(
"SparseBuffer: Out of memory");
303 setBlock(block_x, block_y, src_block);
311 inline int32_t*
getBlock(uint32_t block_x, uint32_t block_y){
314 inline void setBlock(uint32_t block_x, uint32_t block_y, int32_t* block){
338 const uint32_t buf_col_stride,
339 const uint32_t buf_line_stride,
345 const uint64_t line_stride = buf_line_stride;
346 const uint64_t col_stride = buf_col_stride;
347 uint32_t block_y = y0 >> LBH;
349 for (uint32_t y = y0; y < y1; block_y ++, y += y_incr) {
352 y_incr = min<uint32_t>(y_incr, y1 - y);
353 uint32_t block_x = x0 >> LBW;
355 for (uint32_t x = x0; x < x1; block_x ++, x += x_incr) {
358 x_incr = min<uint32_t>(x_incr, x1 - x);
360 GRK_ERROR(
"Attempt to access a block (%d,%d) outside block grid bounds", block_x, block_y);
363 auto src_block =
getBlock(block_x, block_y);
366 GRK_ERROR(
"Sparse array: missing block (%d,%d,%d,%d) for %s (%d,%d,%d,%d)",
371 is_read_op ?
"read" :
"write",
378 src_block + ((uint64_t)block_y_offset << LBW) + block_x_offset;
379 int32_t*
GRK_RESTRICT dest_ptr = buf + (y - y0) * line_stride +
380 (x - x0) * col_stride;
381 for (uint32_t j = 0; j < y_incr; j++) {
383 for (uint32_t k = 0; k < x_incr; k++){
384 dest_ptr[ind] = src_ptr[k];
387 dest_ptr += line_stride;
391 const int32_t*
GRK_RESTRICT src_ptr = buf + (y - y0) * line_stride + (x - x0) * col_stride;
392 int32_t*
GRK_RESTRICT dest_ptr = src_block + ((uint64_t)block_y_offset << LBW) + block_x_offset;
394 for (uint32_t j = 0; j < y_incr; j++) {
396 for (uint32_t k = 0; k < x_incr; k++) {
397 dest_ptr[k] = src_ptr[ind];
400 src_ptr += line_stride;
grk_rect_u32 bounds
Definition: SparseBuffer.h:413
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 array into a user buffer.
Definition: SparseBuffer.h:216
SparseBuffer(grk_rect_u32 bds)
Creates a new sparse array.
Definition: SparseBuffer.h:180
T height() const
Definition: util.h:172
Definition: SparseBuffer.h:72
bool alloc(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1)
Definition: SparseBuffer.h:271
virtual ~ISparseBuffer()
Definition: SparseBuffer.h:75
bool alloc(grk_rect_u32 window)
Allocate all blocks for a rectangular window into the sparse array from a user buffer.
Definition: SparseBuffer.h:266
const uint32_t block_height
Definition: SparseBuffer.h:411
void * grk_calloc(size_t num, size_t size)
Allocate a memory block with elements initialized to 0.
Definition: MemManager.cpp:111
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
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:325
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:333
T x1
Definition: util.h:77
void grk_free(void *ptr)
Deallocates or frees a memory block.
Definition: MemManager.cpp:141
int32_t * getBlock(uint32_t block_x, uint32_t block_y)
Definition: SparseBuffer.h:311
Definition: SparseBuffer.h:159
void setBlock(uint32_t block_x, uint32_t block_y, int32_t *block)
Definition: SparseBuffer.h:314
grk_rect_u32 grid_bounds
Definition: SparseBuffer.h:414
T width() const
Definition: util.h:169
bool contains(grk_point< T > pt)
Definition: util.h:98
~SparseBuffer()
Frees a sparse array.
Definition: SparseBuffer.h:206
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 array from a user buffer.
virtual bool alloc(grk_rect_u32 window)=0
Allocate all blocks for a rectangular window into the sparse array from a user buffer.
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 array into a user buffer.
int32_t ** data_blocks
Definition: SparseBuffer.h:412
Copyright (C) 2016-2021 Grok Image Compression Inc.
Definition: BitIO.cpp:23
uint64_t area(void) const
Definition: util.h:166
grk_rectangle< uint32_t > grk_rect_u32
Definition: util.h:48
SparseBuffer(uint32_t width, uint32_t height)
Creates a new sparse array.
Definition: SparseBuffer.h:170
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 array into a user buffer.
Definition: SparseBuffer.h:233
const uint32_t block_width
Definition: SparseBuffer.h:410
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 array into a user buffer.
#define GRK_RESTRICT
Definition: grk_includes.h:101
T x0
Definition: util.h:77
T y1
Definition: util.h:77
Definition: grk_exceptions.h:36
T y0
Definition: util.h:77
void GRK_ERROR(const char *fmt,...)
Definition: logger.cpp:57
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 array from a user buffer.
Definition: SparseBuffer.h:249