32 return new T[elements];
51template<
typename T,
template<
typename TT>
typename A>
54 Buffer(T* buffer,
size_t off,
size_t length,
bool ownsData)
57 Buffer(T* buffer,
size_t length) :
Buffer(buffer, 0, length, false) {}
59 Buffer(T* buffer,
size_t length,
bool ownsData) :
Buffer(buffer, 0, length, ownsData) {}
101 inline bool write(T* b,
size_t size)
115 buf_ = A<T>::alloc(length);
163 grklog.warn(
"Buffer8: overflow");
169 grklog.warn(
"Buffer8: attempt to increment buffer offset out of bounds");
183 grklog.warn(
"Buffer8: underflow");
201 T*
currPtr([[maybe_unused]]
size_t required_length)
const
267 assert(buf || !stride);
286template<
typename T,
template<
typename TT>
typename A>
289 Buffer2d(T* buffer,
bool ownsData, uint32_t w, uint32_t strd, uint32_t h)
292 assert(buffer || !strd);
311 uint64_t eltsNeeded = (uint64_t)rhs.stride * rhs.height();
314 if(!Buffer<T, A>::alloc(eltsNeeded))
316 throw std::runtime_error(
"Failed to allocate memory for Buffer2d copy constructor.");
320 const T* srcPtr = rhs.
buf_;
321 T* dstPtr = this->buf_;
322 for(uint32_t j = 0; j < rhs.
height(); ++j)
324 memcpy(dstPtr, srcPtr, rhs.width() * sizeof(T));
325 srcPtr += rhs.stride;
326 dstPtr += rhs.stride;
329 this->set_owns_data(
true);
335 this->
buf_ =
nullptr;
348 if(transferBuffer && rhs.
buf_)
350 rhs.transfer(&this->buf_, &this->stride);
354 throw std::invalid_argument(
355 "Buffer transfer failed: Source buffer is empty or transfer not requested.");
399 uint64_t bytesNeeded = (uint64_t)
stride *
height() *
sizeof(T);
400 memset(this->
buf_, 0, bytesNeeded);
405 return (uint32_t)((((uint64_t)
width + align - 1) / align) * align);
412 uint64_t eltsNeeded = (uint64_t)newStride *
height();
414 if(!eltsNeeded || eltsNeeded <= this->
num_elts())
419 grk::grklog.error(
"Failed to allocate aligned memory buffer of dimensions %u x %u", newStride,
492 T* ptr = this->
buf_ + (inter.y0 *
stride + inter.x0);
493 T* srcPtr = src->
buf_ + ((inter.y0 - src->
y0) * src->
stride + inter.x0 - src->
x0);
494 uint32_t len = inter.width();
495 for(uint32_t j = inter.y0; j < inter.y1; ++j)
497 filter.copy(ptr, srcPtr, len);
503 template<
typename SrcT,
template<
class>
class SrcA,
typename F>
510 auto srcSimple = src->
simple();
514 T* ptr = this->
buf_ + (inter.y0 *
stride + inter.x0);
515 SrcT* srcPtr = srcSimple.buf_ + ((inter.y0 - src->
y0) * srcSimple.stride_ + inter.x0 - src->
x0);
516 uint32_t len = inter.width();
517 for(uint32_t j = inter.y0; j < inter.y1; ++j)
519 filter.copy(ptr, srcPtr, len);
521 srcPtr += srcSimple.stride_;
526 void copy(T* dst,
const T* src, uint32_t len)
528 memcpy(dst, src, len);
533 copy(src, memcpy_from());
#define SIZE_MAX
Definition MemManager.h:37
ResWindow.
Definition CompressedChunkCache.h:36
void * grk_aligned_malloc(size_t bytes)
Definition MemManager.h:308
Buffer< uint8_t, AllocatorAligned > BufferAligned8
Definition buffer.h:258
ILogger & grklog
Definition Logger.cpp:24
Rect< uint32_t > Rect32
Definition geometry.h:64
Buffer2d< int32_t, AllocatorAligned > Buffer2dAligned32
Definition buffer.h:553
Buffer< uint8_t, AllocatorVanilla > Buffer8
Definition buffer.h:257
void grk_aligned_free(void *ptr)
Definition MemManager.h:324
void dealloc(T *buf)
Definition buffer.h:46
T * alloc(size_t elements)
Definition buffer.h:42
T * alloc(size_t elements)
Definition buffer.h:30
void dealloc(T *buf)
Definition buffer.h:34
void copy(T *dst, const T *src, uint32_t len)
Definition buffer.h:526
void attach(T *buffer, uint32_t strd)
Definition buffer.h:435
Buffer2d(const Rect32 &b)
Definition buffer.h:298
void copyFrom(const Buffer2d &src, F filter)
Definition buffer.h:477
void copyFromNarrow(const Buffer2d< SrcT, SrcA > *src, F filter)
Definition buffer.h:504
uint32_t getStride()
Definition buffer.h:543
Buffer2d(const Rect32 &b, bool useOrigin)
Definition buffer.h:301
Buffer2d(const Rect32 *b)
Definition buffer.h:295
Buffer2d(uint32_t w, uint32_t h)
Definition buffer.h:294
bool alloc2d(uint32_t w, uint32_t str, uint32_t h, bool clear)
Definition buffer.h:387
void attach(Buffer2d *rhs, uint32_t x, uint32_t y)
Definition buffer.h:449
size_t length(void)
Definition buffer.h:383
void dealloc() override
Definition buffer.h:429
Buffer2dSimple< float > simpleF(void) const
Definition buffer.h:363
void attach(Buffer2d &rhs, uint32_t x, uint32_t y)
Definition buffer.h:441
uint32_t alignedBufferWidth(uint32_t width)
Definition buffer.h:402
bool alloc2d(bool clear)
Definition buffer.h:407
Buffer2d(const Buffer2d &rhs)
Definition buffer.h:305
Buffer2d(T *buffer, bool ownsData, uint32_t w, uint32_t strd, uint32_t h)
Definition buffer.h:289
uint32_t stride
Definition buffer.h:550
Buffer2d(void)
Definition buffer.h:304
virtual ~Buffer2d() override=default
T * address(uint32_t x, uint32_t y)
Definition buffer.h:539
T * getBuffer(void) const
Definition buffer.h:535
void attach(Buffer2d *rhs)
Definition buffer.h:460
void transfer(T **buffer, uint32_t *strd)
Definition buffer.h:465
Buffer2dSimple< T > simple(void) const
Definition buffer.h:359
Buffer2d(Buffer2d &rhs, bool transferBuffer)
Construct a new Buffer2d object Copies Rect32 and transfers buffer.
Definition buffer.h:346
void copyFrom(const Buffer2d *src, F filter)
Definition buffer.h:483
void copyFrom(const Buffer2d &src)
Definition buffer.h:531
void attach(Buffer2d &rhs)
Definition buffer.h:445
Buffer2d & operator=(const Buffer2d *rhs)
Definition buffer.h:371
Buffer2d & operator=(const Buffer2d &rhs)
Definition buffer.h:367
void clear(void)
Definition buffer.h:397
Buffer2dSimple(T *buf, uint32_t stride, uint32_t height)
Definition buffer.h:264
uint32_t height_
Definition buffer.h:283
uint32_t stride_
Definition buffer.h:282
T * buf_
Definition buffer.h:281
Buffer2dSimple()
Definition buffer.h:263
Buffer2dSimple & incX_IN_PLACE(size_t deltaX)
Definition buffer.h:269
Buffer2dSimple & incY_IN_PLACE(size_t deltaY)
Definition buffer.h:275
Buffer()
Definition buffer.h:58
void set_offset(size_t off)
Definition buffer.h:231
Buffer(T *buffer, size_t length, bool ownsData)
Definition buffer.h:59
uint8_t * buf_
Definition buffer.h:251
bool write(T *b, size_t size)
Definition buffer.h:101
Buffer & operator=(const Buffer &rhs)
Definition buffer.h:70
size_t offset() const
Definition buffer.h:227
size_t num_elts_
Definition buffer.h:253
bool write(T val)
Definition buffer.h:93
T * currPtr(size_t required_length) const
Definition buffer.h:201
virtual bool alloc(size_t length)
Definition buffer.h:110
T * currPtr(void) const
Definition buffer.h:195
T read(void)
Definition buffer.h:89
void transfer(T **buffer)
Definition buffer.h:140
void set_buf(T *buf, size_t elts)
Definition buffer.h:243
Buffer(T *buffer, size_t length)
Definition buffer.h:57
T ** ptr_to_buf()
Definition buffer.h:239
T * buf() const
Definition buffer.h:235
virtual ~Buffer()
Definition buffer.h:60
void set_num_elts(size_t elts)
Definition buffer.h:221
bool canRead(void)
Definition buffer.h:85
size_t num_elts() const
Definition buffer.h:213
Buffer(const Buffer &rhs)
Definition buffer.h:66
void set_owns_data(bool owns)
Definition buffer.h:209
bool increment_offset(std::ptrdiff_t off)
Definition buffer.h:156
Buffer & operator=(const Buffer *rhs)
Definition buffer.h:74
virtual void dealloc()
Definition buffer.h:124
bool owns_data_
Definition buffer.h:254
size_t * num_elts_ptr()
Definition buffer.h:217
Buffer(T *buffer, size_t off, size_t length, bool ownsData)
Definition buffer.h:54
size_t offset_
Definition buffer.h:252
void attach(T *buffer)
Definition buffer.h:134
size_t remainingLength(void) const
Definition buffer.h:152
bool owns_data()
Definition buffer.h:205
uint32_t width() const
Definition geometry.h:411
uint32_t x1
Definition geometry.h:192
T height() const
Definition geometry.h:415
Rect< uint32_t > intersection(const Rect< uint32_t > &rhs) const
Definition geometry.h:347
void setRect(const Rect *rhs)
Definition geometry.h:297
uint32_t x0
Definition geometry.h:192
Rect< uint32_t > & operator=(const Rect &rhs)
Definition geometry.h:262
uint32_t y0
Definition geometry.h:192
uint32_t y1
Definition geometry.h:192