31 int32_t* dest,
const uint32_t destinationColumnStride,
32 const uint32_t destinationLineStride,
bool forceReturnTrue) = 0;
34 const int32_t* src,
const uint32_t src_columnStride,
35 const uint32_t src_lineStride,
bool forceReturnTrue) = 0;
45 void alloc(uint32_t block_area,
bool zeroOutBuffer)
47 data =
new int32_t[block_area];
49 memset(
data, 0, block_area *
sizeof(int32_t));
53 template<u
int32_t LBW, u
int32_t LBH>
61 throw std::runtime_error(
"invalid window for sparse buffer");
64 uint32_t grid_x = ceildivpow2<uint32_t>(
bounds.
x1, LBW);
65 uint32_t grid_y = ceildivpow2<uint32_t>(
bounds.
y1, LBH);
69 for(uint64_t i = 0; i < blockCount; ++i)
86 const uint32_t destinationColumnStride,
const uint32_t destinationLineStride,
90 return readWrite(resno, window, dest, destinationColumnStride, destinationLineStride,
91 forceReturnTrue,
true);
94 const int32_t* src,
const uint32_t src_columnStride,
const uint32_t src_lineStride,
98 return readWrite(resno, window, (int32_t*)src, src_columnStride, src_lineStride,
99 forceReturnTrue,
false);
105 uint32_t yIncrement = 0;
106 uint32_t block_y = win.
y0 >> LBH;
107 for(uint32_t y = win.
y0; y < win.
y1; block_y++, y += yIncrement)
110 yIncrement = (std::min<uint32_t>)(yIncrement, win.
y1 - y);
111 uint32_t block_x = win.
x0 >> LBW;
112 uint32_t xIncrement = 0;
113 for(uint32_t x = win.
x0; x < win.
x1; block_x++, x += xIncrement)
116 xIncrement = (std::min<uint32_t>)(xIncrement, win.
x1 - x);
119 GRK_ERROR(
"sparse buffer : attempt to allocate a block (%u,%u) outside block "
120 "grid bounds (%u,%u,%u,%u)",
125 auto srcBlock =
getBlock(block_x, block_y);
154 const uint32_t buf_lineStride,
bool forceReturnTrue,
bool isReadOperation)
159 if(forceReturnTrue && isReadOperation)
161 GRK_WARN(
"Sparse buffer @ res %u, attempt to read invalid window (%u,%u,%u,%u). "
162 "Filling with zeros.",
163 resno, win.
x0, win.
y0, win.
x1, win.
y1);
164 for(uint32_t y = win.
y0; y < win.
y1; ++y)
166 auto bufPtr = buf + (y - win.
y0) * buf_lineStride;
167 for(uint32_t x = win.
x0; x < win.
x1; ++x)
170 bufPtr += buf_columnStride;
174 return forceReturnTrue;
176 const uint64_t lineStride = buf_lineStride;
177 const uint64_t columnStride = buf_columnStride;
178 uint32_t block_y = win.
y0 >> LBH;
179 uint32_t yIncrement = 0;
180 for(uint32_t y = win.
y0; y < win.
y1; block_y++, y += yIncrement)
184 yIncrement = (std::min<uint32_t>)(yIncrement, win.
y1 - y);
185 uint32_t block_x = win.
x0 >> LBW;
186 uint32_t xIncrement = 0;
187 for(uint32_t x = win.
x0; x < win.
x1; block_x++, x += xIncrement)
190 uint32_t blockXOffset =
blockWidth - xIncrement;
191 xIncrement = (std::min<uint32_t>)(xIncrement, win.
x1 - x);
194 GRK_ERROR(
"sparse buffer @ resno %u, Attempt to access a block (%u,%u) outside "
196 resno, block_x, block_y);
199 auto srcBlock =
getBlock(block_x, block_y);
202 GRK_WARN(
"sparse buffer @ resno %u, %s op: missing block (%u,%u,%u,%u) for %s "
204 resno, isReadOperation ?
"read" :
"write",
208 isReadOperation ?
"read" :
"write", win.
x0, win.
y0, win.
x1, win.
y1);
214 srcBlock->data + ((uint64_t)blockYOffset << LBW) + blockXOffset;
215 auto dest = buf + (y - win.
y0) * lineStride + (x - win.
x0) * columnStride;
216 for(uint32_t j = 0; j < yIncrement; j++)
219 for(uint32_t k = 0; k < xIncrement; k++)
221 #ifdef GRK_DEBUG_VALGRIND
222 size_t val = grk_memcheck<int32_t>(src + k, 1);
223 if(val != grk_mem_ok)
224 GRK_ERROR(
"sparse buffer @resno %u, read block(%u,%u) : "
225 "uninitialized at location (%u,%u)",
226 resno, block_x, block_y, x + k, y_);
228 dest[index] = src[k];
229 index += columnStride;
237 const int32_t* src =
nullptr;
239 src = buf + (y - win.
y0) * lineStride + (x - win.
x0) * columnStride;
240 auto dest = srcBlock->data + ((uint64_t)blockYOffset << LBW) + blockXOffset;
241 for(uint32_t j = 0; j < yIncrement; j++)
244 for(uint32_t k = 0; k < xIncrement; k++)
246 #ifdef GRK_DEBUG_VALGRIND
250 size_t val = grk_memcheck<int32_t>(src + index, 1);
251 if(val != grk_mem_ok)
252 GRK_ERROR(
"sparse buffer @ resno %u, write block(%u,%u): "
253 "uninitialized at location (%u,%u)",
254 resno, block_x, block_y, x + k, y_);
257 dest[k] = src ? src[index] : 0;
258 index += columnStride;
Definition: SparseCanvas.h:27
virtual ~ISparseCanvas()=default
virtual bool alloc(grk_rect32 window, bool zeroOutBuffer)=0
virtual bool write(uint8_t resno, eBandOrientation bandOrientation, grk_rect32 window, const int32_t *src, const uint32_t src_columnStride, const uint32_t src_lineStride, bool forceReturnTrue)=0
virtual bool read(uint8_t resno, eBandOrientation bandOrientation, grk_rect32 window, int32_t *dest, const uint32_t destinationColumnStride, const uint32_t destinationLineStride, bool forceReturnTrue)=0
Definition: SparseCanvas.h:55
grk_rect32 bounds
Definition: SparseCanvas.h:274
SparseCanvas(uint32_t width, uint32_t height)
Definition: SparseCanvas.h:72
const uint32_t blockWidth
Definition: SparseCanvas.h:271
bool alloc(grk_rect32 win, bool zeroOutBuffer)
Definition: SparseCanvas.h:101
SparseBlock ** blocks
Definition: SparseCanvas.h:273
SparseBlock * getBlock(uint32_t block_x, uint32_t block_y)
Definition: SparseCanvas.h:142
~SparseCanvas()
Definition: SparseCanvas.h:73
SparseCanvas(grk_rect32 bds)
Definition: SparseCanvas.h:57
bool read(uint8_t resno, eBandOrientation bandOrientation, grk_rect32 window, int32_t *dest, const uint32_t destinationColumnStride, const uint32_t destinationLineStride, bool forceReturnTrue)
Definition: SparseCanvas.h:85
const uint32_t blockHeight
Definition: SparseCanvas.h:272
bool write(uint8_t resno, eBandOrientation bandOrientation, grk_rect32 window, const int32_t *src, const uint32_t src_columnStride, const uint32_t src_lineStride, bool forceReturnTrue)
Definition: SparseCanvas.h:93
grk_rect32 gridBounds
Definition: SparseCanvas.h:275
bool readWrite(uint8_t resno, grk_rect32 win, int32_t *buf, const uint32_t buf_columnStride, const uint32_t buf_lineStride, bool forceReturnTrue, bool isReadOperation)
Definition: SparseCanvas.h:153
bool isWindowValid(grk_rect32 win)
Definition: SparseCanvas.h:148
#define GRK_UNUSED(x)
Definition: grk_includes.h:87
Copyright (C) 2016-2022 Grok Image Compression Inc.
Definition: ICacheable.h:20
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
grk_rect< uint32_t > grk_rect32
Definition: util.h:57
eBandOrientation
Definition: Subband.h:25
Definition: SparseCanvas.h:39
SparseBlock(void)
Definition: SparseCanvas.h:40
void alloc(uint32_t block_area, bool zeroOutBuffer)
Definition: SparseCanvas.h:45
int32_t * data
Definition: SparseCanvas.h:51
~SparseBlock()
Definition: SparseCanvas.h:41
uint64_t area(void) const
Definition: util.h:242
T width() const
Definition: util.h:246
T y1
Definition: util.h:109
T x0
Definition: util.h:109
T x1
Definition: util.h:109
T height() const
Definition: util.h:250
bool contains(grk_pt< T > pt)
Definition: util.h:129
T y0
Definition: util.h:109