4 XCSoar Glide Computer - http://www.xcsoar.org/
5 Copyright (C) 2000-2013 The XCSoar Project
6 A detailed list of copyright holders can be found in the file "AUTHORS".
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 as published by the Free Software Foundation; either version 2
11 of the License, or (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 #include "MapWindowProjection.hpp"
25 #include "Screen/Layout.hpp"
26 #include "Waypoint/Waypoint.hpp"
27 #include "Util/Macros.hpp"
28 #include "Util/Clamp.hpp"
34 static constexpr unsigned ScaleList
[] = {
54 static constexpr unsigned ScaleListCount
= ARRAY_SIZE(ScaleList
);
57 MapWindowProjection::WaypointInScaleFilter(const Waypoint
&way_point
) const
59 return (GetMapScale() <= (way_point
.IsLandable() ? fixed(20000) : fixed(10000)));
63 MapWindowProjection::CalculateMapScale(unsigned scale
) const
65 assert(scale
< ScaleListCount
);
66 return fixed(ScaleList
[scale
]) *
67 GetMapResolutionFactor() / Layout::Scale(GetScreenWidth());
71 MapWindowProjection::LimitMapScale(const fixed value
) const
73 return HaveScaleList() ? CalculateMapScale(FindMapScale(value
)) : value
;
77 MapWindowProjection::StepMapScale(const fixed scale
, int Step
) const
79 int i
= FindMapScale(scale
) + Step
;
80 i
= Clamp(i
, 0, (int)ScaleListCount
- 1);
81 return CalculateMapScale(i
);
85 MapWindowProjection::FindMapScale(const fixed Value
) const
87 unsigned DesiredScale(Value
* Layout::Scale(GetScreenWidth())
88 / GetMapResolutionFactor());
91 for (i
= 0; i
< ScaleListCount
; i
++) {
92 if (DesiredScale
< ScaleList
[i
]) {
96 return i
- (DesiredScale
< (ScaleList
[i
] + ScaleList
[i
- 1]) / 2);
100 return ScaleListCount
- 1;
104 MapWindowProjection::SetFreeMapScale(const fixed x
)
106 SetScale(fixed(GetMapResolutionFactor()) / x
);
110 MapWindowProjection::SetMapScale(const fixed x
)
112 SetScale(fixed(GetMapResolutionFactor()) / LimitMapScale(x
));