#ifndef IMAGE_HH #define IMAGE_HH #include "date.hh" #include "location.hh" #include "rotation.hh" #include #include class RoBuffer; class Image { public: virtual ~Image() = default; class Thumbnail { public: virtual ~Thumbnail() = default; virtual std::string_view mime_type() const = 0; virtual uint64_t size() const = 0; protected: Thumbnail() = default; }; static std::unique_ptr load(std::filesystem::path const& path); virtual uint64_t width() const = 0; virtual uint64_t height() const = 0; virtual Location location() const = 0; virtual Rotation rotation() const = 0; virtual Date date() const = 0; virtual Thumbnail* thumbnail() const = 0; protected: Image() = default; Image(Image const&) = delete; Image& operator=(Image const&) = delete; }; class ThumbnailReader { public: virtual ~ThumbnailReader() = default; static std::unique_ptr create(); enum class Return { NEED_MORE, // Call drain() again if you want data. DONE, // Data is available, no need to call drain() again. ERR, // Error, no data will ever be available. }; virtual Return drain(RoBuffer* in, size_t* bytes = nullptr) = 0; // Returns empty until drain() returns Return::DONE. virtual std::string_view data() const = 0; protected: ThumbnailReader() = default; ThumbnailReader(ThumbnailReader const&) = delete; ThumbnailReader& operator=(ThumbnailReader const&) = delete; }; #endif // IMAGE_HH