16#ifndef HIGHWAY_HWY_CONTRIB_IMAGE_IMAGE_H_
17#define HIGHWAY_HWY_CONTRIB_IMAGE_IMAGE_H_
41 static size_t BytesPerRow(
const size_t xsize,
const size_t sizeof_t);
51 ImageBase(
size_t xsize,
size_t ysize,
size_t sizeof_t);
57 ImageBase(
size_t xsize,
size_t ysize,
size_t bytes_per_row,
void* aligned);
75 void ShrinkTo(
const size_t xsize,
const size_t ysize) {
76 xsize_ =
static_cast<uint32_t
>(xsize);
77 ysize_ =
static_cast<uint32_t
>(ysize);
92 void* p = bytes_.get();
96 const void* p = bytes_.get();
103#if HWY_IS_ASAN || HWY_IS_MSAN || HWY_IS_TSAN
105 HWY_ABORT(
"Row(%d) >= %u\n",
static_cast<int>(y), ysize_);
109 void* row = bytes_.get() + y * bytes_per_row_;
156template <
typename ComponentType>
159 using T = ComponentType;
173 return static_cast<const T*
>(
VoidRow(y));
176 return static_cast<const T*
>(
VoidRow(y));
203template <
typename ComponentType>
206 using T = ComponentType;
218 planes_[i] = std::move(other.planes_[i]);
225 "Not same size: %d x %d, %d x %d, %d x %d\n",
226 static_cast<int>(plane0.xsize()),
static_cast<int>(plane0.ysize()),
227 static_cast<int>(plane1.xsize()),
static_cast<int>(plane1.ysize()),
228 static_cast<int>(plane2.xsize()),
static_cast<int>(plane2.ysize()));
230 planes_[0] = std::move(plane0);
231 planes_[1] = std::move(plane1);
232 planes_[2] = std::move(plane2);
242 planes_[i] = std::move(other.planes_[i]);
264 for (
size_t c = 0; c < 3; ++c) {
290#if HWY_IS_ASAN || HWY_IS_MSAN || HWY_IS_TSAN
292 HWY_ABORT(
"PlaneRow(%d, %d) >= %d\n",
static_cast<int>(c),
293 static_cast<int>(y),
static_cast<int>(
ysize()));
317 constexpr Rect(
size_t xbegin,
size_t ybegin,
size_t xsize_max,
318 size_t ysize_max,
size_t xend,
size_t yend)
329 template <
typename Image>
344 template <
typename T>
349 template <
typename T>
354 template <
typename T>
359 template <
typename T>
366 template <
class ImageT>
378 static constexpr size_t ClampedSize(
size_t begin,
size_t size_max,
380 return (begin + size_max <= end) ? size_max
381 : (end > begin ? end - begin : 0);
392template <
class Image1,
class Image2>
394 return image1.xsize() == image2.xsize() && image1.ysize() == image2.ysize();
402 const int64_t xsize) {
406 while (x < 0 || x >= xsize) {
410 x = 2 * xsize - 1 - x;
413 return static_cast<size_t>(x);
421 return Mirror(coord,
static_cast<int64_t
>(size));
429 return static_cast<size_t>(coord);
437 template <
class View>
442 const int64_t stride)
const {
449 const int64_t num_after = row -
last_row_;
#define HWY_ALIGNMENT
Definition aligned_allocator.h:32
#define HWY_RESTRICT
Definition base.h:64
#define HWY_ABORT(format,...)
Definition base.h:188
#define HWY_INLINE
Definition base.h:70
#define HWY_DASSERT(condition)
Definition base.h:238
#define HWY_MAYBE_UNUSED
Definition base.h:82
#define HWY_ASSUME_ALIGNED(ptr, align)
Definition base.h:106
Definition aligned_allocator.h:170
ImageT planes_[kNumPlanes]
Definition image.h:305
Image3(const Image3 &other)=delete
Image3 & operator=(Image3 &&other) noexcept
Definition image.h:240
HWY_INLINE size_t xsize() const
Definition image.h:276
HWY_INLINE size_t ysize() const
Definition image.h:277
HWY_INLINE T * MutablePlaneRow(const size_t c, const size_t y) const
Definition image.h:254
Image3(Image3 &&other) noexcept
Definition image.h:216
Image3(const size_t xsize, const size_t ysize)
Definition image.h:212
Image3(ImageT &&plane0, ImageT &&plane1, ImageT &&plane2)
Definition image.h:222
Image3()
Definition image.h:210
HWY_INLINE const T * ConstPlaneRow(const size_t c, const size_t y)
Definition image.h:250
HWY_INLINE const T * ConstPlaneRow(const size_t c, const size_t y) const
Definition image.h:247
HWY_INLINE const ImageT & Plane(size_t idx) const
Definition image.h:261
ComponentType T
Definition image.h:206
void ShrinkTo(const size_t xsize, const size_t ysize)
Definition image.h:269
HWY_INLINE T * MutablePlaneRow(const size_t c, const size_t y)
Definition image.h:257
HWY_INLINE void * VoidPlaneRow(const size_t c, const size_t y) const
Definition image.h:289
HWY_INLINE intptr_t PixelsPerRow() const
Definition image.h:285
static constexpr size_t kNumPlanes
Definition image.h:208
Image3 & operator=(const Image3 &other)=delete
HWY_INLINE size_t bytes_per_row() const
Definition image.h:281
void Swap(Image3 &other)
Definition image.h:263
HWY_INLINE intptr_t PixelsPerRow() const
Definition image.h:192
void InitializePaddingForUnalignedAccesses()
Definition image.h:168
HWY_INLINE T * MutableRow(const size_t y)
Definition image.h:185
Image(const size_t xsize, const size_t ysize, size_t bytes_per_row, void *aligned)
Definition image.h:164
HWY_INLINE const T * ConstRow(const size_t y)
Definition image.h:175
ComponentType T
Definition image.h:159
HWY_INLINE T * MutableRow(const size_t y) const
Definition image.h:182
HWY_INLINE const T * ConstRow(const size_t y) const
Definition image.h:172
Image(const size_t xsize, const size_t ysize)
Definition image.h:162
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:317
T * MutableRow(const Image< T > *image, size_t y) const
Definition image.h:350
T * MutablePlaneRow(Image3< T > *image, const size_t c, size_t y) const
Definition image.h:360
size_t x0_
Definition image.h:384
size_t xsize() const
Definition image.h:373
static constexpr size_t ClampedSize(size_t begin, size_t size_max, size_t end)
Definition image.h:378
const T * ConstRow(const Image< T > *image, size_t y) const
Definition image.h:345
bool IsInside(const ImageT &image) const
Definition image.h:367
Rect(const Image &image)
Definition image.h:330
const T * ConstPlaneRow(const Image3< T > &image, size_t c, size_t y) const
Definition image.h:355
Rect Subrect(size_t xbegin, size_t ybegin, size_t xsize_max, size_t ysize_max)
Definition image.h:338
Rect & operator=(const Rect &)=default
size_t xsize_
Definition image.h:387
size_t y0_
Definition image.h:385
constexpr Rect(size_t xbegin, size_t ybegin, size_t xsize, size_t ysize)
Definition image.h:325
Rect()
Definition image.h:333
size_t ysize() const
Definition image.h:374
Rect(const Rect &)=default
size_t ysize_
Definition image.h:388
size_t x0() const
Definition image.h:371
size_t y0() const
Definition image.h:372
const float *const HWY_RESTRICT first_row_
Definition image.h:457
const float *const HWY_RESTRICT last_row_
Definition image.h:458
const float * operator()(const float *const HWY_RESTRICT row, const int64_t stride) const
Definition image.h:441
WrapRowMirror(const View &image, size_t ysize)
Definition image.h:438
#define HWY_CONTRIB_DLLEXPORT
Definition highway_export.h:14
Definition aligned_allocator.h:27
HWY_MAYBE_UNUSED bool SameSize(const Image1 &image1, const Image2 &image2)
Definition image.h:393
static HWY_INLINE HWY_MAYBE_UNUSED size_t Mirror(int64_t x, const int64_t xsize)
Definition image.h:401
std::unique_ptr< T, AlignedFreer > AlignedFreeUniquePtr
Definition aligned_allocator.h:193
Padding
Definition image.h:113
HWY_INLINE uint8_t * bytes()
Definition image.h:91
static size_t VectorSize()
HWY_INLINE size_t xsize() const
Definition image.h:83
HWY_INLINE const uint8_t * bytes() const
Definition image.h:95
void Swap(ImageBase &other)
HWY_INLINE void * VoidRow(const size_t y) const
Definition image.h:102
size_t bytes_per_row_
Definition image.h:131
void ShrinkTo(const size_t xsize, const size_t ysize)
Definition image.h:75
ImageBase()
Definition image.h:44
HWY_INLINE size_t ysize() const
Definition image.h:84
static size_t BytesPerRow(const size_t xsize, const size_t sizeof_t)
uint32_t xsize_
Definition image.h:129
AlignedFreeUniquePtr< uint8_t[]> bytes_
Definition image.h:132
ImageBase(size_t xsize, size_t ysize, size_t bytes_per_row, void *aligned)
ImageBase(ImageBase &&other) noexcept=default
ImageBase & operator=(const ImageBase &other)=delete
uint32_t ysize_
Definition image.h:130
ImageBase(const ImageBase &other)=delete
void InitializePadding(size_t sizeof_t, Padding padding)
HWY_INLINE size_t bytes_per_row() const
Definition image.h:87
ImageBase(size_t xsize, size_t ysize, size_t sizeof_t)
ImageBase & operator=(ImageBase &&other) noexcept=default
HWY_INLINE size_t operator()(const int64_t coord, const size_t size) const
Definition image.h:420
HWY_INLINE const float * operator()(const float *const HWY_RESTRICT row, int64_t) const
Definition image.h:462
HWY_INLINE size_t operator()(const int64_t coord, size_t) const
Definition image.h:428