#pragma once #include "drape/texture.hpp" #include "drape/color.hpp" #include "drape/dynamic_texture.hpp" #include "base/buffer_vector.hpp" #include #include namespace dp { class ColorKey : public Texture::Key { public: explicit ColorKey(Color color) : Texture::Key(), m_color(color) {} virtual Texture::ResourceType GetType() const { return Texture::ResourceType::Color; } Color m_color; }; class ColorResourceInfo : public Texture::ResourceInfo { public: explicit ColorResourceInfo(m2::RectF const & texRect) : Texture::ResourceInfo(texRect) { } virtual Texture::ResourceType GetType() const { return Texture::ResourceType::Color; } }; class ColorPalette { public: explicit ColorPalette(m2::PointU const & canvasSize); ref_ptr ReserveResource(bool predefined, ColorKey const & key, bool & newResource); ref_ptr MapResource(ColorKey const & key, bool & newResource); void UploadResources(ref_ptr context, ref_ptr texture); void SetIsDebug(bool isDebug) { m_isDebug = isDebug; } private: using TPalette = std::map; struct PendingColor { m2::RectU m_rect; Color m_color; }; TPalette m_palette; TPalette m_predefinedPalette; buffer_vector m_nodes; buffer_vector m_pendingNodes; m2::PointU m_textureSize; m2::PointU m_cursor; bool m_isDebug = false; std::mutex m_lock; std::mutex m_mappingLock; }; class ColorTexture : public DynamicTexture { using TBase = DynamicTexture; public: ColorTexture(m2::PointU const & size, ref_ptr allocator) : m_palette(size) { TBase::DynamicTextureParams params{size, TextureFormat::RGBA8, TextureFilter::Nearest, false /* m_usePixelBuffer */}; TBase::Init(allocator, make_ref(&m_palette), params); } void ReserveColor(dp::Color const & color); ~ColorTexture() override { TBase::Reset(); } static int GetColorSizeInPixels(); private: ColorPalette m_palette; }; } // namespace dp