9 #ifndef LLU_CONTAINERS_IMAGE_H_
10 #define LLU_CONTAINERS_IMAGE_H_
37 T
get(mint row, mint col, mint channel)
const {
38 std::array<mint, 2> pos {{row, col}};
39 return getValueAt(pos.data(), channel);
50 T
get(mint slice, mint row, mint col, mint channel)
const {
51 std::array<mint, 3> pos {{slice, row, col}};
52 return getValueAt(pos.data(), channel);
63 void set(mint row, mint col, mint channel, T newValue) {
64 std::array<mint, 2> pos {{row, col}};
65 setValueAt(pos.data(), channel, newValue);
77 void set(mint slice, mint row, mint col, mint channel, T newValue) {
78 std::array<mint, 3> pos {{slice, row, col}};
79 setValueAt(pos.data(), channel, newValue);
88 T* getData() const noexcept
override {
93 virtual MImage getInternal()
const = 0;
96 [[noreturn]]
void indexError()
const {
106 T getValueAt(mint* pos, mint channel)
const;
114 void setValueAt(mint* pos, mint channel, T newValue);
137 Image(mint w, mint h, mint
channels, colorspace_t cs,
bool interleavingQ);
149 Image(mint nFrames, mint w, mint h, mint
channels, colorspace_t cs,
bool interleavingQ);
198 MImage getInternal() const noexcept
override {
203 [[noreturn]]
static void sizeError() {
212 static MArrayDimensions dimensionsFromGenericImage(
const GenericBase& im);
216 Image<T>::Image(mint w, mint h, mint channels, colorspace_t cs,
bool interleavingQ) :
Image(0, w, h, channels, cs, interleavingQ) {}
226 Image<T>::Image(mint nFrames, mint w, mint h, mint channels, colorspace_t cs,
bool interleavingQ)
243 return convert<U>(interleavedQ());
248 std::vector<mint> dims;
249 if (!im.getContainer()) {
252 mint depth = im.getRank() + (im.channels() == 1 ? 0 : 1);
254 dims = {im.slices(), im.rows(), im.columns()};
256 dims = {im.rows(), im.columns()};
258 if (im.channels() > 1) {
259 if (im.interleavedQ()) {
260 dims.push_back(im.channels());
262 dims.insert(dims.begin(), im.channels());
265 if (dims.size() !=
static_cast<std::make_unsigned_t<mint>
>(depth)) {
268 return MArrayDimensions {dims};