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

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvng <viktor.govako@gmail.com>2011-12-15 17:40:23 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:30:17 +0300
commit20937bc58ed3fbdfce82c756fae2fd6b57afed33 (patch)
tree7577a8366c48aadbf23925fce376974d8705caa2 /indexer/feature_utils.cpp
parent8318252eaf32a20bb6154050635c6ca58deac5c2 (diff)
Fix viewport for founded features.
Diffstat (limited to 'indexer/feature_utils.cpp')
-rw-r--r--indexer/feature_utils.cpp49
1 files changed, 36 insertions, 13 deletions
diff --git a/indexer/feature_utils.cpp b/indexer/feature_utils.cpp
index 7f577ec16f..9753cfd950 100644
--- a/indexer/feature_utils.cpp
+++ b/indexer/feature_utils.cpp
@@ -1,11 +1,16 @@
#include "feature_utils.hpp"
+#include "feature_visibility.hpp"
#include "classificator.hpp"
#include "feature.hpp"
+#include "scales.hpp"
#include "../geometry/point2d.hpp"
+
#include "../base/base.hpp"
+
#include "../std/vector.hpp"
+
namespace feature
{
@@ -46,25 +51,43 @@ public:
m_TypeSmallVillage[2] = GetType("place", "farm");
}
- m2::RectD GetViewport(FeatureType const & feature) const
+ void CorrectRectForScales(FeatureType const & f, m2::PointD const & center,
+ bool forceCorrect, m2::RectD & rect) const
{
- m2::RectD limitRect = feature.GetLimitRect(-2);
- if (feature.GetFeatureType() != feature::GEOM_POINT)
- return limitRect;
+ pair<int, int> const scaleR = feature::DrawableScaleRangeForText(f);
+ int const scale = scales::GetScaleLevel(rect);
+ if (forceCorrect || (scale < scaleR.first || scale > scaleR.second))
+ {
+ rect = scales::GetRectForLevel(scaleR.first, center, 1.0);
+ }
+ }
+
+ m2::RectD GetViewport(FeatureType const & f) const
+ {
+ m2::RectD limitR = f.GetLimitRect(-2);
+ if (f.GetFeatureType() != feature::GEOM_POINT)
+ {
+ CorrectRectForScales(f, limitR.Center(), false, limitR);
+ return limitR;
+ }
- m2::PointD maxSizeMeters(100, 100);
FeatureBase::GetTypesFn types;
- feature.ForEachTypeRef(types);
+ f.ForEachTypeRef(types);
+
+ m2::PointD maxSzM(0, 0);
for (size_t i = 0; i < types.m_size; ++i)
{
- m2::PointD const sizeMeters = GetSizeForType(types.m_types[i], feature);
- maxSizeMeters.x = max(maxSizeMeters.x, sizeMeters.x);
- maxSizeMeters.y = max(maxSizeMeters.y, sizeMeters.y);
+ m2::PointD const szM = GetSizeForType(types.m_types[i], f);
+ maxSzM.x = max(maxSzM.x, szM.x);
+ maxSzM.y = max(maxSzM.y, szM.y);
}
- m2::PointD const centerXY = limitRect.Center();
- return MercatorBounds::RectByCenterXYAndSizeInMeters(centerXY.x, centerXY.y,
- maxSizeMeters.x, maxSizeMeters.y);
+ m2::PointD const centerXY = limitR.Center();
+ m2::RectD res = MercatorBounds::RectByCenterXYAndSizeInMeters(
+ centerXY.x, centerXY.y, maxSzM.x, maxSzM.y);
+
+ CorrectRectForScales(f, centerXY, maxSzM == m2::PointD(0, 0), res);
+ return res;
}
uint8_t GetSearchRank(FeatureType const & feature) const
@@ -125,7 +148,7 @@ private:
if (IsEqual(type, m_TypeVillage))
return m2::PointD(1.5*km, 1.5*km);
- return m2::PointD(100, 100);
+ return m2::PointD(0, 0);
}
static uint32_t GetType(string const & s1,