From f05ecca499b14b4c657765ded7b7b5dd3fd08dc2 Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Sat, 2 Mar 2013 21:26:19 +0000 Subject: [PATCH] Make mpp_to_zoom() a generic function It doesn't rely on any Webtool center data. --- src/util.c | 25 +++++++++++++++++++++++++ src/util.h | 3 ++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/util.c b/src/util.c index 5d329d78..6fbf9f10 100644 --- a/src/util.c +++ b/src/util.c @@ -157,3 +157,28 @@ gboolean split_string_from_file_on_equals ( const gchar *buf, gchar **key, gchar return TRUE; } + +/* 1 << (x) is like a 2**(x) */ +#define GZ(x) (1<<(x)) + +static const gdouble scale_mpps[] = { GZ(0), GZ(1), GZ(2), GZ(3), GZ(4), GZ(5), GZ(6), GZ(7), GZ(8), GZ(9), + GZ(10), GZ(11), GZ(12), GZ(13), GZ(14), GZ(15), GZ(16), GZ(17) }; + +static const gint num_scales = (sizeof(scale_mpps) / sizeof(scale_mpps[0])); + +#define ERROR_MARGIN 0.01 +guint8 mpp_to_zoom ( gdouble mpp ) +{ + gint i; + for ( i = 0; i < num_scales; i++ ) { + if ( ABS(scale_mpps[i] - mpp) < ERROR_MARGIN ) { + g_debug ( "mpp_to_zoom: %f -> %d", mpp, i ); + return i; + } + } + // Handle mpp smaller than 1 + // return a useful value such that '17 - this number' gives a natural number. + // Ideally should return '-1' or '0.5' but that's tricky with an unsigned int type! + // (i.e. should rework to support zoom levels of 18 or 19) + return 0; +} diff --git a/src/util.h b/src/util.h index 8c10de45..7b719dd4 100644 --- a/src/util.h +++ b/src/util.h @@ -38,7 +38,8 @@ GList * str_array_to_glist(gchar* data[]); gboolean split_string_from_file_on_equals ( const gchar *buf, gchar **key, gchar **val ); +guint8 mpp_to_zoom ( gdouble mpp ); + G_END_DECLS #endif - -- 2.39.5