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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#include "overlay_handle.hpp"
#include "../base/macros.hpp"
namespace dp
{
struct OverlayHandle::OffsetNodeFinder
{
public:
OffsetNodeFinder(uint8_t bufferID) : m_bufferID(bufferID) {}
bool operator()(OverlayHandle::TOffsetNode const & node) const
{
return node.first.GetID() == m_bufferID;
}
private:
uint8_t m_bufferID;
};
OverlayHandle::OverlayHandle(FeatureID const & id,
dp::Anchor anchor,
double priority)
: m_id(id)
, m_anchor(anchor)
, m_priority(priority)
, m_isVisible(false)
, m_isValid(true)
{
}
bool OverlayHandle::IsVisible() const
{
#ifdef DEBUG
if (m_isVisible)
ASSERT(m_isValid, ());
#endif
return m_isVisible;
}
void OverlayHandle::SetIsVisible(bool isVisible)
{
m_isVisible = isVisible;
}
uint16_t * OverlayHandle::IndexStorage(uint16_t size)
{
m_indexes.resize(size);
return &m_indexes[0];
}
size_t OverlayHandle::GetIndexCount() const
{
return m_indexes.size();
}
void OverlayHandle::GetElementIndexes(RefPointer<IndexBufferMutator> mutator) const
{
ASSERT_EQUAL(m_isVisible, true, ());
mutator->AppendIndexes(&m_indexes[0], m_indexes.size());
}
void OverlayHandle::GetAttributeMutation(RefPointer<AttributeBufferMutator> mutator) const
{
UNUSED_VALUE(mutator);
}
bool OverlayHandle::HasDynamicAttributes() const
{
return !m_offsets.empty();
}
void OverlayHandle::AddDynamicAttribute(BindingInfo const & binding, uint16_t offset, uint16_t count)
{
ASSERT(binding.IsDynamic(), ());
ASSERT(find_if(m_offsets.begin(), m_offsets.end(), OffsetNodeFinder(binding.GetID())) == m_offsets.end(), ());
m_offsets.insert(make_pair(binding, MutateRegion(offset, count)));
}
FeatureID const & OverlayHandle::GetFeatureID() const
{
return m_id;
}
double const & OverlayHandle::GetPriority() const
{
return m_priority;
}
OverlayHandle::TOffsetNode const & OverlayHandle::GetOffsetNode(uint8_t bufferID) const
{
set<TOffsetNode>::const_iterator it = find_if(m_offsets.begin(), m_offsets.end(), OffsetNodeFinder(bufferID));
ASSERT(it != m_offsets.end(), ());
return *it;
}
////////////////////////////////////////////////////////////////////////////////
SquareHandle::SquareHandle(FeatureID const & id, dp::Anchor anchor,
m2::PointD const & gbPivot, m2::PointD const & pxSize,
double priority)
: base_t(id, anchor, priority)
, m_gbPivot(gbPivot)
, m_pxHalfSize(pxSize.x / 2.0, pxSize.y / 2.0)
{
}
m2::RectD SquareHandle::GetPixelRect(ScreenBase const & screen) const
{
m2::PointD const pxPivot = screen.GtoP(m_gbPivot);
m2::RectD result(pxPivot - m_pxHalfSize, pxPivot + m_pxHalfSize);
m2::PointD offset(0.0, 0.0);
if (m_anchor & dp::Left)
offset.x = m_pxHalfSize.x;
else if (m_anchor & dp::Right)
offset.x = -m_pxHalfSize.x;
if (m_anchor & dp::Top)
offset.y = m_pxHalfSize.y;
else if (m_anchor & dp::Bottom)
offset.y = -m_pxHalfSize.y;
result.Offset(offset);
return result;
}
} // namespace dp
|