#pragma once #include #include #include #include #include namespace mbgl { enum class ImageAlphaMode { Unassociated, Premultiplied, Exclusive, // Alpha-channel only }; template class Image : private util::noncopyable { public: Image() = default; Image(Size size_) : size(std::move(size_)), data(std::make_unique(bytes())) {} Image(Size size_, std::unique_ptr data_) : size(std::move(size_)), data(std::move(data_)) {} Image(Image&& o) : size(o.size), data(std::move(o.data)) {} Image& operator=(Image&& o) { size = o.size; data = std::move(o.data); return *this; } bool operator==(const Image& rhs) const { return size == rhs.size && std::equal(data.get(), data.get() + bytes(), rhs.data.get(), rhs.data.get() + rhs.bytes()); } bool valid() const { return size && data.get() != nullptr; } size_t stride() const { return channels * size.width; } size_t bytes() const { return stride() * size.height; } Size size; static constexpr size_t channels = Mode == ImageAlphaMode::Exclusive ? 1 : 4; std::unique_ptr data; }; using UnassociatedImage = Image; using PremultipliedImage = Image; using AlphaImage = Image; // TODO: don't use std::string for binary data. PremultipliedImage decodeImage(const std::string&); std::string encodePNG(const PremultipliedImage&); } // namespace mbgl