summaryrefslogtreecommitdiffstats
path: root/third_party/jpeg-xl/lib/jxl/modular/modular_image.cc
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/jpeg-xl/lib/jxl/modular/modular_image.cc')
-rw-r--r--third_party/jpeg-xl/lib/jxl/modular/modular_image.cc35
1 files changed, 23 insertions, 12 deletions
diff --git a/third_party/jpeg-xl/lib/jxl/modular/modular_image.cc b/third_party/jpeg-xl/lib/jxl/modular/modular_image.cc
index 746d7c87fd..32a5531080 100644
--- a/third_party/jpeg-xl/lib/jxl/modular/modular_image.cc
+++ b/third_party/jpeg-xl/lib/jxl/modular/modular_image.cc
@@ -8,6 +8,7 @@
#include <sstream>
#include "lib/jxl/base/status.h"
+#include "lib/jxl/image_ops.h"
#include "lib/jxl/modular/transform/transform.h"
namespace jxl {
@@ -28,9 +29,18 @@ void Image::undo_transforms(const weighted::Header &wp_header,
}
}
-Image::Image(size_t iw, size_t ih, int bitdepth, int nb_chans)
- : w(iw), h(ih), bitdepth(bitdepth), nb_meta_channels(0), error(false) {
- for (int i = 0; i < nb_chans; i++) channel.emplace_back(Channel(iw, ih));
+Image::Image(size_t iw, size_t ih, int bitdepth)
+ : w(iw), h(ih), bitdepth(bitdepth), nb_meta_channels(0), error(false) {}
+
+StatusOr<Image> Image::Create(size_t iw, size_t ih, int bitdepth,
+ int nb_chans) {
+ Image result(iw, ih, bitdepth);
+ for (int i = 0; i < nb_chans; i++) {
+ StatusOr<Channel> channel_or = Channel::Create(iw, ih);
+ JXL_RETURN_IF_ERROR(channel_or.status());
+ result.channel.emplace_back(std::move(channel_or).value());
+ }
+ return result;
}
Image::Image() : w(0), h(0), bitdepth(8), nb_meta_channels(0), error(true) {}
@@ -46,17 +56,18 @@ Image &Image::operator=(Image &&other) noexcept {
return *this;
}
-Image Image::clone() {
- Image c(w, h, bitdepth, 0);
- c.nb_meta_channels = nb_meta_channels;
- c.error = error;
- c.transform = transform;
- for (Channel &ch : channel) {
- Channel a(ch.w, ch.h, ch.hshift, ch.vshift);
+StatusOr<Image> Image::Clone(const Image &that) {
+ Image clone(that.w, that.h, that.bitdepth);
+ clone.nb_meta_channels = that.nb_meta_channels;
+ clone.error = that.error;
+ clone.transform = that.transform;
+ for (const Channel &ch : that.channel) {
+ JXL_ASSIGN_OR_RETURN(Channel a,
+ Channel::Create(ch.w, ch.h, ch.hshift, ch.vshift));
CopyImageTo(ch.plane, &a.plane);
- c.channel.push_back(std::move(a));
+ clone.channel.push_back(std::move(a));
}
- return c;
+ return clone;
}
#if JXL_DEBUG_V_LEVEL >= 1