+_overlay_line_color_update(Overlay_Line *ovl, Color c)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ evas_object_color_set(ovl->obj, c.r, c.g, c.b, c.a);
+}
+
+static void
+_overlay_line_hide(Overlay_Line *ovl)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ if (ovl->obj) evas_object_hide(ovl->obj);
+}
+
+static void
+_overlay_line_show(Overlay_Line *ovl)
+{
+ Evas_Coord fx, fy, tx, ty;
+ Widget_Data *wd = ovl->wd;
+
+ _region_to_coord_convert(wd, ovl->flon, ovl->flat, wd->size.w, &fx, &fy);
+ _region_to_coord_convert(wd, ovl->tlon, ovl->tlat, wd->size.w, &tx, &ty);
+ _coord_to_canvas(wd, fx, fy, &fx, &fy);
+ _coord_to_canvas(wd, tx, ty, &tx, &ty);
+ evas_object_line_xy_set(ovl->obj, fx, fy, tx, ty);
+ evas_object_show(ovl->obj);
+}
+
+static void
+_overlay_line_free(Overlay_Line *ovl)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ evas_object_del(ovl->obj);
+ free(ovl);
+}
+
+static Overlay_Line *
+_overlay_line_new(Widget_Data *wd, double flon, double flat, double tlon, double tlat, Color c)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL);
+
+ Overlay_Line *ovl = ELM_NEW(Overlay_Line);
+ ovl->wd = wd;
+ ovl->flon = flon;
+ ovl->flat = flat;
+ ovl->tlon = tlon;
+ ovl->tlat = tlat;
+ ovl->obj = evas_object_line_add(evas_object_evas_get(wd->obj));
+ evas_object_smart_member_add(ovl->obj, wd->pan_smart);
+ _overlay_line_color_update(ovl, c);
+ return ovl;
+}
+
+static void
+_overlay_polygon_color_update(Overlay_Polygon *ovl, Color c)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ evas_object_color_set(ovl->obj, c.r, c.g, c.b, c.a);
+}
+
+static void
+_overlay_polygon_hide(Overlay_Polygon *ovl)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ if (ovl->obj) evas_object_hide(ovl->obj);
+}
+
+static void
+_overlay_polygon_show(Overlay_Polygon *ovl)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ Eina_List *l;
+ Region *r;
+ Widget_Data *wd = ovl->wd;
+
+ evas_object_polygon_points_clear(ovl->obj);
+ EINA_LIST_FOREACH(ovl->regions, l, r)
+ {
+ Evas_Coord x, y;
+ _region_to_coord_convert(wd, r->lon, r->lat, wd->size.w, &x, &y);
+ _coord_to_canvas(wd, x, y, &x, &y);
+ evas_object_polygon_point_add(ovl->obj, x, y);
+ }
+ evas_object_show(ovl->obj);
+}
+
+static void
+_overlay_polygon_free(Overlay_Polygon *ovl)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ Region *r;
+ evas_object_del(ovl->obj);
+ EINA_LIST_FREE(ovl->regions, r) free(r);
+ free(ovl);
+}
+
+static Overlay_Polygon *
+_overlay_polygon_new(Widget_Data *wd, Color c)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL);
+
+ Overlay_Polygon *ovl = ELM_NEW(Overlay_Polygon);
+ ovl->wd = wd;
+ ovl->obj = evas_object_polygon_add(evas_object_evas_get(wd->obj));
+ evas_object_smart_member_add(ovl->obj, wd->pan_smart);
+ _overlay_polygon_color_update(ovl, c);
+ return ovl;
+}
+
+static void
+_overlay_circle_color_update(Overlay_Circle *ovl, Color c)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ Evas_Object *obj = elm_layout_edje_get(ovl->obj);
+ evas_object_color_set(obj, c.r, c.g, c.b, c.a);
+}
+
+static void
+_overlay_circle_hide(Overlay_Circle *ovl)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ if (ovl->obj) evas_object_hide(ovl->obj);
+}
+
+static void
+_overlay_circle_show(Overlay_Circle *ovl)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ double r;
+ Evas_Coord x, y;
+ Widget_Data *wd = ovl->wd;
+
+ r = (ovl->ratio) * wd->size.w;
+ _region_to_coord_convert(wd, ovl->lon, ovl->lat, wd->size.w, &x, &y);
+ _coord_to_canvas(wd, x, y, &x, &y);
+ _obj_place(ovl->obj, x - r, y - r, r * 2, r * 2);
+}
+
+static void
+_overlay_circle_free(Overlay_Circle *ovl)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ evas_object_del(ovl->obj);
+ free(ovl);
+}
+
+static Overlay_Circle *
+_overlay_circle_new(Widget_Data *wd, double lon, double lat, double radius, Color c)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL);
+
+ Overlay_Circle *ovl = ELM_NEW(Overlay_Circle);
+ ovl->wd = wd;
+ ovl->lon = lon;
+ ovl->lat = lat;
+ ovl->radius = radius;
+ ovl->ratio = radius / wd->size.w;
+
+ ovl->obj = elm_layout_add(wd->obj);
+ evas_object_smart_member_add(ovl->obj, wd->pan_smart);
+ evas_object_stack_above(ovl->obj, wd->sep_maps_markers);
+ elm_layout_theme_set(ovl->obj, "map/circle", "base",
+ elm_widget_style_get(wd->obj));
+ _overlay_circle_color_update(ovl, c);
+ return ovl;
+}
+
+static void
+_overlay_scale_color_update(Overlay_Scale *ovl, Color c)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ evas_object_color_set(ovl->obj, c.r, c.g, c.b, c.a);
+}
+
+static void
+_overlay_scale_hide(Overlay_Scale *ovl)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ if (ovl->obj) evas_object_hide(ovl->obj);
+}
+
+ static void
+_overlay_scale_show(Overlay_Scale *ovl)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ Evas_Coord w;
+ double lon, lat;
+ double text;
+ char buf[32];
+ double meter;
+ Widget_Data *wd = ovl->wd;
+
+ if ((int)sizeof(_scale_tb) <= wd->zoom)
+ {
+ ERR("Zoom level is too high");
+ return;
+ }
+
+ elm_map_region_get(wd->obj, &lon, &lat);
+ meter = wd->src_tile->scale_cb(wd->obj, lon, lat, wd->zoom);
+
+ w = (_scale_tb[wd->zoom] / meter) * (wd->zoom_detail - wd->zoom + 1);
+
+ text = _scale_tb[wd->zoom]/1000;
+ if (text < 1) snprintf(buf, sizeof(buf), "%d m", (int)(text * 1000));
+ else snprintf(buf, sizeof(buf), "%d km", (int)text);
+
+ edje_object_part_text_set(elm_layout_edje_get(ovl->obj), "elm.text", buf);
+ _obj_place(ovl->obj, ovl->x, ovl->y, w, ovl->h);
+}
+
+ static void
+_overlay_scale_free(Overlay_Scale *ovl)
+{
+ EINA_SAFETY_ON_NULL_RETURN(ovl);
+ evas_object_del(ovl->obj);
+ free(ovl);
+}
+
+static Overlay_Scale *
+_overlay_scale_new(Widget_Data *wd, Evas_Coord x, Evas_Coord y, Color c)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(wd, NULL);
+ const char *s;
+
+ Overlay_Scale *ovl = ELM_NEW(Overlay_Scale);
+ ovl->wd = wd;
+ ovl->x = x;
+ ovl->y = y;
+
+ ovl->obj = elm_layout_add(wd->obj);
+ evas_object_smart_member_add(ovl->obj, wd->pan_smart);
+ evas_object_stack_above(ovl->obj, wd->sep_maps_markers);
+ elm_layout_theme_set(ovl->obj, "map/scale", "base",
+ elm_widget_style_get(wd->obj));
+ s = edje_object_data_get(elm_layout_edje_get(ovl->obj), "size_w");
+ if (s) ovl->w = atoi(s);
+ else ovl->w = 100;
+ s = edje_object_data_get(elm_layout_edje_get(ovl->obj), "size_h");
+ if (s) ovl->h = atoi(s);
+ else ovl->h = 60;
+ _overlay_scale_color_update(ovl, c);
+ return ovl;
+}
+
+static void