Welcome to mirror list, hosted at ThFree Co, Russian Federation.

texture_of_colors.hpp « drape - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: e1269bebbc6acd7a4da9c81a18fc7454d0c6182f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#pragma once

#include "drape/texture.hpp"
#include "drape/color.hpp"
#include "drape/dynamic_texture.hpp"

#include "base/buffer_vector.hpp"

#include <map>
#include <mutex>

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<Texture::ResourceInfo> ReserveResource(bool predefined, ColorKey const & key, bool & newResource);
  ref_ptr<Texture::ResourceInfo> MapResource(ColorKey const & key, bool & newResource);
  void UploadResources(ref_ptr<dp::GraphicsContext> context, ref_ptr<Texture> texture);

  void SetIsDebug(bool isDebug) { m_isDebug = isDebug; }

private:
  using TPalette = std::map<Color, ColorResourceInfo>;

  struct PendingColor
  {
    m2::RectU m_rect;
    Color m_color;
  };

  TPalette m_palette;
  TPalette m_predefinedPalette;
  buffer_vector<PendingColor, 16> 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<ColorPalette, ColorKey, Texture::ResourceType::Color>
{
  using TBase = DynamicTexture<ColorPalette, ColorKey, Texture::ResourceType::Color>;
public:
  ColorTexture(m2::PointU const & size, ref_ptr<HWTextureAllocator> 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