20 template <ImageAlphaMode Mode>
27 Image(
Size size_,
const uint8_t* srcData, std::size_t srcLength) :
size(size_) {
28 if (srcLength !=
bytes()) {
29 throw std::invalid_argument(
"mismatched image size");
31 data = std::make_unique<uint8_t[]>(
bytes());
32 std::copy(srcData, srcData + srcLength,
data.get());
37 Image(
Image&& o) noexcept :
size(o.size),
data(std::move(o.data)) { o.size.width = o.size.height = 0; }
41 data = std::move(o.data);
42 o.size.width = o.size.height = 0;
47 return std::equal(lhs.
data.get(), lhs.
data.get() + lhs.
bytes(),
57 template <
typename T = Image>
60 std::copy(
data.get(),
data.get() +
bytes(), copy_.data.get());
75 Image newImage(size_);
77 copy(*
this, newImage, {0, 0}, {0, 0}, {
90 if (!dstImg.
valid()) {
91 throw std::invalid_argument(
"invalid destination for image clear");
98 throw std::out_of_range(
"out of range destination coordinates for image clear");
101 uint8_t* dstData = dstImg.
data.get();
104 const std::size_t dstOffset = (pt.y + y) * dstImg.
stride() + pt.x *
channels;
117 if (!srcImg.
valid()) {
118 throw std::invalid_argument(
"invalid source for image copy");
121 if (!dstImg.
valid()) {
122 throw std::invalid_argument(
"invalid destination for image copy");
129 throw std::out_of_range(
"out of range source coordinates for image copy");
136 throw std::out_of_range(
"out of range destination coordinates for image copy");
139 const uint8_t* srcData = srcImg.
data.get();
140 uint8_t* dstData = dstImg.
data.get();
142 assert(srcData != dstData);
145 const std::size_t srcOffset = (srcPt.y + y) * srcImg.
stride() + srcPt.x *
channels;
146 const std::size_t dstOffset = (dstPt.y + y) * dstImg.
stride() + dstPt.x *
channels;
147 std::copy(srcData + srcOffset,
149 dstData + dstOffset);
155 std::unique_ptr<uint8_t[]>
data;
static void clear(Image &dstImg, const Point< uint32_t > &pt, const Size &size)
Clears the rect area specified by pt and size from dstImage.
friend bool operator!=(const Image &lhs, const Image &rhs)
Image(Image &&o) noexcept
Image(Size size_, const uint8_t *srcData, std::size_t srcLength)
friend bool operator==(const Image &lhs, const Image &rhs)
static void copy(const Image &srcImg, Image &dstImg, const Point< uint32_t > &srcPt, const Point< uint32_t > &dstPt, const Size &size)
std::unique_ptr< uint8_t[]> data
Image & operator=(Image &&o) noexcept
static constexpr size_t channels
Image(Size size_, std::unique_ptr< uint8_t[]> data_)
constexpr bool isEmpty() const
std::unique_ptr< Expression > string(std::unique_ptr< Expression >, std::unique_ptr< Expression > def=nullptr)
std::enable_if_t< std::is_integral_v< T >, T > min(T a, T b)
PremultipliedImage decodeImage(const std::string &)
@ Exclusive
Alpha-channel only.
mapbox::geometry::point< T > Point
std::string encodePNG(const PremultipliedImage &)