diff options
Diffstat (limited to 'includes/image_io/jpeg/jpeg_info.h')
-rw-r--r-- | includes/image_io/jpeg/jpeg_info.h | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/includes/image_io/jpeg/jpeg_info.h b/includes/image_io/jpeg/jpeg_info.h new file mode 100644 index 0000000..8aedf9e --- /dev/null +++ b/includes/image_io/jpeg/jpeg_info.h @@ -0,0 +1,153 @@ +#ifndef IMAGE_IO_JPEG_JPEG_INFO_H_ // NOLINT +#define IMAGE_IO_JPEG_JPEG_INFO_H_ // NOLINT + +#include <vector> + +#include "image_io/base/data_range.h" +#include "image_io/jpeg/jpeg_segment_info.h" +#include "image_io/jpeg/jpeg_xmp_info.h" + +namespace photos_editing_formats { +namespace image_io { + +/// A class to represent interesting depth and image information in a JPEG file, +/// and where it is located so that it can be efficiently extracted. +class JpegInfo { + public: + JpegInfo() { JpegXmpInfo::InitializeVector(&xmp_info_vector_); } + JpegInfo(const JpegInfo&) = default; + JpegInfo& operator=(const JpegInfo&) = default; + + /// @return The vector of data ranges indicating the locations of the images. + const std::vector<DataRange>& GetImageRanges() const { return image_ranges_; } + + /// @return The vector of interesting segment info structures. + const std::vector<JpegSegmentInfo>& GetSegmentInfos() const { + return segment_infos_; + } + + /// @param image_index The image containing the sought after segment info. + /// @param type The type of segment info to get. + /// @return The segment info, or one that is invalid if not found. + JpegSegmentInfo GetSegmentInfo(size_t image_index, + const std::string& type) const { + for (const auto& segment_info : GetSegmentInfos()) { + if (segment_info.GetImageIndex() == image_index && + segment_info.GetType() == type) { + return segment_info; + } + } + return JpegSegmentInfo(0, DataRange(), ""); + } + + /// @return True if there is Apple depth information. + bool HasAppleDepth() const { return apple_depth_image_range_.IsValid(); } + + /// @return True if there is Apple matte information. + bool HasAppleMatte() const { return apple_matte_image_range_.IsValid(); } + + /// @return True if there is GDepth type depth information. + bool HasGDepth() const { + return HasImage(JpegXmpInfo::kGDepthInfoType); + } + + /// @return True if there is GImage information. + bool HasGImage() const { + return HasImage(JpegXmpInfo::kGImageInfoType); + } + + /// @return True if there is either Apple or GDepth information. + bool HasDepth() const { return HasAppleDepth() || HasGDepth(); } + + /// @return True if there is an extratable image present. + bool HasExtractableImage() const { + return HasAppleDepth() || HasAppleMatte() || HasGDepth() || HasGImage(); + } + + /// @param xmp_info_type The type of xmp image information desired. + /// @return True if there is information of the given type. + bool HasImage(JpegXmpInfo::Type xmp_info_type) const { + return !GetSegmentDataRanges(xmp_info_type).empty(); + } + + /// @return The DataRange where the Apple depth information is located. + const DataRange& GetAppleDepthImageRange() const { + return apple_depth_image_range_; + } + + /// @return The DataRange where the Apple matte information is located. + const DataRange& GetAppleMatteImageRange() const { + return apple_matte_image_range_; + } + + /// @param type The type of Xmp data to get the mime type of. + /// @return The mime type for the Xmp data of the given type. + std::string GetMimeType(JpegXmpInfo::Type type) const { + return xmp_info_vector_[type].GetMimeType(); + } + + /// @param type The type of Xmp data to get the segment data ranges of. + /// @return The segment data ranges containing the Xmp data of the given type. + const std::vector<DataRange>& GetSegmentDataRanges( + JpegXmpInfo::Type type) const { + return xmp_info_vector_[type].GetSegmentDataRanges(); + } + + /// Adds a DataRange to the vector of image DataRanges. + /// @param image_range The data range of an image. + void AddImageRange(const DataRange& image_range) { + image_ranges_.push_back(image_range); + } + + /// Adds a JpegSegmentInfo to the vector of JpegSegmentInfos. + /// @param jpeg_segment_info The info structure to add. + void AddSegmentInfo(const JpegSegmentInfo& segment_info) { + segment_infos_.push_back(segment_info); + } + + /// @param data_range The DataRange where Apple depth information is located. + void SetAppleDepthImageRange(const DataRange& data_range) { + apple_depth_image_range_ = data_range; + } + + /// @param data_range The DataRange where Apple matte information is located. + void SetAppleMatteImageRange(const DataRange& data_range) { + apple_matte_image_range_ = data_range; + } + + /// @param type The type of Xmp data to set the mime type of. + /// @param mime_type The mime type of the Xmp data. + void SetMimeType(JpegXmpInfo::Type type, const std::string& mime_type) { + xmp_info_vector_[type].SetMimeType(mime_type); + } + + /// @param type The type of Xmp data to set segment data ranges of. + /// @param segment_data_ranges The segment that contain the Xmp data. + void SetSegmentDataRanges(JpegXmpInfo::Type type, + const std::vector<DataRange>& segment_data_ranges) { + xmp_info_vector_[type].SetSegmentDataRanges(segment_data_ranges); + } + + private: + /// The DataRanges of all images. + std::vector<DataRange> image_ranges_; + + /// Interesting segment information. Currently information about APP0/JFIF, + /// APP1/EXIF and APP2/MPF segments are saved here. + std::vector<JpegSegmentInfo> segment_infos_; + + /// The DataRange of the Apple depth information. + DataRange apple_depth_image_range_; + + /// The DataRange of the Apple depth information. + DataRange apple_matte_image_range_; + + /// A vector holding information about the Xmp segments containing GDepth and + /// GImage data. + std::vector<JpegXmpInfo> xmp_info_vector_; +}; + +} // namespace image_io +} // namespace photos_editing_formats + +#endif // IMAGE_IO_JPEG_JPEG_INFO_H_ // NOLINT |