LibraryLink Utilities  3.0.1
Modern C++ wrapper over LibraryLink and WSTP
Views/Image.hpp
Go to the documentation of this file.
1 
6 #ifndef LLU_CONTAINERS_VIEWS_IMAGE_HPP
7 #define LLU_CONTAINERS_VIEWS_IMAGE_HPP
8 
13 
14 namespace LLU {
15 
22  class ImageView : public ImageInterface {
23  public:
24  ImageView() = default;
25 
30  ImageView(const GenericImage& gIm) : m {gIm.getContainer()} {} // NOLINT: implicit conversion to a view is useful and harmless
31 
36  ImageView(MImage mi) : m {mi} {} // NOLINT
37 
39  colorspace_t colorspace() const override {
40  return LibraryData::ImageAPI()->MImage_getColorSpace(m);
41  }
42 
44  mint rows() const override {
45  return LibraryData::ImageAPI()->MImage_getRowCount(m);
46  }
47 
49  mint columns() const override {
50  return LibraryData::ImageAPI()->MImage_getColumnCount(m);
51  }
52 
54  mint slices() const override {
55  return LibraryData::ImageAPI()->MImage_getSliceCount(m);
56  }
57 
59  mint channels() const override {
60  return LibraryData::ImageAPI()->MImage_getChannels(m);
61  }
62 
64  bool alphaChannelQ() const override {
65  return LibraryData::ImageAPI()->MImage_alphaChannelQ(m) == True;
66  }
67 
69  bool interleavedQ() const override {
70  return LibraryData::ImageAPI()->MImage_interleavedQ(m) == True;
71  }
72 
74  bool is3D() const override {
75  return LibraryData::ImageAPI()->MImage_getRank(m) == 3;
76  }
77 
79  mint getRank() const override {
80  return LibraryData::ImageAPI()->MImage_getRank(m);
81  }
82 
84  mint getFlattenedLength() const override {
85  return LibraryData::ImageAPI()->MImage_getFlattenedLength(m);
86  }
87 
89  imagedata_t type() const final {
90  return LibraryData::ImageAPI()->MImage_getDataType(m);
91  }
92 
94  void* rawData() const override {
95  return LibraryData::ImageAPI()->MImage_getRawData(m);
96  }
97 
98  private:
99  MImage m = nullptr;
100  };
101 
102  template<typename T>
103  class ImageTypedView : public ImageView, public IterableContainer<T> {
104  public:
105  ImageTypedView() = default;
106 
112  ImageTypedView(const GenericImage& gIm) : ImageView(gIm) { // NOLINT: implicit conversion to a view is useful and harmless
113  if (ImageType<T> != type()) {
115  }
116  }
117 
123  ImageTypedView(ImageView iv) : ImageView(std::move(iv)) { // NOLINT
124  if (ImageType<T> != type()) {
126  }
127  }
128 
134  ImageTypedView(MImage mi) : ImageView(mi) { // NOLINT
135  if (ImageType<T> != type()) {
137  }
138  }
139 
140  private:
141  T* getData() const noexcept override {
142  return static_cast<T*>(rawData());
143  }
144 
145  mint getSize() const noexcept override {
146  return getFlattenedLength();
147  }
148  };
149 
158  template<typename ImageT, typename F>
159  auto asTypedImage(ImageT&& img, F&& callable) {
160  switch (img.type()) {
161  case MImage_Type_Bit: return std::forward<F>(callable)(ImageTypedView<std::int8_t>(std::forward<ImageT>(img)));
162  case MImage_Type_Bit8: return std::forward<F>(callable)(ImageTypedView<std::uint8_t>(std::forward<ImageT>(img)));
163  case MImage_Type_Bit16: return std::forward<F>(callable)(ImageTypedView<std::uint16_t>(std::forward<ImageT>(img)));
164  case MImage_Type_Real32: return std::forward<F>(callable)(ImageTypedView<float>(std::forward<ImageT>(img)));
165  case MImage_Type_Real: return std::forward<F>(callable)(ImageTypedView<double>(std::forward<ImageT>(img)));
167  }
168  }
169 
171  // Specialization of asTypedImage for MImage
172  template<typename F>
173  auto asTypedImage(MImage img, F&& callable) {
174  return asTypedImage(ImageView {img}, std::forward<F>(callable));
175  }
177 } // namespace LLU
178 
179 #endif // LLU_CONTAINERS_VIEWS_IMAGE_HPP
LLU::ImageView::slices
mint slices() const override
Get number of slices.
Definition: Views/Image.hpp:54
LLU::ImageView::rows
mint rows() const override
Get number of rows.
Definition: Views/Image.hpp:44
LLU::GenericImage
MContainer< MArgumentType::Image > GenericImage
MContainer specialization for MImage is called GenericImage.
Definition: Generic/Image.hpp:17
LLU
Main namespace of LibraryLink Utilities.
Definition: Queue.h:13
LLU::ImageView::alphaChannelQ
bool alphaChannelQ() const override
Check if there is an alpha channel in the image.
Definition: Views/Image.hpp:64
LLU::ImageView::colorspace
colorspace_t colorspace() const override
Get colorspace which describes how colors are represented as numbers.
Definition: Views/Image.hpp:39
LLU::ImageView::rawData
void * rawData() const override
Get access to raw image data.
Definition: Views/Image.hpp:94
LLU::ErrorName::ImageTypeError
const std::string ImageTypeError
Image type mismatch.
LLU::ImageInterface
Abstract class that defines a basic set of operations on an image.
Definition: Interfaces.h:17
LLU::MContainer< MArgumentType::Image >
MContainer specialization for MImage.
Definition: Generic/Image.hpp:23
LLU::ImageView::ImageView
ImageView(MImage mi)
Create a ImageView from a raw MImage.
Definition: Views/Image.hpp:36
LLU::ImageView::type
imagedata_t type() const final
Get the data type of the image.
Definition: Views/Image.hpp:89
Image.hpp
GenericImage definition and implementation.
LLU::LibraryData::ImageAPI
static const st_WolframImageLibrary_Functions * ImageAPI()
Get a pointer to structure with function pointers to MImage API.
Definition: LibraryData.cpp:41
LLU::MContainerBase::getContainer
Container getContainer() const noexcept
Get internal container.
Definition: Base.hpp:97
ErrorManager.h
Definition of the ErrorManager class responsible for error registration and throwing.
LLU::ImageView::channels
mint channels() const override
Get number of channels.
Definition: Views/Image.hpp:59
LLU::ImageView::getRank
mint getRank() const override
Get rank.
Definition: Views/Image.hpp:79
LLU::ImageView::ImageView
ImageView(const GenericImage &gIm)
Create a ImageView from a GenericImage.
Definition: Views/Image.hpp:30
LLU::ErrorManager::throwException
static void throwException(const std::string &errorName, T &&... args)
Throw exception with given name.
Definition: ErrorManager.h:199
LLU::ImageView::getFlattenedLength
mint getFlattenedLength() const override
Get the total number of pixels in the image.
Definition: Views/Image.hpp:84
LLU::ImageView::interleavedQ
bool interleavedQ() const override
Check if the image is interleaved.
Definition: Views/Image.hpp:69
LLU::ImageView::is3D
bool is3D() const override
Check if the image is 3D.
Definition: Views/Image.hpp:74
Interfaces.h
LLU::ImageView::columns
mint columns() const override
Get number of columns.
Definition: Views/Image.hpp:49
IterableContainer.hpp
Implementation of the IterableContainer class.
LLU::asTypedImage
auto asTypedImage(ImageT &&img, F &&callable)
Take a Image-like object img and a function callable and call the function with a ImageTypedView crea...
Definition: Views/Image.hpp:159
LLU::ImageView
Simple, light-weight, non-owning wrappper over MImage.
Definition: Views/Image.hpp:22