Merge pull request #4270 from bykoianko/master-passing-to-client-delta-altitude

Passing min and max route altitude.
This commit is contained in:
burivuh 2016-09-15 19:12:13 +04:00 committed by GitHub
commit 3dea79943c
6 changed files with 76 additions and 9 deletions

View file

@ -895,18 +895,37 @@ Java_com_mapswithme_maps_Framework_nativeGetRouteFollowingInfo(JNIEnv * env, jcl
}
JNIEXPORT jintArray JNICALL
Java_com_mapswithme_maps_Framework_nativeGenerateRouteAltitudeChartBits(JNIEnv * env, jclass, jint width, jint height)
Java_com_mapswithme_maps_Framework_nativeGenerateRouteAltitudeChartBits(JNIEnv * env, jclass, jint width, jint height, jobject routeAltitudeLimits)
{
::Framework * fr = frm();
ASSERT(fr, ());
vector<uint8_t> imageRGBAData;
if (!fr->GenerateRouteAltitudeChart(width, height, imageRGBAData))
int32_t minRouteAltitude = 0;
int32_t maxRouteAltitude = 0;
measurement_utils::Units units = measurement_utils::Units::Metric;
if (!fr->GenerateRouteAltitudeChart(width, height, imageRGBAData, minRouteAltitude, maxRouteAltitude, units))
{
LOG(LWARNING, ("Can't generate route altitude image."));
return nullptr;
}
// Passing route limits.
jclass const routeAltitudeLimitsClass = env->GetObjectClass(routeAltitudeLimits);
ASSERT(routeAltitudeLimitsClass, ());
static jfieldID const minRouteAltitudeField = env->GetFieldID(routeAltitudeLimitsClass, "minRouteAltitude", "I");
ASSERT(minRouteAltitudeField, ());
env->SetIntField(routeAltitudeLimits, minRouteAltitudeField, minRouteAltitude);
static jfieldID const maxRouteAltitudeField = env->GetFieldID(routeAltitudeLimitsClass, "maxRouteAltitude", "I");
ASSERT(maxRouteAltitudeField, ());
env->SetIntField(routeAltitudeLimits, maxRouteAltitudeField, maxRouteAltitude);
static jfieldID const isMetricUnitsField = env->GetFieldID(routeAltitudeLimitsClass, "isMetricUnits", "Z");
ASSERT(isMetricUnitsField, ());
env->SetBooleanField(routeAltitudeLimits, isMetricUnitsField, units == measurement_utils::Units::Metric);
size_t const imageRGBADataSize = imageRGBAData.size();
ASSERT_NOT_EQUAL(imageRGBADataSize, 0, ("GenerateRouteAltitudeChart returns true but the vector with altitude image bits is empty."));

View file

@ -61,6 +61,13 @@ public class Framework
public boolean buildings;
}
public static class RouteAltitudeLimits
{
public int minRouteAltitude;
public int maxRouteAltitude;
public boolean isMetricUnits;
}
// this class is just bridge between Java and C++ worlds, we must not create it
private Framework() {}
@ -81,7 +88,8 @@ public class Framework
if (width <= 0 || height <= 0)
return null;
final int[] altitudeChartBits = Framework.nativeGenerateRouteAltitudeChartBits(width, height);
RouteAltitudeLimits routeAltitudeLimits = new RouteAltitudeLimits();
final int[] altitudeChartBits = Framework.nativeGenerateRouteAltitudeChartBits(width, height, routeAltitudeLimits);
if (altitudeChartBits == null)
return null;
@ -165,7 +173,7 @@ public class Framework
public static native RoutingInfo nativeGetRouteFollowingInfo();
@Nullable
public static native final int[] nativeGenerateRouteAltitudeChartBits(int width, int height);
public static native final int[] nativeGenerateRouteAltitudeChartBits(int width, int height, RouteAltitudeLimits routeAltitudeLimits);
// When an end user is going to a turn he gets sound turn instructions.
// If C++ part wants the client to pronounce an instruction nativeGenerateTurnNotifications returns

View file

