diff options
Diffstat (limited to 'includes/dynamic_depth/depth_map.h')
-rw-r--r-- | includes/dynamic_depth/depth_map.h | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/includes/dynamic_depth/depth_map.h b/includes/dynamic_depth/depth_map.h new file mode 100644 index 0000000..836ff23 --- /dev/null +++ b/includes/dynamic_depth/depth_map.h @@ -0,0 +1,128 @@ +#ifndef DYNAMIC_DEPTH_INCLUDES_DYNAMIC_DEPTH_DEPTH_MAP_H_ // NOLINT +#define DYNAMIC_DEPTH_INCLUDES_DYNAMIC_DEPTH_DEPTH_MAP_H_ // NOLINT + +#include <memory> +#include <string> +#include <unordered_map> +#include <utility> + +#include "dynamic_depth/element.h" +#include "dynamic_depth/item.h" +#include "xmpmeta/xml/deserializer.h" +#include "xmpmeta/xml/serializer.h" + +namespace photos_editing_formats { +namespace dynamic_depth { + +// The depth conversion format. Please see the Depth Map element in the +// Dynamnic Depth specification for more details. +enum class DepthFormat { kFormatNone = 0, kRangeInverse = 1, kRangeLinear = 2 }; + +// The Units of the depth map. Please see the Depth Map element in the Dynamic +// Depth specification. +enum class DepthUnits { kUnitsNone = 0, kMeters = 1, kDiopters = 2 }; + +// The type of depth measurement. Please see the Depth Map element in the +// Dynamic Depth specification. +enum class DepthMeasureType { kOpticalAxis = 1, kOpticRay = 2 }; + +// The semantics of this depth map. +enum class DepthItemSemantic { kDepth = 1, kSegmentation = 2 }; + +struct DepthMapParams { + // Mandatory values. + DepthFormat format; + float near; + float far; + DepthUnits units; + string depth_uri; + string mime; + DepthItemSemantic item_semantic = DepthItemSemantic::kDepth; + + // The bytes of the depth image. Must be non-empty at write-time (i.e. + // programmatic construction). + string depth_image_data = ""; + + // Optional values. + DepthMeasureType measure_type = DepthMeasureType::kOpticalAxis; + string confidence_uri = ""; + // The bytes of the confidence map. If confidence_uri is not empty, the + // confidence data must be non-empty at write-time (i.e. programmatic + // construction). + string confidence_data = ""; + string software = ""; + + // A list of (distance, radius) pairs. This should generally have a short + // length, so copying is expected to be inexpensive. + std::vector<float> focal_table; + + explicit DepthMapParams(DepthFormat in_format, float in_near, float in_far, + DepthUnits in_units, string in_depth_uri) + : format(in_format), + near(in_near), + far(in_far), + units(in_units), + depth_uri(in_depth_uri) {} + + inline bool operator==(const DepthMapParams& other) const { + return format == other.format && near == other.near && far == other.far && + units == other.units && depth_uri == other.depth_uri && + depth_image_data == other.depth_image_data && + measure_type == other.measure_type && + confidence_uri == other.confidence_uri && + confidence_data == other.confidence_data && + software == other.software && focal_table == other.focal_table; + } + + inline bool operator!=(const DepthMapParams& other) const { + return !(*this == other); + } +}; + +// Implements the Depth Map element from the Dynamic Depth specification, with +// serialization and deserialization. +class DepthMap : public Element { + public: + void GetNamespaces( + std::unordered_map<string, string>* ns_name_href_map) override; + + bool Serialize(xml::Serializer* serializer) const override; + + // Creates a DepthMap from the given objects in params. + static std::unique_ptr<DepthMap> FromData( + const DepthMapParams& params, std::vector<std::unique_ptr<Item>>* items); + + // Returns the deserialized DepthMap object, null if parsing fails. + // Not sensitive to case when parsing the Format, Units, or MeasureType + // fields. + static std::unique_ptr<DepthMap> FromDeserializer( + const xml::Deserializer& parent_deserializer); + + DepthFormat GetFormat() const; + float GetNear() const; + float GetFar() const; + DepthUnits GetUnits() const; + const string GetDepthUri() const; + DepthItemSemantic GetItemSemantic() const; + const string GetConfidenceUri() const; + DepthMeasureType GetMeasureType() const; + const string GetSoftware() const; + const std::vector<float>& GetFocalTable() const; + size_t GetFocalTableEntryCount() const; + + // Disallow copying + DepthMap(const DepthMap&) = delete; + void operator=(const DepthMap&) = delete; + + private: + explicit DepthMap(const DepthMapParams& params); + static std::unique_ptr<DepthMap> ParseFields( + const xml::Deserializer& deserializer); + + DepthMapParams params_; +}; + +} // namespace dynamic_depth +} // namespace photos_editing_formats + +#endif // DYNAMIC_DEPTH_INCLUDES_DYNAMIC_DEPTH_DEPTH_MAP_H_ // NOLINT |