X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/ee180665962db1dafd0938c4cab8224f126bdc41..80471a6a905e00bf80ad04fa2061f88ea81f15cb:/src/vikviewport.c diff --git a/src/vikviewport.c b/src/vikviewport.c index 24d15df8..7743ebbd 100644 --- a/src/vikviewport.c +++ b/src/vikviewport.c @@ -28,7 +28,6 @@ #include #include -#include #include "coords.h" #include "vikcoord.h" @@ -39,8 +38,6 @@ /* for ALTI_TO_MPP */ #include "globals.h" -#include "googlemaps.h" -#include "khmaps.h" static gdouble EASTING_OFFSET = 500000.0; @@ -58,8 +55,6 @@ static void viewport_init_ra(); static GObjectClass *parent_class; -static void viewport_google_rezoom ( VikViewport *vvp ); - struct _VikViewport { GtkDrawingArea drawing_area; @@ -90,6 +85,11 @@ struct _VikViewport { gdouble google_calcy_fact; gdouble google_calcx_rev_fact; gdouble google_calcy_rev_fact; + + /* trigger stuff */ + gpointer trigger; + GdkPixmap *snapshot_buffer; + gboolean half_drawn; }; static gdouble @@ -175,7 +175,14 @@ static void viewport_init ( VikViewport *vvp ) vvp->scale_bg_gc = NULL; vvp->draw_scale = TRUE; vvp->draw_centermark = TRUE; + + vvp->trigger = NULL; + vvp->snapshot_buffer = NULL; + vvp->half_drawn = FALSE; + g_signal_connect (G_OBJECT(vvp), "configure_event", G_CALLBACK(vik_viewport_configure), NULL); + + GTK_WIDGET_SET_FLAGS(vvp, GTK_CAN_FOCUS); /* allow VVP to have focus -- enabling key events, etc */ } GdkColor *vik_viewport_get_background_gdkcolor ( VikViewport *vvp ) @@ -237,6 +244,11 @@ void vik_viewport_configure_manually ( VikViewport *vvp, gint width, guint heigh if ( vvp->scr_buffer ) g_object_unref ( G_OBJECT ( vvp->scr_buffer ) ); vvp->scr_buffer = gdk_pixmap_new ( GTK_WIDGET(vvp)->window, vvp->width, vvp->height, -1 ); + + /* TODO trigger: only if this is enabled !!! */ + if ( vvp->snapshot_buffer ) + g_object_unref ( G_OBJECT ( vvp->snapshot_buffer ) ); + vvp->snapshot_buffer = gdk_pixmap_new ( GTK_WIDGET(vvp)->window, vvp->width, vvp->height, -1 ); } @@ -257,6 +269,13 @@ gboolean vik_viewport_configure ( VikViewport *vvp ) vvp->scr_buffer = gdk_pixmap_new ( GTK_WIDGET(vvp)->window, vvp->width, vvp->height, -1 ); + /* TODO trigger: only if enabled! */ + if ( vvp->snapshot_buffer ) + g_object_unref ( G_OBJECT ( vvp->snapshot_buffer ) ); + + vvp->snapshot_buffer = gdk_pixmap_new ( GTK_WIDGET(vvp)->window, vvp->width, vvp->height, -1 ); + /* TODO trigger */ + /* this is down here so it can get a GC (necessary?) */ if ( ! vvp->background_gc ) { @@ -279,6 +298,9 @@ static void viewport_finalize ( GObject *gob ) if ( vvp->scr_buffer ) g_object_unref ( G_OBJECT ( vvp->scr_buffer ) ); + if ( vvp->snapshot_buffer ) + g_object_unref ( G_OBJECT ( vvp->snapshot_buffer ) ); + if ( vvp->alpha_pixbuf ) g_object_unref ( G_OBJECT ( vvp->alpha_pixbuf ) ); @@ -462,8 +484,6 @@ void vik_viewport_set_zoom ( VikViewport *vvp, gdouble xympp ) if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_UTM ) viewport_utm_zone_check(vvp); - else if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_GOOGLE ) - viewport_google_rezoom ( vvp ); } /* or could do factor */ @@ -475,9 +495,6 @@ void vik_viewport_zoom_in ( VikViewport *vvp ) vvp->xmpp /= 2; vvp->ympp /= 2; - if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_GOOGLE ) - viewport_google_rezoom ( vvp ); - viewport_utm_zone_check(vvp); } } @@ -490,9 +507,6 @@ void vik_viewport_zoom_out ( VikViewport *vvp ) vvp->xmpp *= 2; vvp->ympp *= 2; - if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_GOOGLE ) - viewport_google_rezoom ( vvp ); - viewport_utm_zone_check(vvp); } } @@ -520,8 +534,6 @@ void vik_viewport_set_xmpp ( VikViewport *vvp, gdouble xmpp ) vvp->xmpp = xmpp; if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_UTM ) viewport_utm_zone_check(vvp); - if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_GOOGLE ) - viewport_google_rezoom ( vvp ); } } @@ -531,8 +543,6 @@ void vik_viewport_set_ympp ( VikViewport *vvp, gdouble ympp ) vvp->ympp = ympp; if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_UTM ) viewport_utm_zone_check(vvp); - if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_GOOGLE ) - viewport_google_rezoom ( vvp ); } } @@ -676,14 +686,7 @@ void vik_viewport_screen_to_coord ( VikViewport *vvp, int x, int y, VikCoord *co coord->mode = VIK_COORD_LATLON; if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_EXPEDIA ) calcxy_rev(&(coord->east_west), &(coord->north_south), x, y, vvp->center.east_west, vvp->center.north_south, vvp->xmpp * ALTI_TO_MPP, vvp->ympp * ALTI_TO_MPP, vvp->width/2, vvp->height/2); - else if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_GOOGLE ) { - /* google */ - coord->east_west = (x - (vvp->width/2)) * vvp->google_calcx_rev_fact + vvp->center.east_west; - coord->north_south = ((vvp->height/2) - y) * vvp->google_calcy_rev_fact + vvp->center.north_south; - } else if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_KH ) { - coord->east_west = vvp->center.east_west + (180.0 * vvp->xmpp / 65536 / 256 * (x - vvp->width/2)); - coord->north_south = vvp->center.north_south + (180.0 * vvp->ympp / 65536 / 256 * (vvp->height/2 - y)); - } else if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_MERCATOR ) { + else if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_MERCATOR ) { /* FIXMERCATOR */ coord->east_west = vvp->center.east_west + (180.0 * vvp->xmpp / 65536 / 256 * (x - vvp->width/2)); coord->north_south = DEMERCLAT ( MERCLAT(vvp->center.north_south) + (180.0 * vvp->ympp / 65536 / 256 * (vvp->height/2 - y)) ); @@ -730,14 +733,6 @@ void vik_viewport_coord_to_screen ( VikViewport *vvp, const VikCoord *coord, int if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_EXPEDIA ) { calcxy ( &xx, &yy, center->lon, center->lat, ll->lon, ll->lat, vvp->xmpp * ALTI_TO_MPP, vvp->ympp * ALTI_TO_MPP, vvp->width / 2, vvp->height / 2 ); *x = xx; *y = yy; - } else if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_GOOGLE ) { - /* google */ - *x = vvp->google_calcx_fact * (ll->lon - center->lon) + (vvp->width/2); - *y = vvp->google_calcy_fact * (center->lat - ll->lat) + (vvp->height/2); - } else if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_KH ) { - /* subtract, convert to KH coords; blow it up by 256 */ - *x = vvp->width/2 + (65536.0 / 180 / vvp->xmpp * (ll->lon - center->lon))*256.0; - *y = vvp->height/2 + (65536.0 / 180 / vvp->ympp * (center->lat - ll->lat))*256.0; } else if ( vvp->drawmode == VIK_VIEWPORT_DRAWMODE_MERCATOR ) { /* FIXMERCATOR: Optimize */ *x = vvp->width/2 + (65536.0 / 180 / vvp->xmpp * (ll->lon - center->lon))*256.0; @@ -991,8 +986,6 @@ void vik_viewport_set_drawmode ( VikViewport *vvp, VikViewportDrawMode drawmode viewport_set_coord_mode ( vvp, VIK_COORD_UTM ); else { viewport_set_coord_mode ( vvp, VIK_COORD_LATLON ); - if ( drawmode == VIK_VIEWPORT_DRAWMODE_GOOGLE ) - viewport_google_rezoom ( vvp ); } } @@ -1001,17 +994,40 @@ VikViewportDrawMode vik_viewport_get_drawmode ( VikViewport *vvp ) return vvp->drawmode; } -static void viewport_google_rezoom ( VikViewport *vvp ) +/******** triggering *******/ +void vik_viewport_set_trigger ( VikViewport *vp, gpointer trigger ) { - vvp->google_calcx_fact = (GOOGLEMAPS_ZOOM_ONE_MPP * 65536.0 * 0.7716245833877 / vvp->xmpp); - vvp->google_calcy_fact = (GOOGLEMAPS_ZOOM_ONE_MPP * 65536.0 / vvp->ympp); - vvp->google_calcx_rev_fact = 1 / vvp->google_calcx_fact; - vvp->google_calcy_rev_fact = 1 / vvp->google_calcy_fact; + vp->trigger = trigger; } +gpointer vik_viewport_get_trigger ( VikViewport *vp ) +{ + return vp->trigger; +} -const gchar *vik_viewport_get_drawmode_name(VikViewport *vv, VikViewportDrawMode mode) +void vik_viewport_snapshot_save ( VikViewport *vp ) { + gdk_draw_drawable ( vp->snapshot_buffer, vp->background_gc, vp->scr_buffer, 0, 0, 0, 0, -1, -1 ); +} + +void vik_viewport_snapshot_load ( VikViewport *vp ) +{ + gdk_draw_drawable ( vp->scr_buffer, vp->background_gc, vp->snapshot_buffer, 0, 0, 0, 0, -1, -1 ); +} + +void vik_viewport_set_half_drawn(VikViewport *vp, gboolean half_drawn) +{ + vp->half_drawn = half_drawn; +} + +gboolean vik_viewport_get_half_drawn( VikViewport *vp ) +{ + return vp->half_drawn; +} + + +const gchar *vik_viewport_get_drawmode_name(VikViewport *vv, VikViewportDrawMode mode) + { const gchar *name = NULL; VikWindow *vw = NULL; GtkWidget *mode_button; @@ -1027,4 +1043,22 @@ const gchar *vik_viewport_get_drawmode_name(VikViewport *vv, VikViewportDrawMode } +void vik_viewport_get_min_max_lat_lon ( VikViewport *vp, gdouble *min_lat, gdouble *max_lat, gdouble *min_lon, gdouble *max_lon ) +{ + VikCoord tleft, tright, bleft, bright; + + vik_viewport_screen_to_coord ( vp, 0, 0, &tleft ); + vik_viewport_screen_to_coord ( vp, vik_viewport_get_width(vp), 0, &tright ); + vik_viewport_screen_to_coord ( vp, 0, vik_viewport_get_height(vp), &bleft ); + vik_viewport_screen_to_coord ( vp, vp->width, vp->height, &bright ); + vik_coord_convert(&tleft, VIK_COORD_LATLON); + vik_coord_convert(&tright, VIK_COORD_LATLON); + vik_coord_convert(&bleft, VIK_COORD_LATLON); + vik_coord_convert(&bright, VIK_COORD_LATLON); + + *max_lat = MAX(tleft.north_south, tright.north_south); + *min_lat = MIN(bleft.north_south, bright.north_south); + *max_lon = MAX(tright.east_west, bright.east_west); + *min_lon = MIN(tleft.east_west, bleft.east_west); +}