16#ifndef HIGHWAY_HWY_CONTRIB_IMAGE_IMAGE_H_
17#define HIGHWAY_HWY_CONTRIB_IMAGE_IMAGE_H_
48 ImageBase(
size_t xsize,
size_t ysize,
size_t sizeof_t);
54 ImageBase(
size_t xsize,
size_t ysize,
size_t bytes_per_row,
void* aligned);
72 void ShrinkTo(
const size_t xsize,
const size_t ysize) {
73 xsize_ =
static_cast<uint32_t
>(xsize);
74 ysize_ =
static_cast<uint32_t
>(ysize);
89 void* p = bytes_.get();
93 const void* p = bytes_.get();
100#if HWY_IS_ASAN || HWY_IS_MSAN || HWY_IS_TSAN
102 HWY_ABORT(
"Row(%d) >= %u\n",
static_cast<int>(y), ysize_);
106 void* row = bytes_.get() + y * bytes_per_row_;
153template <
typename ComponentType>
156 using T = ComponentType;
170 return static_cast<const T*
>(
VoidRow(y));
173 return static_cast<const T*
>(
VoidRow(y));
200template <
typename ComponentType>
203 using T = ComponentType;
215 planes_[i] = std::move(other.planes_[i]);
222 "Not same size: %d x %d, %d x %d, %d x %d\n",
223 static_cast<int>(plane0.xsize()),
static_cast<int>(plane0.ysize()),
224 static_cast<int>(plane1.xsize()),
static_cast<int>(plane1.ysize()),
225 static_cast<int>(plane2.xsize()),
static_cast<int>(plane2.ysize()));
227 planes_[0] = std::move(plane0);
228 planes_[1] = std::move(plane1);
229 planes_[2] = std::move(plane2);
239 planes_[i] = std::move(other.planes_[i]);
261 for (
size_t c = 0; c < 3; ++c) {
287#if HWY_IS_ASAN || HWY_IS_MSAN || HWY_IS_TSAN
289 HWY_ABORT(
"PlaneRow(%d, %d) >= %d\n",
static_cast<int>(c),
290 static_cast<int>(y),
static_cast<int>(
ysize()));
314 constexpr Rect(
size_t xbegin,
size_t ybegin,
size_t xsize_max,
315 size_t ysize_max,
size_t xend,
size_t yend)
326 template <
typename Image>
341 template <
typename T>
346 template <
typename T>
351 template <
typename T>
356 template <
typename T>
363 template <
class ImageT>
375 static constexpr size_t ClampedSize(
size_t begin,
size_t size_max,
377 return (begin + size_max <= end) ? size_max
378 : (end > begin ? end - begin : 0);
389template <
class Image1,
class Image2>
391 return image1.xsize() == image2.xsize() && image1.ysize() == image2.ysize();
399 const int64_t xsize) {
403 while (x < 0 || x >= xsize) {
407 x = 2 * xsize - 1 - x;
410 return static_cast<size_t>(x);
418 return Mirror(coord,
static_cast<int64_t
>(size));
426 return static_cast<size_t>(coord);
434 template <
class View>
439 const int64_t stride)
const {
446 const int64_t num_after = row -
last_row_;
#define HWY_ALIGNMENT
Definition aligned_allocator.h:41
#define HWY_RESTRICT
Definition base.h:95
#define HWY_ABORT(format,...)
Definition base.h:233
#define HWY_INLINE
Definition base.h:101
#define HWY_DASSERT(condition)
Definition base.h:290
#define HWY_MAYBE_UNUSED
Definition base.h:113
#define HWY_ASSUME_ALIGNED(ptr, align)
Definition base.h:139
Definition aligned_allocator.h:224
ImageT planes_[kNumPlanes]
Definition image.h:302
Image3(const Image3 &other)=delete
Image3 & operator=(Image3 &&other) noexcept
Definition image.h:237
HWY_INLINE size_t xsize() const
Definition image.h:273
HWY_INLINE size_t ysize() const
Definition image.h:274
HWY_INLINE T * MutablePlaneRow(const size_t c, const size_t y) const
Definition image.h:251
Image3(Image3 &&other) noexcept
Definition image.h:213
Image3(const size_t xsize, const size_t ysize)
Definition image.h:209
Image3(ImageT &&plane0, ImageT &&plane1, ImageT &&plane2)
Definition image.h:219
Image3()
Definition image.h:207
HWY_INLINE const T * ConstPlaneRow(const size_t c, const size_t y)
Definition image.h:247
HWY_INLINE const T * ConstPlaneRow(const size_t c, const size_t y) const
Definition image.h:244
HWY_INLINE const ImageT & Plane(size_t idx) const
Definition image.h:258
ComponentType T
Definition image.h:203
void ShrinkTo(const size_t xsize, const size_t ysize)
Definition image.h:266
HWY_INLINE T * MutablePlaneRow(const size_t c, const size_t y)
Definition image.h:254
HWY_INLINE void * VoidPlaneRow(const size_t c, const size_t y) const
Definition image.h:286
HWY_INLINE intptr_t PixelsPerRow() const
Definition image.h:282
static constexpr size_t kNumPlanes
Definition image.h:205
Image3 & operator=(const Image3 &other)=delete
HWY_INLINE size_t bytes_per_row() const
Definition image.h:278
void Swap(Image3 &other)
Definition image.h:260
HWY_INLINE intptr_t PixelsPerRow() const
Definition image.h:189
void InitializePaddingForUnalignedAccesses()
Definition image.h:165
HWY_INLINE T * MutableRow(const size_t y)
Definition image.h:182
Image(const size_t xsize, const size_t ysize, size_t bytes_per_row, void *aligned)
Definition image.h:161
HWY_INLINE const T * ConstRow(const size_t y)
Definition image.h:172
ComponentType T
Definition image.h:156
HWY_INLINE T * MutableRow(const size_t y) const
Definition image.h:179
HWY_INLINE const T * ConstRow(const size_t y) const
Definition image.h:169
Image(const size_t xsize, const size_t ysize)
Definition image.h:159
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:314
T * MutableRow(const Image< T > *image, size_t y) const
Definition image.h:347
T * MutablePlaneRow(Image3< T > *image, const size_t c, size_t y) const
Definition image.h:357
size_t x0_
Definition image.h:381
size_t xsize() const
Definition image.h:370
static constexpr size_t ClampedSize(size_t begin, size_t size_max, size_t end)
Definition image.h:375
const T * ConstRow(const Image< T > *image, size_t y) const
Definition image.h:342
bool IsInside(const ImageT &image) const
Definition image.h:364
Rect(const Image &image)
Definition image.h:327
const T * ConstPlaneRow(const Image3< T > &image, size_t c, size_t y) const
Definition image.h:352
Rect Subrect(size_t xbegin, size_t ybegin, size_t xsize_max, size_t ysize_max)
Definition image.h:335
Rect & operator=(const Rect &)=default
size_t xsize_
Definition image.h:384
size_t y0_
Definition image.h:382
constexpr Rect(size_t xbegin, size_t ybegin, size_t xsize, size_t ysize)
Definition image.h:322
Rect()
Definition image.h:330
size_t ysize() const
Definition image.h:371
Rect(const Rect &)=default
size_t ysize_
Definition image.h:385
size_t x0() const
Definition image.h:368
size_t y0() const
Definition image.h:369
const float *const HWY_RESTRICT first_row_
Definition image.h:454
const float *const HWY_RESTRICT last_row_
Definition image.h:455
const float * operator()(const float *const HWY_RESTRICT row, const int64_t stride) const
Definition image.h:438
WrapRowMirror(const View &image, size_t ysize)
Definition image.h:435
#define HWY_CONTRIB_DLLEXPORT
Definition highway_export.h:14
std::unique_ptr< T, AlignedFreer > AlignedFreeUniquePtr
Definition aligned_allocator.h:247
HWY_MAYBE_UNUSED bool SameSize(const Image1 &image1, const Image2 &image2)
Definition image.h:390
static HWY_INLINE HWY_MAYBE_UNUSED size_t Mirror(int64_t x, const int64_t xsize)
Definition image.h:398
Padding
Definition image.h:110
HWY_INLINE uint8_t * bytes()
Definition image.h:88
static size_t VectorSize()
HWY_INLINE size_t xsize() const
Definition image.h:80
HWY_INLINE const uint8_t * bytes() const
Definition image.h:92
void Swap(ImageBase &other)
HWY_INLINE void * VoidRow(const size_t y) const
Definition image.h:99
size_t bytes_per_row_
Definition image.h:128
static size_t BytesPerRow(size_t xsize, size_t sizeof_t)
void ShrinkTo(const size_t xsize, const size_t ysize)
Definition image.h:72
ImageBase()
Definition image.h:41
HWY_INLINE size_t ysize() const
Definition image.h:81
uint32_t xsize_
Definition image.h:126
AlignedFreeUniquePtr< uint8_t[]> bytes_
Definition image.h:129
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:127
ImageBase(const ImageBase &other)=delete
void InitializePadding(size_t sizeof_t, Padding padding)
HWY_INLINE size_t bytes_per_row() const
Definition image.h:84
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:417
HWY_INLINE const float * operator()(const float *const HWY_RESTRICT row, int64_t) const
Definition image.h:459
HWY_INLINE size_t operator()(const int64_t coord, size_t) const
Definition image.h:425