}
static void
-_coord_rotate(Evas_Coord x, Evas_Coord y, Evas_Coord cx, Evas_Coord cy, double degree, Evas_Coord *xx, Evas_Coord *yy)
+_rotate(Evas_Coord x, Evas_Coord y, Evas_Coord cx, Evas_Coord cy, double degree, Evas_Coord *xx, Evas_Coord *yy)
{
- EINA_SAFETY_ON_NULL_RETURN(xx);
- EINA_SAFETY_ON_NULL_RETURN(yy);
-
double r = (degree * M_PI) / 180.0;
-
if (xx) *xx = ((x - cx) * cos(r)) + ((y - cy) * cos(r + M_PI_2)) + cx;
if (yy) *yy = ((x - cx) * sin(r)) + ((y - cy) * sin(r + M_PI_2)) + cy;
}
{
if (wd->src_tile->geo_to_coord(wd->obj, zoom, lon, lat, size, x, y)) return;
}
-
if (x) *x = floor((lon + 180.0) / 360.0 * size);
if (y)
*y = floor((1.0 - log(tan(lat * ELM_PI / 180.0) + (1.0 / cos(lat * ELM_PI / 180.0)))
}
static void
-_viewport_size_get(Widget_Data *wd, Evas_Coord *vw, Evas_Coord *vh)
+_viewport_coord_get(Widget_Data *wd, Evas_Coord *vx, Evas_Coord *vy, Evas_Coord *vw, Evas_Coord *vh)
{
EINA_SAFETY_ON_NULL_RETURN(wd);
Evas_Coord x, y, w, h;
- evas_object_geometry_get(wd->pan_smart, &x, &y, &w, &h);
- if (vw) *vw = (x * 2) + w;
- if (vh) *vh = (y * 2) + h;
+ elm_smart_scroller_child_pos_get(wd->scr, &x, &y);
+ elm_smart_scroller_child_viewport_size_get(wd->scr, &w, &h);
+ if (w > wd->size.w) x -= ((w - wd->size.w) / 2);
+ if (h > wd->size.h) y -= ((h - wd->size.h) / 2);
+ if (vx) *vx = x;
+ if (vy) *vy = y;
+ if (vw) *vw = w;
+ if (vh) *vh = h;
}
+// Map coordinates to canvas geometry without rotate
static void
-_pan_geometry_get(Widget_Data *wd, Evas_Coord *px, Evas_Coord *py)
+_coord_to_canvas_no_rotate(Widget_Data *wd, Evas_Coord x, Evas_Coord y, Evas_Coord *xx, Evas_Coord *yy)
{
- EINA_SAFETY_ON_NULL_RETURN(wd);
+ Evas_Coord vx, vy, sx, sy;
+ _viewport_coord_get(wd, &vx, &vy, NULL, NULL);
+ evas_object_geometry_get(wd->pan_smart, &sx, &sy, NULL, NULL);
+ if (xx) *xx = x - vx + sx;
+ if (yy) *yy = y - vy + sy;
+}
- Evas_Coord x, y, vx, vy, vw, vh;
- elm_smart_scroller_child_pos_get(wd->scr, &x, &y);
- evas_object_geometry_get(wd->pan_smart, &vx, &vy, &vw, &vh);
- x = -x;
- y = -y;
- if (vw > wd->size.w) x += (((vw - wd->size.w) / 2) + vx);
- else x -= vx;
- if (vh > wd->size.h) y += (((vh - wd->size.h) / 2) + vy);
- else y -= vy;
- if (px) *px = x;
- if (py) *py = y;
- }
+// Map coordinates to canvas geometry
+static void
+_coord_to_canvas(Widget_Data *wd, Evas_Coord x, Evas_Coord y, Evas_Coord *xx, Evas_Coord *yy)
+{
+ _coord_to_canvas_no_rotate(wd, x, y, &x, &y);
+ _rotate(x, y, wd->rotate.cx, wd->rotate.cy, wd->rotate.d, &x, &y);
+ if (xx) *xx = x;
+ if (yy) *yy = y;
+}
+
+// Canvas geometry to map coordinates
+static void
+_canvas_to_coord(Widget_Data *wd, Evas_Coord x, Evas_Coord y, Evas_Coord *xx, Evas_Coord *yy)
+{
+ Evas_Coord vx, vy, sx, sy;
+ _viewport_coord_get(wd, &vx, &vy, NULL, NULL);
+ evas_object_geometry_get(wd->pan_smart, &sx, &sy, NULL, NULL);
+ _rotate(x - sx + vx, y - sy + vy, wd->rotate.cx - sx + vx,
+ wd->rotate.cy - sy + vy, -wd->rotate.d, &x, &y);
+ if (xx) *xx = x;
+ if (yy) *yy = y;
+}
static void
_region_show(void *data)
int x, y, w, h;
_region_to_coord_convert(dd->wd, dd->lon, dd->lat, dd->wd->size.w, &x, &y);
- _viewport_size_get(dd->wd, &w, &h);
+ _viewport_coord_get(dd->wd, NULL, NULL, &w, &h);
x = x - (w / 2);
y = y - (h / 2);
elm_smart_scroller_child_region_show(dd->wd->scr, x, y, w, h);
Elm_Map_Group_Class *group_clas;
Evas_Coord gw, gh;
- Evas_Coord px, py;
if (wd->paused_markers || (!eina_list_count(wd->markers))) return;
- _pan_geometry_get(wd, &px, &py);
-
_edj_marker_size_get(wd, &gw, &gh);
gw *= 2;
gh *= 2;
else
{
Evas_Coord x, y;
- _coord_rotate(marker->x + px, marker->y + py, wd->rotate.cx,
- wd->rotate.cy, wd->rotate.d, &x, &y);
+ _coord_to_canvas(wd, marker->x, marker->y, &x, &y);
_obj_place(marker->obj, x - (marker->w / 2), y - (marker->h / 2),
marker->w, marker->h);
}
else
{
Evas_Coord x, y;
- _coord_rotate(group->x + px, group->y + py, wd->rotate.cx,
- wd->rotate.cy, wd->rotate.d, &x, &y);
+ _coord_to_canvas(wd, group->x, group->y, &x, &y);
_obj_place(group->obj, x - (group->w / 2), y - (group->h / 2),
group->w, group->h);
}
}
static Eina_Bool
-_grid_item_intersect(Grid_Item *gi)
+_grid_item_in_viewport(Grid_Item *gi)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(gi, EINA_FALSE);
- Evas_Coord px, py;
- Evas_Coord vw, vh;
+ Evas_Coord vx, vy, vw, vh;
Evas_Coord x, y, w, h;
- _pan_geometry_get(gi->wd, &px, &py);
- _viewport_size_get(gi->wd, &vw, &vh);
+ _viewport_coord_get(gi->wd, &vx, &vy, &vw, &vh);
_grid_item_coord_get(gi, &x, &y, &w, &h);
- return ELM_RECTS_INTERSECT(x + px, y + py, w, h, 0, 0, vw, vh);
+ return ELM_RECTS_INTERSECT(x, y, w, h, vx, vy, vw, vh);
}
static void
}
else
{
- Evas_Coord px, py;
Evas_Coord x, y, w, h;
-
- _pan_geometry_get(gi->wd, &px, &py);
_grid_item_coord_get(gi, &x, &y, &w, &h);
-
- _obj_place(gi->img, x + px, y + py, w, h);
+ _coord_to_canvas_no_rotate(gi->wd, x, y, &x, &y);
+ _obj_place(gi->img, x, y, w, h);
_obj_rotate(gi->wd, gi->img);
gi->file_have = EINA_TRUE;
}
EINA_LIST_REVERSE_FOREACH_SAFE(wd->download_list, l, ll, gi)
{
- if (gi->g->zoom != wd->zoom || !_grid_item_intersect(gi))
+ if (gi->g->zoom != wd->zoom || !_grid_item_in_viewport(gi))
{
wd->download_list = eina_list_remove(wd->download_list, gi);
continue;
if (wd->download_num == 1)
edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr),
"elm,state,busy,start", "elm");
-
}
}
return ECORE_CALLBACK_RENEW;
{
EINA_SAFETY_ON_NULL_RETURN(g);
int xx, yy, ww, hh;
- Evas_Coord px, py, vw, vh;
+ Evas_Coord vx, vy, vw, vh;
- _pan_geometry_get(g->wd, &px, &py);
- _viewport_size_get(g->wd, &vw, &vh);
- if (px > 0) px = 0;
- if (py > 0) py = 0;
+ _viewport_coord_get(g->wd, &vx, &vy, &vw, &vh);
+ if (vx < 0) vx = 0;
+ if (vy < 0) vy = 0;
- xx = (-px / g->wd->size.tile) - 1;
+ xx = (vx / g->wd->size.tile) - 1;
if (xx < 0) xx = 0;
- yy = (-py / g->wd->size.tile) - 1;
+ yy = (vy / g->wd->size.tile) - 1;
if (yy < 0) yy = 0;
ww = (vw / g->wd->size.tile) + 3;
EINA_ITERATOR_FOREACH(it, cell)
{
gi = eina_matrixsparse_cell_data_get(cell);
- if (!_grid_item_intersect(gi)) _grid_item_unload(gi);
+ if (!_grid_item_in_viewport(gi)) _grid_item_unload(gi);
}
eina_iterator_free(it);
Evas_Coord px, py, ow, oh;
px = wd->pan_x;
py = wd->pan_y;
- _viewport_size_get(wd, &ow, &oh);
+ _viewport_coord_get(wd, NULL, NULL, &ow, &oh);
Evas_Coord size = wd->size.w;
EINA_ITERATOR_FOREACH(it, cell)
{
Grid_Item *gi = eina_matrixsparse_cell_data_get(cell);
- if (_grid_item_intersect(gi))
+ if (_grid_item_in_viewport(gi))
evas_object_image_smooth_scale_set(gi->img, EINA_TRUE);
}
eina_iterator_free(it);
if (zoom > wd->zoom_max) zoom = wd->zoom_max;
else if (zoom < wd->zoom_min) zoom = wd->zoom_min;
- Evas_Coord px, py, vw, vh;
+ Evas_Coord vx, vy, vw, vh;
Evas_Coord ow, oh;
wd->zoom = ROUND(zoom);
wd->size.w = pow(2.0, wd->zoom) * wd->size.tile;
wd->size.h = wd->size.w;;
- // Fix to zooming with (viewport center px, py) as the center to prevent
+ // Fix to zooming with (viewport center vx, vy) as the center to prevent
// from zooming with (0,0) as the cetner. (scroller default behavior)
- _pan_geometry_get(wd, &px, &py);
- _viewport_size_get(wd, &vw, &vh);
+ _viewport_coord_get(wd, &vx, &vy, &vw, &vh);
+
if ((vw > 0) && (vh > 0) && (ow > 0) && (oh > 0))
{
Evas_Coord xx, yy;
double sx, sy;
if (vw > ow) sx = 0.5;
- else sx = (double)(-px + (vw / 2)) / ow;
+ else sx = (double)(vx + (vw / 2)) / ow;
if (vh > oh) sy = 0.5;
- else sy = (double)(-py + (vh / 2)) / oh;
+ else sy = (double)(vy + (vh / 2)) / oh;
if (sx > 1.0) sx = 1.0;
if (sy > 1.0) sy = 1.0;
_overlay_default_show(Widget_Data *wd, Overlay_Default *ovl)
{
Evas_Object *disp;
- Evas_Coord px, py;
Evas_Coord x, y, w, h;
if (ovl->obj)
h = ovl->h;
}
- _pan_geometry_get(wd, &px, &py);
- _coord_rotate(ovl->x + px, ovl->y + py, wd->rotate.cx, wd->rotate.cy,
- wd->rotate.d, &x, &y);
+ _coord_to_canvas(wd, ovl->x, ovl->y, &x, &y);
_obj_place(disp, x - (w / 2), y - (h / 2), w, h);
}
{
EINA_SAFETY_ON_NULL_RETURN(bubble);
Evas_Coord x, y;
-
if ((bubble->x < 0) || (bubble->y < 0)) return;
- Evas_Coord px, py;
- _pan_geometry_get(bubble->wd, &px, &py);
- _coord_rotate(bubble->x + px, bubble->y + py, bubble->wd->rotate.cx,
- bubble->wd->rotate.cy, bubble->wd->rotate.d, &x, &y);
- x = x - (bubble->w / 2);
- y = y - (bubble->h / 2);
- _obj_place(bubble->obj, x, y, bubble->w, bubble->h);
- //evas_object_raise(bubble->obj);
+
+ _coord_to_canvas(bubble->wd, bubble->x, bubble->y, &x, &y);
+ _obj_place(bubble->obj, x - (bubble->w /2), y - (bubble->h /2),
+ bubble->w, bubble->h);
}
static void
Evas_Coord ow, oh, px, py, size;
wd = r->wd;
- _viewport_size_get(wd, &ow, &oh);
+ _viewport_coord_get(wd, NULL, NULL, &ow, &oh);
px = wd->pan_x;
py = wd->pan_y;
size = wd->size.w;
dd->lat = (max_lat + min_lat) / 2;
zoom = dd->wd->src_tile->zoom_min;
- _viewport_size_get(dd->wd, &vw, &vh);
+ _viewport_coord_get(dd->wd, NULL, NULL, &vw, &vh);
while (zoom <= dd->wd->src_tile->zoom_max)
{
Evas_Coord size, max_x, max_y, min_x, min_y;
EINA_SAFETY_ON_NULL_RETURN(sd);
Evas_Coord w, h;
- evas_object_geometry_get(sd->wd->pan_smart, NULL, NULL, &w, &h);
+ evas_object_geometry_get(obj, NULL, NULL, &w, &h);
if (w <= 0 || h <= 0) return;
_grid_place(sd->wd);
w = dd->wd->size.w;
h = dd->wd->size.h;
zoom = dd->wd->zoom_detail;
- _viewport_size_get(dd->wd, &vw, &vh);
+ _viewport_coord_get(dd->wd, NULL, NULL, &vw, &vh);
if (dd->mode == ELM_MAP_ZOOM_MODE_AUTO_FIT)
{
int x, y, w, h;
_region_to_coord_convert(dd->wd, dd->lon, dd->lat, dd->wd->size.w, &x, &y);
- _viewport_size_get(dd->wd, &w, &h);
+ _viewport_coord_get(dd->wd, NULL, NULL, &w, &h);
x = x - (w / 2);
y = y - (h / 2);
elm_smart_scroller_region_bring_in(dd->wd->scr, x, y, w, h);
dd->lat = (max_lat + min_lat) / 2;
zoom = dd->wd->src_tile->zoom_min;
- _viewport_size_get(dd->wd, &vw, &vh);
+ _viewport_coord_get(dd->wd, NULL, NULL, &vw, &vh);
while (zoom <= dd->wd->src_tile->zoom_max)
{
Evas_Coord size, max_x, max_y, min_x, min_y;
elm_smart_scroller_child_pos_get(wd->scr, &x, &y);
elm_smart_scroller_step_size_get(wd->scr, &step_x, &step_y);
elm_smart_scroller_page_size_get(wd->scr, &page_x, &page_y);
- _viewport_size_get(wd, NULL, &vh);
+ elm_smart_scroller_child_viewport_size_get(wd->scr, NULL, &vh);
if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left")))
{
EINA_SAFETY_ON_NULL_RETURN(wd);
double tlon, tlat;
- Evas_Coord px, py, vw, vh;
+ Evas_Coord vx, vy, vw, vh;
- _pan_geometry_get(wd, &px, &py);
- _viewport_size_get(wd, &vw, &vh);
- _coord_to_region_convert(wd, vw/2 - px, vh/2 -py, wd->size.w, &tlon, &tlat);
+ _viewport_coord_get(wd, &vx, &vy, &vw, &vh);
+ _coord_to_region_convert(wd, vx + vw/2, vy + vh/2, wd->size.w, &tlon, &tlat);
if (lon) *lon = tlon;
if (lat) *lat = tlat;
#else
EINA_SAFETY_ON_NULL_RETURN(lon);
EINA_SAFETY_ON_NULL_RETURN(lat);
- Evas_Coord px, py, vw, vh;
- _pan_geometry_get(wd, &px, &py);
- _viewport_size_get(wd, &vw, &vh);
- _coord_rotate(x - px, y - py, (vw / 2) - px, (vh / 2) - py, -wd->rotate.d,
- &x, &y);
+ _canvas_to_coord(wd, x, y, &x, &y);
_coord_to_region_convert(wd, x, y, wd->size.w, lon, lat);
#else
(void) obj;
EINA_SAFETY_ON_NULL_RETURN(x);
EINA_SAFETY_ON_NULL_RETURN(y);
- Evas_Coord px, py, vw, vh;
- _pan_geometry_get(wd, &px, &py);
- _viewport_size_get(wd, &vw, &vh);
_region_to_coord_convert(wd, lon, lat, wd->size.w, x, y);
- _coord_rotate(*x, *y, (vw / 2) - px, (vh / 2) - py, wd->rotate.d,
- x, y);
- *x += px;
- *y += py;
+ _coord_to_canvas(wd, *x, *y, x, y);
#else
(void) obj;
(void) lon;
if (type == ELM_MAP_SOURCE_TYPE_TILE) return wd->src_tile_names;
else if (type == ELM_MAP_SOURCE_TYPE_ROUTE) return wd->src_route_names;
- else if (type == ELM_MAP_SOURCE_TYPE_NAME) return wd->src_tile_names;
+ else if (type == ELM_MAP_SOURCE_TYPE_NAME) return wd->src_name_names;
else ERR("Not supported map source type: %d", type);
return NULL;
#else
{
#ifdef HAVE_ELEMENTARY_ECORE_CON
ELM_CHECK_WIDTYPE(obj, widtype);
- _coord_rotate(x, y, cx, cy, degree, xx, yy);
+ _rotate(x, y, cx, cy, degree, xx, yy);
#else
(void) x;
(void) y;