summaryrefslogtreecommitdiff
path: root/libheif/heif_image.h
diff options
context:
space:
mode:
Diffstat (limited to 'libheif/heif_image.h')
-rw-r--r--libheif/heif_image.h126
1 files changed, 126 insertions, 0 deletions
diff --git a/libheif/heif_image.h b/libheif/heif_image.h
new file mode 100644
index 0000000..d3251e5
--- /dev/null
+++ b/libheif/heif_image.h
@@ -0,0 +1,126 @@
+/*
+ * HEIF codec.
+ * Copyright (c) 2017 struktur AG, Dirk Farin <farin@struktur.de>
+ *
+ * This file is part of libheif.
+ *
+ * libheif is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * libheif is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with libheif. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef LIBHEIF_HEIF_IMAGE_H
+#define LIBHEIF_HEIF_IMAGE_H
+
+#include "heif.h"
+#include "error.h"
+
+#include <vector>
+#include <memory>
+#include <map>
+#include <set>
+
+
+namespace heif {
+
+class HeifPixelImage : public std::enable_shared_from_this<HeifPixelImage>,
+ public ErrorBuffer
+{
+ public:
+ explicit HeifPixelImage();
+ ~HeifPixelImage();
+
+ void create(int width,int height, heif_colorspace colorspace, heif_chroma chroma);
+
+ void add_plane(heif_channel channel, int width, int height, int bit_depth);
+
+ bool has_channel(heif_channel channel) const;
+
+ // Has alpha information either as a separate channel or in the interleaved format.
+ bool has_alpha() const;
+
+ int get_width() const { return m_width; }
+
+ int get_height() const { return m_height; }
+
+ int get_width(enum heif_channel channel) const;
+
+ int get_height(enum heif_channel channel) const;
+
+ heif_chroma get_chroma_format() const { return m_chroma; }
+
+ heif_colorspace get_colorspace() const { return m_colorspace; }
+
+ std::set<enum heif_channel> get_channel_set() const;
+
+ int get_bits_per_pixel(enum heif_channel channel) const;
+
+ uint8_t* get_plane(enum heif_channel channel, int* out_stride);
+ const uint8_t* get_plane(enum heif_channel channel, int* out_stride) const;
+
+ void copy_new_plane_from(const std::shared_ptr<HeifPixelImage> src_image,
+ heif_channel src_channel,
+ heif_channel dst_channel);
+ void fill_new_plane(heif_channel dst_channel, uint8_t value, int width, int height);
+
+ void transfer_plane_from_image_as(std::shared_ptr<HeifPixelImage> source,
+ heif_channel src_channel,
+ heif_channel dst_channel);
+
+ std::shared_ptr<HeifPixelImage> convert_colorspace(heif_colorspace colorspace,
+ heif_chroma chroma) const;
+
+ Error rotate_ccw(int angle_degrees,
+ std::shared_ptr<HeifPixelImage>& out_img);
+
+ Error mirror_inplace(bool horizontal);
+
+ Error crop(int left,int right,int top,int bottom,
+ std::shared_ptr<HeifPixelImage>& out_img) const;
+
+ Error fill_RGB_16bit(uint16_t r, uint16_t g, uint16_t b, uint16_t a);
+
+ Error overlay(std::shared_ptr<HeifPixelImage>& overlay, int dx,int dy);
+
+ Error scale_nearest_neighbor(std::shared_ptr<HeifPixelImage>& output, int width,int height) const;
+
+ private:
+ struct ImagePlane {
+ int width;
+ int height;
+ int bit_depth;
+
+ std::vector<uint8_t> mem;
+ int stride;
+ };
+
+ int m_width = 0;
+ int m_height = 0;
+ heif_colorspace m_colorspace = heif_colorspace_undefined;
+ heif_chroma m_chroma = heif_chroma_undefined;
+
+ std::map<heif_channel, ImagePlane> m_planes;
+
+ std::shared_ptr<HeifPixelImage> convert_YCbCr420_to_RGB() const;
+ std::shared_ptr<HeifPixelImage> convert_YCbCr420_to_RGB24() const;
+ std::shared_ptr<HeifPixelImage> convert_YCbCr420_to_RGB32() const;
+ std::shared_ptr<HeifPixelImage> convert_RGB_to_RGB24_32() const;
+ std::shared_ptr<HeifPixelImage> convert_mono_to_RGB(int bpp) const;
+ std::shared_ptr<HeifPixelImage> convert_mono_to_YCbCr420() const;
+ std::shared_ptr<HeifPixelImage> convert_RGB24_32_to_YCbCr420() const;
+};
+
+
+}
+
+#endif