23struct AllocatorVanilla
35struct AllocatorAligned
46template<
typename T,
template<
typename TT>
typename A>
53 grk_buf() : grk_buf(0, 0, 0, false) {}
59 explicit grk_buf(
const grk_buf& rhs)
63 grk_buf& operator=(
const grk_buf& rhs)
65 return operator=(&rhs);
67 grk_buf& operator=(
const grk_buf* rhs)
78 inline bool canRead(
void)
86 inline bool write(T
val)
94 inline bool write(T* b,
size_t size)
103 virtual bool alloc(
size_t length)
117 virtual void dealloc()
129 grk_buf<T, A>::dealloc();
135 grk_buf<T, A>::dealloc();
150 size_t remainingLength(
void)
154 void incrementOffset(ptrdiff_t
off)
167 GRK_WARN(
"grk_buf8: attempt to increment buffer offset out of bounds");
189 T* currPtr(
void)
const
201using grk_buf8 = grk_buf<uint8_t, AllocatorVanilla>;
205struct grk_buf2d_simple
207 grk_buf2d_simple() : grk_buf2d_simple(
nullptr, 0, 0) {}
208 grk_buf2d_simple(T*
buf, uint32_t stride, uint32_t height)
211 grk_buf2d_simple& incX_IN_PLACE(
size_t deltaX)
217 grk_buf2d_simple& incY_IN_PLACE(
size_t deltaY)
228template<
typename T,
template<
typename TT>
typename A>
229struct grk_buf2d :
protected grk_buf<T, A>,
public grk_rect32
231 grk_buf2d(T*
buffer,
bool ownsData, uint32_t
w, uint32_t strd, uint32_t
h)
234 grk_buf2d(uint32_t
w, uint32_t
h) : grk_buf2d(nullptr, false,
w, 0,
h) {}
241 grk_buf2d(
const grk_rect32& b, [[maybe_unused]]
bool useOrigin)
244 grk_buf2d(
void) : grk_buf2d(nullptr, 0, 0, 0, false) {}
245 explicit grk_buf2d(
const grk_buf2d& rhs)
248 grk_buf2d_simple<T> simple(
void)
const
250 return grk_buf2d_simple<T>(this->
buf, this->stride, this->height());
252 grk_buf2d_simple<float> simpleF(
void)
const
254 return grk_buf2d_simple<float>((
float*)this->
buf, this->stride, this->height());
256 grk_buf2d& operator=(
const grk_buf2d& rhs)
258 return operator=(&rhs);
260 grk_buf2d& operator=(
const grk_buf2d* rhs)
264 grk_buf<T, A>::operator=(rhs);
265 grk_rect32::operator=(rhs);
270 virtual ~grk_buf2d() =
default;
271 bool alloc2d(
bool clear)
273 if(!this->
buf && width() && height())
277 uint64_t data_size_needed = (uint64_t)stride * height() *
sizeof(T);
278 if(!data_size_needed)
280 if(!grk_buf<T, A>::alloc(data_size_needed))
282 grk::GRK_ERROR(
"Failed to allocate aligned memory buffer of dimensions %u x %u",
287 memset(this->
buf, 0, data_size_needed);
293 void attach(T*
buffer, uint32_t strd)
295 grk_buf<T, A>::attach(
buffer);
298 void attach(grk_buf2d& rhs, uint32_t
x, uint32_t
y)
302 void attach(grk_buf2d& rhs)
306 void attach(grk_buf2d* rhs, uint32_t
x, uint32_t
y)
310 grk_buf<T, A>::dealloc();
311 this->
buf = rhs->address(
x,
y);
312 this->
len = rhs->len;
316 void attach(grk_buf2d* rhs)
321 void acquire(T*
buffer, uint32_t strd)
323 grk_buf<T, A>::acquire(
buffer);
327 void transfer(T**
buffer, uint32_t* strd)
331 grk_buf<T, A>::transfer(
buffer);
343 return !(win.x0 >=
x1 || win.x1 <=
x0 || win.x1 >
x1 || win.y0 >=
y1 || win.y1 <= win.y0 ||
348 void copyFrom(
const grk_buf2d& src, F filter)
350 return copyFrom(&src, filter);
354 void copyFrom(
const grk_buf2d* src, F filter)
356 auto inter = intersection(src);
363 T* ptr = this->
buf + (inter.y0 *
stride + inter.x0);
364 T* srcPtr = src->buf + ((inter.y0 - src->y0) * src->stride + inter.x0 - src->x0);
365 uint32_t
len = inter.width();
366 for(uint32_t j = inter.y0; j < inter.y1; ++j)
368 filter.copy(ptr, srcPtr,
len);
370 srcPtr += src->stride;
377 memcpy(dst, src,
len);
380 void copyFrom(
const grk_buf2d& src)
382 copy(src, memcpy_from());
384 T* getBuffer(
void)
const
386 return this->currPtr();
388 T* address(uint32_t
x, uint32_t
y)
390 return this->currPtr() + (uint64_t)
x + (uint64_t)
y *
stride;
uint8_t buf
Definition BitIO.h:84
size_t offset
Definition BitIO.h:80
uint32_t y
Definition BlockExec.h:39
uint32_t x
Definition BlockExec.h:38
uint32_t len
Definition Codeblock.h:38
#define SIZE_MAX
Definition MemManager.cpp:29
size_t off
Definition MemStream.h:38
uint8_t * buffer
packet header storage original buffer
Definition PPMMarker.h:64
T val[N]
Definition WaveletCommon.h:65
T * buf_
Definition buffer.h:223
uint32_t height_
Definition buffer.h:225
uint32_t stride
Definition buffer.h:392
bool owns_data
Definition buffer.h:198
uint32_t stride_
Definition buffer.h:224
void GRK_WARN(const char *fmt,...)
void GRK_ERROR(const char *fmt,...)
Copyright (C) 2016-2023 Grok Image Compression Inc.
Definition ICacheable.h:20
uint32_t grk_make_aligned_width(uint32_t width)
Definition MemManager.cpp:35
grk_buf< uint8_t, AllocatorVanilla > grk_buf8
Definition buffer.h:201
grk_rect< uint32_t > grk_rect32
Definition geometry.h:61
void * grk_aligned_malloc(size_t size)
Allocate memory aligned to a 16 byte boundary.
Definition MemManager.cpp:76
grk_buf< uint8_t, AllocatorAligned > grk_buf8_aligned
Definition buffer.h:202
void grk_aligned_free(void *ptr)
Definition MemManager.cpp:80
void copy(T *dst, T *src, uint32_t len)
Definition buffer.h:375
uint32_t y0
Definition t1_common.h:75
uint32_t x1
Definition t1_common.h:75
uint32_t x0
Definition t1_common.h:75
uint32_t y1
Definition t1_common.h:75