16 #ifndef HIGHWAY_HWY_CONTRIB_IMAGE_IMAGE_H_
17 #define HIGHWAY_HWY_CONTRIB_IMAGE_IMAGE_H_
43 static size_t BytesPerRow(
const size_t xsize,
const size_t sizeof_t);
53 ImageBase(
size_t xsize,
size_t ysize,
size_t sizeof_t);
59 ImageBase(
size_t xsize,
size_t ysize,
size_t bytes_per_row,
void* aligned);
77 void ShrinkTo(
const size_t xsize,
const size_t ysize) {
78 xsize_ =
static_cast<uint32_t
>(xsize);
79 ysize_ =
static_cast<uint32_t
>(ysize);
94 void* p = bytes_.get();
98 const void* p = bytes_.get();
105 #if HWY_IS_ASAN || HWY_IS_MSAN || HWY_IS_TSAN
107 HWY_ABORT(
"Row(%" PRIu64
") >= %u\n",
static_cast<uint64_t
>(y), ysize_);
111 void* row = bytes_.get() + y * bytes_per_row_;
158 template <
typename ComponentType>
161 using T = ComponentType;
175 return static_cast<const T*
>(
VoidRow(y));
178 return static_cast<const T*
>(
VoidRow(y));
205 template <
typename ComponentType>
208 using T = ComponentType;
220 planes_[i] = std::move(other.planes_[i]);
226 HWY_ABORT(
"Not same size: %" PRIu64
" x %" PRIu64
", %" PRIu64
227 " x %" PRIu64
", %" PRIu64
" x %" PRIu64
"\n",
228 static_cast<uint64_t
>(plane0.xsize()),
229 static_cast<uint64_t
>(plane0.ysize()),
230 static_cast<uint64_t
>(plane1.xsize()),
231 static_cast<uint64_t
>(plane1.ysize()),
232 static_cast<uint64_t
>(plane2.xsize()),
233 static_cast<uint64_t
>(plane2.ysize()));
235 planes_[0] = std::move(plane0);
236 planes_[1] = std::move(plane1);
237 planes_[2] = std::move(plane2);
247 planes_[i] = std::move(other.planes_[i]);
269 for (
size_t c = 0; c < 3; ++c) {
295 #if HWY_IS_ASAN || HWY_IS_MSAN || HWY_IS_TSAN
297 HWY_ABORT(
"PlaneRow(%" PRIu64
", %" PRIu64
") >= %" PRIu64
"\n",
298 static_cast<uint64_t
>(c),
static_cast<uint64_t
>(y),
299 static_cast<uint64_t
>(
ysize()));
323 constexpr
Rect(
size_t xbegin,
size_t ybegin,
size_t xsize_max,
324 size_t ysize_max,
size_t xend,
size_t yend)
335 template <
typename Image>
350 template <
typename T>
355 template <
typename T>
360 template <
typename T>
365 template <
typename T>
372 template <
class ImageT>
384 static constexpr
size_t ClampedSize(
size_t begin,
size_t size_max,
386 return (begin + size_max <= end) ? size_max
387 : (end > begin ? end - begin : 0);
398 template <
class Image1,
class Image2>
400 return image1.xsize() == image2.xsize() && image1.ysize() == image2.ysize();
408 const int64_t xsize) {
412 while (x < 0 || x >= xsize) {
416 x = 2 * xsize - 1 - x;
419 return static_cast<size_t>(x);
427 return Mirror(coord,
static_cast<int64_t
>(size));
435 return static_cast<size_t>(coord);
443 template <
class View>
448 const int64_t stride)
const {
455 const int64_t num_after = row -
last_row_;
#define HWY_ALIGNMENT
Definition: aligned_allocator.h:32
#define HWY_RESTRICT
Definition: base.h:63
#define HWY_ABORT(format,...)
Definition: base.h:143
#define HWY_INLINE
Definition: base.h:64
#define HWY_DASSERT(condition)
Definition: base.h:193
#define HWY_MAYBE_UNUSED
Definition: base.h:75
#define HWY_ASSUME_ALIGNED(ptr, align)
Definition: base.h:99
Definition: aligned_allocator.h:170
ImageT planes_[kNumPlanes]
Definition: image.h:311
Image3(const Image3 &other)=delete
HWY_INLINE const T * ConstPlaneRow(const size_t c, const size_t y)
Definition: image.h:255
HWY_INLINE const ImageT & Plane(size_t idx) const
Definition: image.h:266
HWY_INLINE const T * ConstPlaneRow(const size_t c, const size_t y) const
Definition: image.h:252
HWY_INLINE T * MutablePlaneRow(const size_t c, const size_t y)
Definition: image.h:262
HWY_INLINE size_t xsize() const
Definition: image.h:281
HWY_INLINE void * VoidPlaneRow(const size_t c, const size_t y) const
Definition: image.h:294
HWY_INLINE size_t ysize() const
Definition: image.h:282
Image3(Image3 &&other) noexcept
Definition: image.h:218
Image3(const size_t xsize, const size_t ysize)
Definition: image.h:214
Image3 & operator=(const Image3 &other)=delete
Image3(ImageT &&plane0, ImageT &&plane1, ImageT &&plane2)
Definition: image.h:224
Image3()
Definition: image.h:212
Image3 & operator=(Image3 &&other) noexcept
Definition: image.h:245
ComponentType T
Definition: image.h:208
void ShrinkTo(const size_t xsize, const size_t ysize)
Definition: image.h:274
HWY_INLINE T * MutablePlaneRow(const size_t c, const size_t y) const
Definition: image.h:259
HWY_INLINE intptr_t PixelsPerRow() const
Definition: image.h:290
static constexpr size_t kNumPlanes
Definition: image.h:210
HWY_INLINE size_t bytes_per_row() const
Definition: image.h:286
void Swap(Image3 &other)
Definition: image.h:268
HWY_INLINE T * MutableRow(const size_t y) const
Definition: image.h:184
HWY_INLINE const T * ConstRow(const size_t y)
Definition: image.h:177
HWY_INLINE intptr_t PixelsPerRow() const
Definition: image.h:194
HWY_INLINE const T * ConstRow(const size_t y) const
Definition: image.h:174
void InitializePaddingForUnalignedAccesses()
Definition: image.h:170
HWY_INLINE T * MutableRow(const size_t y)
Definition: image.h:187
Image(const size_t xsize, const size_t ysize, size_t bytes_per_row, void *aligned)
Definition: image.h:166
ComponentType T
Definition: image.h:161
Image(const size_t xsize, const size_t ysize)
Definition: image.h:164
constexpr Rect(size_t xbegin, size_t ybegin, size_t xsize_max, size_t ysize_max, size_t xend, size_t yend)
Definition: image.h:323
size_t x0_
Definition: image.h:390
const T * ConstPlaneRow(const Image3< T > &image, size_t c, size_t y) const
Definition: image.h:361
size_t xsize() const
Definition: image.h:379
static constexpr size_t ClampedSize(size_t begin, size_t size_max, size_t end)
Definition: image.h:384
bool IsInside(const ImageT &image) const
Definition: image.h:373
Rect(const Image &image)
Definition: image.h:336
Rect Subrect(size_t xbegin, size_t ybegin, size_t xsize_max, size_t ysize_max)
Definition: image.h:344
T * MutableRow(const Image< T > *image, size_t y) const
Definition: image.h:356
Rect & operator=(const Rect &)=default
const T * ConstRow(const Image< T > *image, size_t y) const
Definition: image.h:351
size_t xsize_
Definition: image.h:393
size_t y0_
Definition: image.h:391
constexpr Rect(size_t xbegin, size_t ybegin, size_t xsize, size_t ysize)
Definition: image.h:331
Rect()
Definition: image.h:339
size_t ysize() const
Definition: image.h:380
Rect(const Rect &)=default
size_t ysize_
Definition: image.h:394
size_t x0() const
Definition: image.h:377
size_t y0() const
Definition: image.h:378
T * MutablePlaneRow(Image3< T > *image, const size_t c, size_t y) const
Definition: image.h:366
const float * operator()(const float *const HWY_RESTRICT row, const int64_t stride) const
Definition: image.h:447
const float *const HWY_RESTRICT first_row_
Definition: image.h:463
const float *const HWY_RESTRICT last_row_
Definition: image.h:464
WrapRowMirror(const View &image, size_t ysize)
Definition: image.h:444
#define HWY_CONTRIB_DLLEXPORT
Definition: highway_export.h:20
Definition: aligned_allocator.h:27
HWY_MAYBE_UNUSED bool SameSize(const Image1 &image1, const Image2 &image2)
Definition: image.h:399
static HWY_INLINE HWY_MAYBE_UNUSED size_t Mirror(int64_t x, const int64_t xsize)
Definition: image.h:407
std::unique_ptr< T, AlignedFreer > AlignedFreeUniquePtr
Definition: aligned_allocator.h:193
ImageBase & operator=(ImageBase &&other) noexcept=default
Padding
Definition: image.h:115
static size_t VectorSize()
HWY_INLINE size_t xsize() const
Definition: image.h:85
HWY_INLINE void * VoidRow(const size_t y) const
Definition: image.h:104
HWY_INLINE uint8_t * bytes()
Definition: image.h:93
HWY_INLINE const uint8_t * bytes() const
Definition: image.h:97
void Swap(ImageBase &other)
size_t bytes_per_row_
Definition: image.h:133
ImageBase & operator=(const ImageBase &other)=delete
void ShrinkTo(const size_t xsize, const size_t ysize)
Definition: image.h:77
ImageBase()
Definition: image.h:46
HWY_INLINE size_t ysize() const
Definition: image.h:86
static size_t BytesPerRow(const size_t xsize, const size_t sizeof_t)
uint32_t xsize_
Definition: image.h:131
AlignedFreeUniquePtr< uint8_t[]> bytes_
Definition: image.h:134
ImageBase(size_t xsize, size_t ysize, size_t bytes_per_row, void *aligned)
ImageBase(ImageBase &&other) noexcept=default
uint32_t ysize_
Definition: image.h:132
ImageBase(const ImageBase &other)=delete
void InitializePadding(size_t sizeof_t, Padding padding)
HWY_INLINE size_t bytes_per_row() const
Definition: image.h:89
ImageBase(size_t xsize, size_t ysize, size_t sizeof_t)
HWY_INLINE size_t operator()(const int64_t coord, const size_t size) const
Definition: image.h:426
HWY_INLINE const float * operator()(const float *const HWY_RESTRICT row, int64_t) const
Definition: image.h:468
HWY_INLINE size_t operator()(const int64_t coord, size_t) const
Definition: image.h:434