#pragma once #include #include #include #include namespace mbgl { namespace gfx { class UploadPass; class Texture; } // namespace gfx class ImageManager; class ImagePosition { public: ImagePosition(const mapbox::Bin&, const style::Image::Impl&, uint32_t version = 0); static constexpr const uint16_t padding = 1u; float pixelRatio; Rect paddedRect; uint32_t version; style::ImageStretches stretchX; style::ImageStretches stretchY; optional content; std::array tl() const { return {{static_cast(paddedRect.x + padding), static_cast(paddedRect.y + padding)}}; } std::array br() const { return {{static_cast(paddedRect.x + paddedRect.w - padding), static_cast(paddedRect.y + paddedRect.h - padding)}}; } std::array tlbr() const { const auto _tl = tl(); const auto _br = br(); return {{ _tl[0], _tl[1], _br[0], _br[1] }}; } std::array displaySize() const { return {{ static_cast(paddedRect.w - padding * 2) / pixelRatio, static_cast(paddedRect.h - padding * 2) / pixelRatio, }}; } }; using ImagePositions = std::map; class ImagePatch { public: ImagePatch(Immutable image_, const Rect& paddedRect_) : image(std::move(image_)), paddedRect(paddedRect_) {} Immutable image; Rect paddedRect; }; class ImageAtlas { public: PremultipliedImage image; ImagePositions iconPositions; ImagePositions patternPositions; std::vector getImagePatchesAndUpdateVersions(const ImageManager&); }; ImageAtlas makeImageAtlas(const ImageMap&, const ImageMap&, const std::unordered_map& versionMap); } // namespace mbgl