/** * vik_viewport_compute_bearing: * @vp: self object * @x1: screen coord * @y1: screen coord * @x2: screen coord * @y2: screen coord * @angle: bearing in Radian (output) * @baseangle: UTM base angle in Radian (output) * * Compute bearing. */ void vik_viewport_compute_bearing ( VikViewport *vp, gint x1, gint y1, gint x2, gint y2, gdouble *angle, gdouble *baseangle ) { gdouble len = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); gdouble dx = (x2-x1)/len*10; gdouble dy = (y2-y1)/len*10; *angle = atan2(dy, dx) + M_PI_2; if ( vik_viewport_get_drawmode ( vp ) == VIK_VIEWPORT_DRAWMODE_UTM) { VikCoord test; struct LatLon ll; struct UTM u; gint tx, ty; vik_viewport_screen_to_coord ( vp, x1, y1, &test ); vik_coord_to_latlon ( &test, &ll ); ll.lat += vik_viewport_get_ympp ( vp ) * vik_viewport_get_height ( vp ) / 11000.0; // about 11km per degree latitude a_coords_latlon_to_utm ( &ll, &u ); vik_coord_load_from_utm ( &test, VIK_VIEWPORT_DRAWMODE_UTM, &u ); vik_viewport_coord_to_screen ( vp, &test, &tx, &ty ); *baseangle = M_PI - atan2(tx-x1, ty-y1); *angle -= *baseangle; } if (*angle < 0) *angle += 2*M_PI; if (*angle > 2*M_PI) *angle -= 2*M_PI; }
static void georef_layer_draw ( VikGeorefLayer *vgl, VikViewport *vp ) { if ( vik_viewport_get_drawmode(vp) != VIK_VIEWPORT_DRAWMODE_UTM ) return; if ( vgl->pixbuf ) { struct UTM utm_middle; gdouble xmpp = vik_viewport_get_xmpp(vp), ympp = vik_viewport_get_ympp(vp); GdkPixbuf *pixbuf = vgl->pixbuf; guint layer_width = vgl->width; guint layer_height = vgl->height; vik_coord_to_utm ( vik_viewport_get_center ( vp ), &utm_middle ); /* scale the pixbuf if it doesn't match our dimensions */ if ( xmpp != vgl->mpp_easting || ympp != vgl->mpp_northing ) { layer_width = round(vgl->width * vgl->mpp_easting / xmpp); layer_height = round(vgl->height * vgl->mpp_northing / ympp); /* rescale if necessary */ if (layer_width == vgl->scaled_width && layer_height == vgl->scaled_height && vgl->scaled != NULL) pixbuf = vgl->scaled; else { pixbuf = gdk_pixbuf_scale_simple( vgl->pixbuf, layer_width, layer_height, GDK_INTERP_BILINEAR ); if (vgl->scaled != NULL) g_object_unref(vgl->scaled); vgl->scaled = pixbuf; vgl->scaled_width = layer_width; vgl->scaled_height = layer_height; } } guint width = vik_viewport_get_width(vp), height = vik_viewport_get_height(vp); gint32 x, y; vgl->corner.zone = utm_middle.zone; vgl->corner.letter = utm_middle.letter; VikCoord corner_coord; vik_coord_load_from_utm ( &corner_coord, vik_viewport_get_coord_mode(vp), &(vgl->corner) ); vik_viewport_coord_to_screen ( vp, &corner_coord, &x, &y ); if ( (x < 0 || x < width) && (y < 0 || y < height) && x+layer_width > 0 && y+layer_height > 0 ) vik_viewport_draw_pixbuf ( vp, pixbuf, 0, 0, x, y, layer_width, layer_height ); /* todo: draw only what we need to. */ } }
static void georef_layer_load_image ( VikGeorefLayer *vgl, VikViewport *vp, gboolean from_file ) { GError *gx = NULL; if ( vgl->image == NULL ) return; if ( vgl->pixbuf ) g_object_unref ( G_OBJECT(vgl->pixbuf) ); if ( vgl->scaled ) { g_object_unref ( G_OBJECT(vgl->scaled) ); vgl->scaled = NULL; } vgl->pixbuf = gdk_pixbuf_new_from_file ( vgl->image, &gx ); if (gx) { if ( !from_file ) a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(vp), _("Couldn't open image file: %s"), gx->message ); g_error_free ( gx ); } else { vgl->width = gdk_pixbuf_get_width ( vgl->pixbuf ); vgl->height = gdk_pixbuf_get_height ( vgl->pixbuf ); } if ( !from_file ) { if ( vik_viewport_get_drawmode(vp) != VIK_VIEWPORT_DRAWMODE_UTM ) { a_dialog_warning_msg ( VIK_GTK_WINDOW_FROM_WIDGET(vp), _("GeoRef map cannot be displayed in the current drawmode.\nSelect \"UTM Mode\" from View menu to view it.") ); } } /* should find length and width here too */ }
static void file_write ( VikAggregateLayer *top, FILE *f, gpointer vp ) { Stack *stack = NULL; VikLayer *current_layer; struct LatLon ll; VikViewportDrawMode mode; gchar *modestring = NULL; push(&stack); stack->data = (gpointer) vik_aggregate_layer_get_children(VIK_AGGREGATE_LAYER(top)); stack->under = NULL; /* crazhy CRAZHY */ vik_coord_to_latlon ( vik_viewport_get_center ( VIK_VIEWPORT(vp) ), &ll ); mode = vik_viewport_get_drawmode ( VIK_VIEWPORT(vp) ); switch ( mode ) { case VIK_VIEWPORT_DRAWMODE_UTM: modestring = "utm"; break; case VIK_VIEWPORT_DRAWMODE_EXPEDIA: modestring = "expedia"; break; case VIK_VIEWPORT_DRAWMODE_MERCATOR: modestring = "mercator"; break; case VIK_VIEWPORT_DRAWMODE_LATLON: modestring = "latlon"; break; default: g_critical("Houston, we've had a problem. mode=%d", mode); } fprintf ( f, "#VIKING GPS Data file " VIKING_URL "\n" ); fprintf ( f, "FILE_VERSION=%d\n", VIKING_FILE_VERSION ); fprintf ( f, "\nxmpp=%f\nympp=%f\nlat=%f\nlon=%f\nmode=%s\ncolor=%s\nhighlightcolor=%s\ndrawscale=%s\ndrawcentermark=%s\ndrawhighlight=%s\n", vik_viewport_get_xmpp ( VIK_VIEWPORT(vp) ), vik_viewport_get_ympp ( VIK_VIEWPORT(vp) ), ll.lat, ll.lon, modestring, vik_viewport_get_background_color(VIK_VIEWPORT(vp)), vik_viewport_get_highlight_color(VIK_VIEWPORT(vp)), vik_viewport_get_draw_scale(VIK_VIEWPORT(vp)) ? "t" : "f", vik_viewport_get_draw_centermark(VIK_VIEWPORT(vp)) ? "t" : "f", vik_viewport_get_draw_highlight(VIK_VIEWPORT(vp)) ? "t" : "f" ); if ( ! VIK_LAYER(top)->visible ) fprintf ( f, "visible=f\n" ); while (stack && stack->data) { current_layer = VIK_LAYER(((GList *)stack->data)->data); fprintf ( f, "\n~Layer %s\n", vik_layer_get_interface(current_layer->type)->fixed_layer_name ); write_layer_params_and_data ( current_layer, f ); if ( current_layer->type == VIK_LAYER_AGGREGATE && !vik_aggregate_layer_is_empty(VIK_AGGREGATE_LAYER(current_layer)) ) { push(&stack); stack->data = (gpointer) vik_aggregate_layer_get_children(VIK_AGGREGATE_LAYER(current_layer)); } else if ( current_layer->type == VIK_LAYER_GPS && !vik_gps_layer_is_empty(VIK_GPS_LAYER(current_layer)) ) { push(&stack); stack->data = (gpointer) vik_gps_layer_get_children(VIK_GPS_LAYER(current_layer)); } else { stack->data = (gpointer) ((GList *)stack->data)->next; fprintf ( f, "~EndLayer\n\n" ); while ( stack && (!stack->data) ) { pop(&stack); if ( stack ) { stack->data = (gpointer) ((GList *)stack->data)->next; fprintf ( f, "~EndLayer\n\n" ); } } } } /* get vikaggregatelayer's children (?) foreach write ALL params, then layer data (IF function exists) then endlayer impl: stack of layers (LIST) we are working on when layer->next == NULL ... we move on. */ }