@ -288,8 +288,14 @@ bool isMarkerPoint(MWMRoutePoint const & point) { return point.IsValid() && !poi
if (!imageData)
{
vector<uint8_t> imageRGBAData;
if (!GetFramework().GenerateRouteAltitudeChart(width, height, imageRGBAData))
int32_t minRouteAltitude = 0;
int32_t maxRouteAltitude = 0;
measurement_utils::Units units = measurement_utils::Units::Metric;
if (!GetFramework().GenerateRouteAltitudeChart(width, height, imageRGBAData,
minRouteAltitude, maxRouteAltitude, units))
{
return;
}
if (imageRGBAData.empty())
return;
imageData = [NSData dataWithBytes:imageRGBAData.data() length:imageRGBAData.size()];

View file

@ -2988,7 +2988,9 @@ bool Framework::OriginalFeatureHasDefaultName(FeatureID const & fid) const
bool Framework::HasRouteAltitude() const { return m_routingSession.HasRouteAltitude(); }
bool Framework::GenerateRouteAltitudeChart(uint32_t width, uint32_t height,
vector<uint8_t> & imageRGBAData) const
vector<uint8_t> & imageRGBAData,
int32_t & minRouteAltitude, int32_t & maxRouteAltitude,
measurement_utils::Units & altitudeUnits) const
{
feature::TAltitudes altitudes;
vector<double> segDistance;
@ -2997,6 +2999,29 @@ bool Framework::GenerateRouteAltitudeChart(uint32_t width, uint32_t height,
return false;
segDistance.insert(segDistance.begin(), 0.0);
return maps::GenerateChart(width, height, segDistance, altitudes,
GetMapStyle(), imageRGBAData);
if (altitudes.empty())
return false;
if (!maps::GenerateChart(width, height, segDistance, altitudes, GetMapStyle(), imageRGBAData))
return false;
auto const minMaxIt = minmax_element(altitudes.cbegin(), altitudes.cend());
feature::TAltitude const minRouteAltitudeM = *minMaxIt.first;
feature::TAltitude const maxRouteAltitudeM = *minMaxIt.second;
if (!settings::Get(settings::kMeasurementUnits, altitudeUnits))
altitudeUnits = measurement_utils::Units::Metric;
switch (altitudeUnits)
{
case measurement_utils::Units::Imperial:
minRouteAltitude = measurement_utils::MetersToFeet(minRouteAltitudeM);
maxRouteAltitude = measurement_utils::MetersToFeet(maxRouteAltitudeM);
break;
case measurement_utils::Units::Metric:
minRouteAltitude = minRouteAltitudeM;
maxRouteAltitude = maxRouteAltitudeM;
break;
}
return true;
}

View file

@ -729,13 +729,21 @@ public:
/// false otherwise.
bool HasRouteAltitude() const;
/// \brief Generates 4 bytes per point image (RGBA) and put the data to |imageRGBAData|.
/// \param width is width of chart shall be generated in pixels.
/// \param height is height of chart shall be generated in pixels.
/// \param imageRGBAData is bits of result image in RGBA.
/// \param minRouteAltitude is min altitude along the route in altitudeUnits.
/// \param maxRouteAltitude is max altitude along the route in altitudeUnits.
/// \param altitudeUnits is units (meters or feet) which is used to pass min and max altitudes.
/// \returns If there is valid route info and the chart was generated returns true
/// and false otherwise. If the method returns true it is guaranteed that the size of
/// |imageRGBAData| is not zero.
/// \note If HasRouteAltitude() method returns true, GenerateRouteAltitudeChart(...)
/// could return false if route was deleted or rebuilt between the calls.
bool GenerateRouteAltitudeChart(uint32_t width, uint32_t height,
vector<uint8_t> & imageRGBAData) const;
vector<uint8_t> & imageRGBAData,
int32_t & minRouteAltitude, int32_t & maxRouteAltitude,
measurement_utils::Units & altitudeUnits) const;
public:
/// @name Editor interface.

View file

@ -25,6 +25,7 @@ using std::max;
using std::max_element;
using std::min;
using std::min_element;
using std::minmax_element;
using std::next_permutation;
using std::none_of;
using std::nth_element;