This is an automated email from the git hooks/post-receive script. ross-guest pushed a commit to branch master in repository osm-gps-map.
commit 9c08374ba08d7ccea316b8708b7e5490816e029f Author: Ross Gammon <rossgam...@mail.dk> Date: Sat Nov 21 10:56:14 2015 +0100 Imported Upstream version 1.1.0 --- Makefile.am | 18 +- NEWS | 9 + configure.ac | 15 +- docs/reference/Makefile.am | 4 +- examples/Makefile.am | 38 +++- examples/README | 3 + examples/editable_track.c | 42 +++++ examples/mapviewer.c | 9 +- examples/polygon.c | 47 +++++ m4/gtk-doc.m4 | 51 ++++-- src/Makefile.am | 2 + src/converter.c | 28 +++ src/converter.h | 8 + src/osm-gps-map-image.c | 37 ++++ src/osm-gps-map-image.h | 2 + src/osm-gps-map-polygon.c | 185 +++++++++++++++++++ src/osm-gps-map-polygon.h | 60 +++++++ src/osm-gps-map-source.c | 22 --- src/osm-gps-map-source.h | 3 - src/osm-gps-map-track.c | 125 ++++++++++++- src/osm-gps-map-track.h | 25 +++ src/osm-gps-map-widget.c | 434 ++++++++++++++++++++++++++++++++++++++++++--- src/osm-gps-map-widget.h | 7 + 23 files changed, 1069 insertions(+), 105 deletions(-) diff --git a/Makefile.am b/Makefile.am index fafc4bb..8f2d1d5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,30 +1,21 @@ ## Process this file with automake to produce Makefile.in SUBDIRS = src examples docs -DISTCHECK_CONFIGURE_FLAGS = \ - --enable-gtk-doc \ - --enable-maintainer-flags +AM_DISTCHECK_CONFIGURE_FLAGS = \ + --enable-gtk-doc ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} -osm_gps_mapdocdir = ${prefix}/doc/osm-gps-map -osm_gps_mapdoc_DATA = \ +doc_DATA = \ README \ COPYING \ AUTHORS \ ChangeLog \ - INSTALL \ NEWS pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = osmgpsmap-1.0.pc -EXTRA_DIST = $(openstreetmap_gps_mapdoc_DATA) \ - osmgpsmap-1.0.pc.in \ - gtk-doc.make \ - m4/introspection.m4 \ - m4/gtk-doc.m4 - DISTCLEANFILES = gtk-doc.make # ChangeLog generation from nautils @@ -34,8 +25,7 @@ distclean-local: fi ChangeLog: - @echo Creating $@ - @if test -d "$(srcdir)/.git"; then \ + $(AM_V_GEN)if test -d "$(srcdir)/.git"; then \ (GIT_DIR=$(top_srcdir)/.git ./missing --run git log 0.7.3.. --stat -M -C --name-status --date=short --no-color) | fmt --split-only > $@.tmp \ && mv -f $@.tmp $@ \ || ($(RM) $@.tmp; \ diff --git a/NEWS b/NEWS index ed3ce93..52e6d82 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,12 @@ +Changes in 1.1.0 +====================== + * Add polygon support Samuel Cowen <samuel.cowe...@gmail.com> + * Add osm_gps_map_zoom_fit_bbox Martijn Goedhart <goedhart.mart...@gmail.com> + * Fix leaks oman Lebedev <lebedev...@gmail.com> + * Remove Yahoo (API break) Quentin Glidic <sardemff7+...@sardemff7.net> + * Build fixes Quentin Glidic <sardemff7+...@sardemff7.net> + * Fix image rotation Christoph Gysin <christoph.gy...@gmail.com> + Changes in 1.0.2 ====================== * Fix build with new giscanner diff --git a/configure.ac b/configure.ac index d5a6cd6..6e9ae8a 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,10 @@ AC_PREREQ([2.63]) AC_INIT([osm-gps-map], - [1.0.2], + [1.1.0], [http://github.com/nzjrs/osm-gps-map/issues], [osm-gps-map]) -AM_INIT_AUTOMAKE([1.11]) +AM_INIT_AUTOMAKE([1.11 foreign subdir-objects parallel-tests]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_SRCDIR([src/osm-gps-map.h]) @@ -25,11 +25,7 @@ PKG_CHECK_MODULES(SOUP24, [libsoup-2.4]) # The mapviewer demo also calls g_thread_init, so it needs to link against # libgthread-2.0. -PKG_CHECK_MODULES(GTHREAD, [gthread-2.0], [ - have_gthread="yes" ], [ - have_gthread="no" - AC_MSG_RESULT([mapviewer demo disabled])]) -AM_CONDITIONAL([HAVE_GTHREAD], [ test "x$have_gthread" = "xyes" ]) +PKG_CHECK_MODULES(GTHREAD, [gthread-2.0]) AC_CHECK_FUNCS(gdk_event_get_scroll_deltas) @@ -52,16 +48,15 @@ AM_CONDITIONAL(OS_WIN32, [test $os_win32 = yes]) # - If binary compatibility has been broken (eg removed or changed interfaces) # change to C+1:0:0 # - If the interface is the same as the previous version, change to C:R+1:A -LT_VERSION_INFO=0:0:0 +LT_VERSION_INFO=1:0:0 AC_SUBST(LT_VERSION_INFO) GOBJECT_INTROSPECTION_REQS=0.10.0 -GOBJECT_INTROSPECTION_REQUIRE([$GOBJECT_INTROSPECTION_REQS]) +GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_REQS]) GTK_DOC_CHECK([1.12]) GNOME_COMPILE_WARNINGS([maximum]) -GNOME_MAINTAINER_MODE_DEFINES AC_OUTPUT([ osmgpsmap-1.0.pc diff --git a/docs/reference/Makefile.am b/docs/reference/Makefile.am index cbc6461..07ccc2b 100644 --- a/docs/reference/Makefile.am +++ b/docs/reference/Makefile.am @@ -69,9 +69,9 @@ expand_content_files= # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. -# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. AM_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) -INCLUDES=-I$(top_srcdir) -I$(top_builddir) \ +AM_CFLAGS=-I$(top_srcdir) -I$(top_builddir) \ $(GLIB_CFLAGS) \ $(GTK_CFLAGS) \ $(CAIRO_CFLAGS) \ diff --git a/examples/Makefile.am b/examples/Makefile.am index ec123d4..fafab85 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -13,11 +13,7 @@ OSMGPSMAP_LIBS = \ $(SOUP24_LIBS) ## Demo Application -if HAVE_GTHREAD -noinst_PROGRAMS = mapviewer -else -noinst_PROGRAMS = -endif +noinst_PROGRAMS = mapviewer polygon editable_track mapviewer_SOURCES = \ mapviewer.c @@ -34,6 +30,38 @@ mapviewer_LDADD = \ $(GTHREAD_LIBS) \ $(top_builddir)/src/libosmgpsmap-1.0.la + +polygon_SOURCES = \ + polygon.c + +polygon_CFLAGS = \ + -I$(top_srcdir)/src \ + $(WARN_CFLAGS) \ + $(DISABLE_DEPRECATED) \ + $(OSMGPSMAP_CFLAGS) \ + $(GTHREAD_CFLAGS) + +polygon_LDADD = \ + $(OSMGPSMAP_LIBS) \ + $(GTHREAD_LIBS) \ + $(top_builddir)/src/libosmgpsmap-1.0.la + + +editable_track_SOURCES = \ + editable_track.c + +editable_track_CFLAGS = \ + -I$(top_srcdir)/src \ + $(WARN_CFLAGS) \ + $(DISABLE_DEPRECATED) \ + $(OSMGPSMAP_CFLAGS) \ + $(GTHREAD_CFLAGS) + +editable_track_LDADD = \ + $(OSMGPSMAP_LIBS) \ + $(GTHREAD_LIBS) \ + $(top_builddir)/src/libosmgpsmap-1.0.la + ## Misc EXTRA_DIST = poi.png mapviewer.ui mapviewer.js README diff --git a/examples/README b/examples/README index 4009b04..1ccb183 100644 --- a/examples/README +++ b/examples/README @@ -3,6 +3,9 @@ osm-gps-map example applications C based demo app with many options. See '--help' for a list. Note, this must be executed from the examples directory so it can find the mapviewer.ui file. + * ./polygon + This example demonstrates editable polygons. Vertex points can be dragged. + Clicking mid-points divides the line and creates another vertex. * ./mapviewer.py Python version of the C demo app, with examples showing how to do custom layers. diff --git a/examples/editable_track.c b/examples/editable_track.c new file mode 100644 index 0000000..07613aa --- /dev/null +++ b/examples/editable_track.c @@ -0,0 +1,42 @@ +#include <gtk/gtk.h> +#include "osm-gps-map.h" + +int +main (int argc, + char *argv[]) +{ + OsmGpsMap *map; + GtkWidget *window; + + gtk_init (&argc, &argv); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (window), "Window"); + g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); + + + map = g_object_new (OSM_TYPE_GPS_MAP, NULL); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(map)); + + OsmGpsMapTrack* track = osm_gps_map_track_new(); + + OsmGpsMapPoint* p1, *p2; + p1 = osm_gps_map_point_new_radians(1.25663706, -0.488692191); + p2 = osm_gps_map_point_new_radians(1.06465084, -0.750491578); + + osm_gps_map_track_add_point(track, p1); + osm_gps_map_track_add_point(track, p2); + + g_object_set(track, "editable", TRUE, NULL); + + osm_gps_map_track_add(map, track); + + gtk_widget_show (GTK_WIDGET(map)); + gtk_widget_show (window); + + gtk_main (); + + return 0; +} + + diff --git a/examples/mapviewer.c b/examples/mapviewer.c index 1acd779..bbe4272 100644 --- a/examples/mapviewer.c +++ b/examples/mapviewer.c @@ -30,6 +30,7 @@ static gboolean opt_friendly_cache = FALSE; static gboolean opt_no_cache = FALSE; static gboolean opt_debug = FALSE; static char *opt_cache_base_dir = NULL; +static gboolean opt_editable_tracks = FALSE; static GOptionEntry entries[] = { { "friendly-cache", 'f', 0, G_OPTION_ARG_NONE, &opt_friendly_cache, "Store maps using friendly cache style (source name)", NULL }, @@ -37,6 +38,7 @@ static GOptionEntry entries[] = { "cache-basedir", 'b', 0, G_OPTION_ARG_FILENAME, &opt_cache_base_dir, "Cache basedir", NULL }, { "debug", 'd', 0, G_OPTION_ARG_NONE, &opt_debug, "Enable debugging", NULL }, { "map", 'm', 0, G_OPTION_ARG_INT, &opt_map_provider, "Map source", "N" }, + { "editable-tracks", 'e', 0, G_OPTION_ARG_NONE, &opt_editable_tracks, "Make the tracks editable", NULL }, { NULL } }; @@ -191,7 +193,7 @@ on_gps_color_changed (GtkColorChooser *widget, gpointer user_data) GdkRGBA c; OsmGpsMapTrack *track = OSM_GPS_MAP_TRACK(user_data); gtk_color_chooser_get_rgba (widget, &c); - g_object_set(track, "color", &c, NULL); + osm_gps_map_track_set_color(track, &c); } #else static void @@ -200,7 +202,7 @@ on_gps_color_changed (GtkColorButton *widget, gpointer user_data) GdkRGBA c; OsmGpsMapTrack *track = OSM_GPS_MAP_TRACK(user_data); gtk_color_button_get_rgba (widget, &c); - g_object_set(track, "color", &c, NULL); + osm_gps_map_track_set_color(track, &c); } #endif @@ -303,6 +305,9 @@ main (int argc, char **argv) //Add a second track for right clicks rightclicktrack = osm_gps_map_track_new(); + + if(opt_editable_tracks) + g_object_set(rightclicktrack, "editable", TRUE, NULL); osm_gps_map_track_add(OSM_GPS_MAP(map), rightclicktrack); g_free(cachedir); diff --git a/examples/polygon.c b/examples/polygon.c new file mode 100644 index 0000000..b8d1e89 --- /dev/null +++ b/examples/polygon.c @@ -0,0 +1,47 @@ +#include <gtk/gtk.h> +#include "osm-gps-map.h" + +int +main (int argc, + char *argv[]) +{ + OsmGpsMap *map; + OsmGpsMapPolygon* poly; + GtkWidget *window; + + gtk_init (&argc, &argv); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (window), "Window"); + g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); + + + map = g_object_new (OSM_TYPE_GPS_MAP, NULL); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(map)); + + poly = osm_gps_map_polygon_new(); + OsmGpsMapTrack* polytrack = osm_gps_map_track_new(); + + OsmGpsMapPoint* p1, *p2, *p3; + p1 = osm_gps_map_point_new_radians(1.25663706, -0.488692191); + p2 = osm_gps_map_point_new_radians(1.06465084, -0.750491578); + p3 = osm_gps_map_point_new_radians(1.064650849, -0.191986218); + + osm_gps_map_track_add_point(polytrack, p1); + osm_gps_map_track_add_point(polytrack, p2); + osm_gps_map_track_add_point(polytrack, p3); + + g_object_set(poly, "track", polytrack, NULL); + g_object_set(poly, "editable", TRUE, NULL); + + osm_gps_map_polygon_add(map, poly); + + gtk_widget_show (GTK_WIDGET(map)); + gtk_widget_show (window); + + gtk_main (); + + return 0; +} + + diff --git a/m4/gtk-doc.m4 b/m4/gtk-doc.m4 index 0ada151..3675543 100644 --- a/m4/gtk-doc.m4 +++ b/m4/gtk-doc.m4 @@ -1,6 +1,6 @@ dnl -*- mode: autoconf -*- -# serial 1 +# serial 2 dnl Usage: dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) @@ -10,8 +10,24 @@ AC_DEFUN([GTK_DOC_CHECK], AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first + ifelse([$1],[],[gtk_doc_requires="gtk-doc"],[gtk_doc_requires="gtk-doc >= $1"]) + AC_MSG_CHECKING([for gtk-doc]) + PKG_CHECK_EXISTS([$gtk_doc_requires],[have_gtk_doc=yes],[have_gtk_doc=no]) + AC_MSG_RESULT($have_gtk_doc) + + if test "$have_gtk_doc" = "no"; then + AC_MSG_WARN([ + You will not be able to create source packages with 'make dist' + because $gtk_doc_requires is not found.]) + fi + dnl check for tools we added during development - AC_PATH_PROG([GTKDOC_CHECK],[gtkdoc-check]) + dnl Use AC_CHECK_PROG to avoid the check target using an absolute path that + dnl may not be writable by the user. Currently, automake requires that the + dnl test name must end in '.test'. + dnl https://bugzilla.gnome.org/show_bug.cgi?id=701638 + AC_CHECK_PROG([GTKDOC_CHECK],[gtkdoc-check],[gtkdoc-check.test]) + AC_PATH_PROG([GTKDOC_CHECK_PATH],[gtkdoc-check]) AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true]) AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf]) @@ -28,22 +44,22 @@ AC_DEFUN([GTK_DOC_CHECK], [use gtk-doc to build documentation [[default=no]]]),, [enable_gtk_doc=no]) - if test x$enable_gtk_doc = xyes; then - ifelse([$1],[], - [PKG_CHECK_EXISTS([gtk-doc],, - AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))], - [PKG_CHECK_EXISTS([gtk-doc >= $1],, - AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build $PACKAGE_NAME]))]) - dnl don't check for glib if we build glib - if test "x$PACKAGE_NAME" != "xglib"; then - dnl don't fail if someone does not have glib - PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0,,) - fi - fi - AC_MSG_CHECKING([whether to build gtk-doc documentation]) AC_MSG_RESULT($enable_gtk_doc) + if test "x$enable_gtk_doc" = "xyes" && test "$have_gtk_doc" = "no"; then + AC_MSG_ERROR([ + You must have $gtk_doc_requires installed to build documentation for + $PACKAGE_NAME. Please install gtk-doc or disable building the + documentation by adding '--disable-gtk-doc' to '[$]0'.]) + fi + + dnl don't check for glib if we build glib + if test "x$PACKAGE_NAME" != "xglib"; then + dnl don't fail if someone does not have glib + PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0,,[:]) + fi + dnl enable/disable output formats AC_ARG_ENABLE([gtk-doc-html], AS_HELP_STRING([--enable-gtk-doc-html], @@ -58,7 +74,12 @@ AC_DEFUN([GTK_DOC_CHECK], enable_gtk_doc_pdf=no fi + if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 + fi + AC_SUBST([AM_DEFAULT_VERBOSITY]) + AM_CONDITIONAL([HAVE_GTK_DOC], [test x$have_gtk_doc = xyes]) AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes]) AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes]) diff --git a/src/Makefile.am b/src/Makefile.am index 66d67da..d6e9596 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -42,6 +42,7 @@ sources_public_h = \ osm-gps-map-osd.h \ osm-gps-map-layer.h \ osm-gps-map-track.h \ + osm-gps-map-polygon.h \ osm-gps-map-point.h \ osm-gps-map-image.h \ osm-gps-map-source.h \ @@ -54,6 +55,7 @@ sources_c = \ osm-gps-map-osd.c \ osm-gps-map-layer.c \ osm-gps-map-track.c \ + osm-gps-map-polygon.c \ osm-gps-map-point.c \ osm-gps-map-image.c \ osm-gps-map-source.c \ diff --git a/src/converter.c b/src/converter.c index c83d20a..cfa7093 100644 --- a/src/converter.c +++ b/src/converter.c @@ -3,6 +3,7 @@ /* * Copyright (C) Marcus Bauer 2008 <marcus.ba...@gmail.com> * Copyright (C) 2013 John Stowers <john.stow...@gmail.com> + * Copyright (C) 2014 Martijn Goedhart <goedhart.mart...@gmail.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -20,10 +21,22 @@ #include <math.h> #include <stdio.h> +#include <float.h> #include "private.h" #include "converter.h" +/* + * The (i)logb(x) function is equal to `floor(log(x) / log(2))` or + * `floor(log2(x))`, but probably faster and also accepts negative values. + * But this is only true when FLT_RADIX equals 2, which is on allmost all + * machine. + */ +#if FLT_RADIX == 2 +#define LOG2(x) (ilogb(x)) +#else +#define LOG2(x) ((int)floor(log2(abs(x)))) +#endif float deg2rad(float deg) @@ -102,3 +115,18 @@ pixel2lat( float zoom, return lat; } + +int +latlon2zoom(int pix_height, + int pix_width, + float lat1, + float lat2, + float lon1, + float lon2) +{ + float lat1_m = atanh(sin(lat1)); + float lat2_m = atanh(sin(lat2)); + int zoom_lon = LOG2((double)(2 * pix_width * M_PI) / (TILESIZE * (lon2 - lon1))); + int zoom_lat = LOG2((double)(2 * pix_height * M_PI) / (TILESIZE * (lat2_m - lat1_m))); + return MIN(zoom_lon, zoom_lat); +} diff --git a/src/converter.h b/src/converter.h index 4e4fd1f..5051f58 100644 --- a/src/converter.h +++ b/src/converter.h @@ -42,3 +42,11 @@ pixel2lon( float zoom, float pixel2lat( float zoom, int pixel_y); + +int +latlon2zoom(int pix_height, + int pix_width, + float lat1, + float lat2, + float lon1, + float lon2); diff --git a/src/osm-gps-map-image.c b/src/osm-gps-map-image.c index b57cdee..969930d 100644 --- a/src/osm-gps-map-image.c +++ b/src/osm-gps-map-image.c @@ -44,6 +44,7 @@ enum PROP_Y_ALIGN, PROP_POINT, PROP_Z_ORDER, + PROP_ROTATION }; struct _OsmGpsMapImagePrivate @@ -55,6 +56,7 @@ struct _OsmGpsMapImagePrivate gfloat xalign; gfloat yalign; int zorder; + float rotation; }; static void @@ -81,6 +83,9 @@ osm_gps_map_image_get_property (GObject *object, case PROP_Z_ORDER: g_value_set_int (value, priv->zorder); break; + case PROP_ROTATION: + g_value_set_float(value, priv->rotation); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } @@ -114,6 +119,9 @@ osm_gps_map_image_set_property (GObject *object, case PROP_Z_ORDER: priv->zorder = g_value_get_int (value); break; + case PROP_ROTATION: + priv->rotation = g_value_get_float(value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } @@ -193,6 +201,16 @@ osm_gps_map_image_class_init (OsmGpsMapImageClass *klass) 100, /* maximum property value */ 0, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property (object_class, + PROP_ROTATION, + g_param_spec_float ("rotation", + "rotation", + "image rotation", + -180.0, /* minimum property value */ + 180.0, /* maximum property value */ + 0.0f, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT)); } static void @@ -222,9 +240,17 @@ osm_gps_map_image_draw (OsmGpsMapImage *object, cairo_t *cr, GdkRectangle *rect) x = rect->x - xoffset; y = rect->y - yoffset; + cairo_translate(cr, x+(priv->w/2), y+(priv->h/2)); + cairo_rotate(cr, deg2rad(priv->rotation)); + cairo_translate(cr, -(x+(priv->w/2)), -(y+(priv->h/2))); + gdk_cairo_set_source_pixbuf (cr, priv->pixbuf, x, y); cairo_paint (cr); + cairo_translate(cr, x+(priv->w/2), y+(priv->h/2)); + cairo_rotate(cr, -deg2rad(priv->rotation)); + cairo_translate(cr, -(x+(priv->w/2)), -(y+(priv->h/2))); + rect->width = priv->w; rect->height = priv->h; } @@ -242,3 +268,14 @@ osm_gps_map_image_get_zorder(OsmGpsMapImage *object) g_return_val_if_fail (OSM_IS_GPS_MAP_IMAGE (object), 0); return object->priv->zorder; } + +float osm_gps_map_image_get_rotation(OsmGpsMapImage* object) +{ + return object->priv->rotation; +} + +void osm_gps_map_image_set_rotation(OsmGpsMapImage* object, float rot) +{ + object->priv->rotation = rot; +} + diff --git a/src/osm-gps-map-image.h b/src/osm-gps-map-image.h index f1f92a4..ba31fcc 100644 --- a/src/osm-gps-map-image.h +++ b/src/osm-gps-map-image.h @@ -57,6 +57,8 @@ OsmGpsMapImage *osm_gps_map_image_new (void); void osm_gps_map_image_draw (OsmGpsMapImage *object, cairo_t *cr, GdkRectangle *rect); const OsmGpsMapPoint *osm_gps_map_image_get_point(OsmGpsMapImage *object); gint osm_gps_map_image_get_zorder(OsmGpsMapImage *object); +float osm_gps_map_image_get_rotation(OsmGpsMapImage* object); +void osm_gps_map_image_set_rotation(OsmGpsMapImage* object, float rot); G_END_DECLS diff --git a/src/osm-gps-map-polygon.c b/src/osm-gps-map-polygon.c new file mode 100644 index 0000000..29c437f --- /dev/null +++ b/src/osm-gps-map-polygon.c @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2013 Samuel Cowen <samuel.co...@camelsoftware.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + + +#include <gdk/gdk.h> + +#include "converter.h" +#include "osm-gps-map-polygon.h" + +G_DEFINE_TYPE (OsmGpsMapPolygon, osm_gps_map_polygon, G_TYPE_OBJECT) + +enum +{ + PROP_0, + PROP_VISIBLE, + PROP_TRACK, + PROP_SHADED, + PROP_EDITABLE +}; + +struct _OsmGpsMapPolygonPrivate +{ + OsmGpsMapTrack* track; + gboolean visible; + gboolean editable; + gboolean shaded; +}; + +#define DEFAULT_R (60000) +#define DEFAULT_G (0) +#define DEFAULT_B (0) +#define DEFAULT_A (0.6) + +static void +osm_gps_map_polygon_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + OsmGpsMapPolygonPrivate *priv = OSM_GPS_MAP_POLYGON(object)->priv; + + switch (property_id) + { + case PROP_VISIBLE: + g_value_set_boolean(value, priv->visible); + break; + case PROP_TRACK: + g_value_set_pointer(value, priv->track); + break; + case PROP_SHADED: + g_value_set_boolean(value, priv->shaded); + break; + case PROP_EDITABLE: + g_value_set_boolean(value, priv->editable); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +osm_gps_map_polygon_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + OsmGpsMapPolygonPrivate *priv = OSM_GPS_MAP_POLYGON(object)->priv; + + switch (property_id) + { + case PROP_VISIBLE: + priv->visible = g_value_get_boolean (value); + break; + case PROP_TRACK: + priv->track = g_value_get_pointer (value); + break; + case PROP_SHADED: + priv->shaded = g_value_get_boolean(value); + break; + case PROP_EDITABLE: + priv->editable = g_value_get_boolean(value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +osm_gps_map_polygon_dispose (GObject *object) +{ + g_return_if_fail (OSM_IS_GPS_MAP_POLYGON (object)); + OsmGpsMapPolygon* poly = OSM_GPS_MAP_POLYGON(object); + g_object_unref(poly->priv->track); + + G_OBJECT_CLASS (osm_gps_map_polygon_parent_class)->dispose (object); +} + +static void +osm_gps_map_polygon_finalize (GObject *object) +{ + G_OBJECT_CLASS (osm_gps_map_polygon_parent_class)->finalize (object); +} + +static void +osm_gps_map_polygon_class_init (OsmGpsMapPolygonClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (OsmGpsMapPolygonPrivate)); + + object_class->get_property = osm_gps_map_polygon_get_property; + object_class->set_property = osm_gps_map_polygon_set_property; + object_class->dispose = osm_gps_map_polygon_dispose; + object_class->finalize = osm_gps_map_polygon_finalize; + + g_object_class_install_property (object_class, + PROP_VISIBLE, + g_param_spec_boolean ("visible", + "visible", + "should this poly be visible", + TRUE, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property (object_class, + PROP_TRACK, + g_param_spec_pointer ("track", + "track", + "list of points for the polygon", + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT)); + + + g_object_class_install_property (object_class, + PROP_EDITABLE, + g_param_spec_boolean ("editable", + "editable", + "should this polygon be editable", + FALSE, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property (object_class, + PROP_SHADED, + g_param_spec_boolean ("shaded", + "shaded", + "should this polygon be shaded", + TRUE, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT)); + +} + +static void +osm_gps_map_polygon_init (OsmGpsMapPolygon *self) +{ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE((self), OSM_TYPE_GPS_MAP_POLYGON, OsmGpsMapPolygonPrivate); + self->priv->track = osm_gps_map_track_new(); +} + +OsmGpsMapTrack* +osm_gps_map_polygon_get_track(OsmGpsMapPolygon* poly) +{ + return poly->priv->track; +} + +OsmGpsMapPolygon * +osm_gps_map_polygon_new (void) +{ + return g_object_new (OSM_TYPE_GPS_MAP_POLYGON, "track", osm_gps_map_track_new(), NULL); +} + +#ifdef __cplusplus +} +#endif diff --git a/src/osm-gps-map-polygon.h b/src/osm-gps-map-polygon.h new file mode 100644 index 0000000..5eb3139 --- /dev/null +++ b/src/osm-gps-map-polygon.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2013 Samuel Cowen <samuel.co...@camelsoftware.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _OSM_GPS_MAP_POLYGON_H +#define _OSM_GPS_MAP_POLYGON_H + +#include <glib.h> +#include <glib-object.h> +#include <gdk/gdk.h> + +G_BEGIN_DECLS + +#include "osm-gps-map-track.h" + +#define OSM_TYPE_GPS_MAP_POLYGON osm_gps_map_polygon_get_type() +#define OSM_GPS_MAP_POLYGON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), OSM_TYPE_GPS_MAP_POLYGON, OsmGpsMapPolygon)) +#define OSM_GPS_MAP_POLYGON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), OSM_TYPE_GPS_MAP_POLYGON, OsmGpsMapPolygonClass)) +#define OSM_IS_GPS_MAP_POLYGON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), OSM_TYPE_GPS_MAP_POLYGON)) +#define OSM_IS_GPS_MAP_POLYGON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), OSM_TYPE_GPS_MAP_POLYGON)) +#define OSM_GPS_MAP_POLYGON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), OSM_TYPE_GPS_MAP_POLYGON, OsmGpsMapPolygonClass)) + +typedef struct _OsmGpsMapPolygon OsmGpsMapPolygon; +typedef struct _OsmGpsMapPolygonClass OsmGpsMapPolygonClass; +typedef struct _OsmGpsMapPolygonPrivate OsmGpsMapPolygonPrivate; + +struct _OsmGpsMapPolygon +{ + GObject parent; + + OsmGpsMapPolygonPrivate *priv; +}; + +struct _OsmGpsMapPolygonClass +{ + GObjectClass parent_class; +}; + +GType osm_gps_map_polygon_get_type (void) G_GNUC_CONST; + +OsmGpsMapPolygon* osm_gps_map_polygon_new (void); +OsmGpsMapTrack* osm_gps_map_polygon_get_track(OsmGpsMapPolygon* poly); + +G_END_DECLS + +#endif /* _OSM_GPS_MAP_POLYGON_H */ diff --git a/src/osm-gps-map-source.c b/src/osm-gps-map-source.c index 9dbb807..06f960f 100644 --- a/src/osm-gps-map-source.c +++ b/src/osm-gps-map-source.c @@ -53,12 +53,6 @@ osm_gps_map_source_get_friendly_name(OsmGpsMapSource_t source) return "Virtual Earth Satellite"; case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_HYBRID: return "Virtual Earth Hybrid"; - case OSM_GPS_MAP_SOURCE_YAHOO_STREET: - return "Yahoo Maps"; - case OSM_GPS_MAP_SOURCE_YAHOO_SATELLITE: - return "Yahoo Satellite"; - case OSM_GPS_MAP_SOURCE_YAHOO_HYBRID: - return "Yahoo Hybrid"; case OSM_GPS_MAP_SOURCE_LAST: default: return NULL; @@ -109,16 +103,6 @@ osm_gps_map_source_get_repo_uri(OsmGpsMapSource_t source) return "http://a#R.ortho.tiles.virtualearth.net/tiles/a#W.jpeg?g=50"; case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_HYBRID: return "http://a#R.ortho.tiles.virtualearth.net/tiles/h#W.jpeg?g=50"; - case OSM_GPS_MAP_SOURCE_YAHOO_STREET: - case OSM_GPS_MAP_SOURCE_YAHOO_SATELLITE: - case OSM_GPS_MAP_SOURCE_YAHOO_HYBRID: - /* TODO: Implement signed Y, aka U - * http://us.maps3.yimg.com/aerial.maps.yimg.com/ximg?v=1.7&t=a&s=256&x=%d&y=%-d&z=%d - * x = tilex, - * y = (1 << (MAX_ZOOM - zoom)) - tiley - 1, - * z = zoom - (MAX_ZOOM - 17)); - */ - return NULL; case OSM_GPS_MAP_SOURCE_LAST: default: return NULL; @@ -143,9 +127,6 @@ osm_gps_map_source_get_image_format(OsmGpsMapSource_t source) case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_STREET: case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_SATELLITE: case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_HYBRID: - case OSM_GPS_MAP_SOURCE_YAHOO_STREET: - case OSM_GPS_MAP_SOURCE_YAHOO_SATELLITE: - case OSM_GPS_MAP_SOURCE_YAHOO_HYBRID: case OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE: case OSM_GPS_MAP_SOURCE_GOOGLE_SATELLITE: return "jpg"; @@ -180,9 +161,6 @@ osm_gps_map_source_get_max_zoom(OsmGpsMapSource_t source) case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_STREET: case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_SATELLITE: case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_HYBRID: - case OSM_GPS_MAP_SOURCE_YAHOO_STREET: - case OSM_GPS_MAP_SOURCE_YAHOO_SATELLITE: - case OSM_GPS_MAP_SOURCE_YAHOO_HYBRID: return 17; case OSM_GPS_MAP_SOURCE_OSMC_TRAILS: return 15; diff --git a/src/osm-gps-map-source.h b/src/osm-gps-map-source.h index 073c0c3..0237700 100644 --- a/src/osm-gps-map-source.h +++ b/src/osm-gps-map-source.h @@ -38,9 +38,6 @@ typedef enum { OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_STREET, OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_SATELLITE, OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_HYBRID, - OSM_GPS_MAP_SOURCE_YAHOO_STREET, - OSM_GPS_MAP_SOURCE_YAHOO_SATELLITE, - OSM_GPS_MAP_SOURCE_YAHOO_HYBRID, OSM_GPS_MAP_SOURCE_OSMC_TRAILS, OSM_GPS_MAP_SOURCE_LAST diff --git a/src/osm-gps-map-track.c b/src/osm-gps-map-track.c index c388917..6faac49 100644 --- a/src/osm-gps-map-track.c +++ b/src/osm-gps-map-track.c @@ -29,6 +29,7 @@ **/ #include <gdk/gdk.h> +#include <math.h> #include "converter.h" #include "osm-gps-map-track.h" @@ -42,13 +43,17 @@ enum PROP_TRACK, PROP_LINE_WIDTH, PROP_ALPHA, - PROP_COLOR + PROP_COLOR, + PROP_EDITABLE }; enum { - POINT_ADDED, - LAST_SIGNAL + POINT_ADDED, + POINT_CHANGED, + POINT_INSERTED, + POINT_REMOVED, + LAST_SIGNAL }; static guint signals[LAST_SIGNAL] = {0,}; @@ -60,9 +65,10 @@ struct _OsmGpsMapTrackPrivate gfloat linewidth; gfloat alpha; GdkRGBA color; + gboolean editable; }; -#define DEFAULT_R (60000) +#define DEFAULT_R (0.6) #define DEFAULT_G (0) #define DEFAULT_B (0) #define DEFAULT_A (0.6) @@ -92,6 +98,9 @@ osm_gps_map_track_get_property (GObject *object, case PROP_COLOR: g_value_set_boxed(value, &priv->color); break; + case PROP_EDITABLE: + g_value_set_boolean(value, priv->editable); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } @@ -124,7 +133,12 @@ osm_gps_map_track_set_property (GObject *object, priv->color.red = c->red; priv->color.green = c->green; priv->color.blue = c->blue; + printf("\n%f %f %f\n", c->red, c->green, c->blue); + fflush(stdout); } break; + case PROP_EDITABLE: + priv->editable = g_value_get_boolean(value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } @@ -203,9 +217,17 @@ osm_gps_map_track_class_init (OsmGpsMapTrackClass *klass) g_param_spec_boxed ("color", "color", "color of the track", - GDK_TYPE_COLOR, + GDK_TYPE_RGBA, G_PARAM_READABLE | G_PARAM_WRITABLE)); + g_object_class_install_property (object_class, + PROP_EDITABLE, + g_param_spec_boolean ("editable", + "editable", + "should this track be editable", + FALSE, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT)); + /** * OsmGpsMapTrack::point-added: * @self: A #OsmGpsMapTrack @@ -222,6 +244,40 @@ osm_gps_map_track_class_init (OsmGpsMapTrackClass *klass) G_TYPE_NONE, 1, OSM_TYPE_GPS_MAP_POINT); + + + signals [POINT_CHANGED] = g_signal_new ("point-changed", + OSM_TYPE_GPS_MAP_TRACK, + G_SIGNAL_RUN_FIRST, + 0, + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 1, + G_TYPE_INT); + + signals [POINT_INSERTED] = g_signal_new ("point-inserted", + OSM_TYPE_GPS_MAP_TRACK, + G_SIGNAL_RUN_FIRST, + 0, + NULL, + NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, + 1, + G_TYPE_INT); + + signals [POINT_REMOVED] = g_signal_new ("point-removed", + OSM_TYPE_GPS_MAP_TRACK, + G_SIGNAL_RUN_FIRST, + 0, + NULL, + NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, + 1, + G_TYPE_INT); } static void @@ -245,6 +301,34 @@ osm_gps_map_track_add_point (OsmGpsMapTrack *track, const OsmGpsMapPoint *point) g_signal_emit (track, signals[POINT_ADDED], 0, p); } +void +osm_gps_map_track_remove_point(OsmGpsMapTrack* track, int pos) +{ + OsmGpsMapTrackPrivate *priv = track->priv; + gpointer pgl = g_slist_nth_data(priv->track, pos); + priv->track = g_slist_remove(priv->track, pgl); + g_signal_emit(track, signals[POINT_REMOVED], 0, pos); +} + +int osm_gps_map_track_n_points(OsmGpsMapTrack* track) +{ + return g_slist_length(track->priv->track); +} + +void osm_gps_map_track_insert_point(OsmGpsMapTrack* track, OsmGpsMapPoint* np, int pos) +{ + OsmGpsMapTrackPrivate* priv = track->priv; + priv->track = g_slist_insert(priv->track, np, pos); + g_signal_emit(track, signals[POINT_INSERTED], 0, pos); +} + +OsmGpsMapPoint* osm_gps_map_track_get_point(OsmGpsMapTrack* track, int pos) +{ + OsmGpsMapTrackPrivate* priv = track->priv; + return g_slist_nth_data(priv->track, pos); +} + + GSList * osm_gps_map_track_get_points (OsmGpsMapTrack *track) { @@ -252,6 +336,15 @@ osm_gps_map_track_get_points (OsmGpsMapTrack *track) return track->priv->track; } +void +osm_gps_map_track_set_color (OsmGpsMapTrack *track, GdkRGBA *color) +{ + g_return_if_fail (OSM_IS_GPS_MAP_TRACK (track)); + track->priv->color.red = color->red; + track->priv->color.green = color->green; + track->priv->color.blue = color->blue; +} + void osm_gps_map_track_get_color (OsmGpsMapTrack *track, GdkRGBA *color) { @@ -261,6 +354,28 @@ osm_gps_map_track_get_color (OsmGpsMapTrack *track, GdkRGBA *color) color->blue = track->priv->color.blue; } +double +osm_gps_map_track_get_length(OsmGpsMapTrack* track) +{ + GSList* points = track->priv->track; + double ret = 0; + OsmGpsMapPoint* point_a = NULL; + OsmGpsMapPoint* point_b = NULL; + + while(points) + { + point_a = point_b; + point_b = points->data; + if(point_a) + { + ret += acos(sin(point_a->rlat)*sin(point_b->rlat) + + cos(point_a->rlat)*cos(point_b->rlat)*cos(point_b->rlon-point_a->rlon)) * 6371109; //the mean raduis of earth + } + points = points->next; + } + return ret; +} + OsmGpsMapTrack * osm_gps_map_track_new (void) diff --git a/src/osm-gps-map-track.h b/src/osm-gps-map-track.h index ac5e1ba..ed01e9e 100644 --- a/src/osm-gps-map-track.h +++ b/src/osm-gps-map-track.h @@ -78,8 +78,33 @@ void osm_gps_map_track_add_point (OsmGpsMapTrack *track, cons * Since: 0.7.0 **/ GSList * osm_gps_map_track_get_points (OsmGpsMapTrack *track); +void osm_gps_map_track_set_color (OsmGpsMapTrack *track, GdkRGBA *color); void osm_gps_map_track_get_color (OsmGpsMapTrack *track, GdkRGBA *color); +/** + * osm_gps_map_track_remove_point: + * @track (in): a #OsmGpsMapTrack + * @pos: Position of the point to remove + * + **/ +void osm_gps_map_track_remove_point(OsmGpsMapTrack* track, int pos); + +/** + * + **/ +int osm_gps_map_track_n_points(OsmGpsMapTrack* track); +void osm_gps_map_track_insert_point(OsmGpsMapTrack* track, OsmGpsMapPoint* np, int pos); +OsmGpsMapPoint* osm_gps_map_track_get_point(OsmGpsMapTrack* track, int pos); + +/** + * osm_gps_map_track_get_length: + * @track (in): a #OsmGpsMapTrack + * + * Returns: the length of the track in meters. + **/ +double osm_gps_map_track_get_length(OsmGpsMapTrack* track); + + G_END_DECLS #endif /* _OSM_GPS_MAP_TRACK_H */ diff --git a/src/osm-gps-map-widget.c b/src/osm-gps-map-widget.c index b6fd542..a14b2f0 100644 --- a/src/osm-gps-map-widget.c +++ b/src/osm-gps-map-widget.c @@ -148,6 +148,7 @@ #define USER_AGENT "libosmgpsmap/1.0" #define DOWNLOAD_RETRIES 3 #define MAX_DOWNLOAD_TILES 10000 +#define DOT_RADIUS 4.0 struct _OsmGpsMapPrivate { @@ -205,6 +206,7 @@ struct _OsmGpsMapPrivate //additional images or tracks added to the map GSList *tracks; GSList *images; + GSList *polygons; //Used for storing the joined tiles cairo_surface_t *pixmap; @@ -226,6 +228,10 @@ struct _OsmGpsMapPrivate int drag_limit; guint drag_expose_source; + /* Properties for dragging a point with right mouse button. */ + OsmGpsMapPoint* drag_point; + OsmGpsMapTrack* drag_track; + /* for customizing the redering of the gps track */ int ui_gps_point_inner_radius; int ui_gps_point_outer_radius; @@ -248,6 +254,7 @@ struct _OsmGpsMapPrivate guint is_button_down : 1; guint is_fullscreen : 1; guint is_google : 1; + guint is_dragging_point : 1; }; typedef struct @@ -308,8 +315,6 @@ static gchar *replace_string(const gchar *src, const gchar *from, const gchar static gchar *replace_map_uri(OsmGpsMap *map, const gchar *uri, int zoom, int x, int y); static void osm_gps_map_tile_download_complete (SoupSession *session, SoupMessage *msg, gpointer user_data); static void osm_gps_map_download_tile (OsmGpsMap *map, int zoom, int x, int y, gboolean redraw); -static gboolean osm_gps_map_map_redraw (OsmGpsMap *map); -static void osm_gps_map_map_redraw_idle (OsmGpsMap *map); static GdkPixbuf* osm_gps_map_render_tile_upscaled (OsmGpsMap *map, GdkPixbuf *tile, int tile_zoom, int zoom, int x, int y); static void @@ -1150,22 +1155,27 @@ osm_gps_map_print_track (OsmGpsMap *map, OsmGpsMapTrack *track, cairo_t *cr) GdkRGBA color; g_object_get (track, - "track", &points, - "line-width", &lw, - "alpha", &alpha, - NULL); + "track", &points, + "line-width", &lw, + "alpha", &alpha, + NULL); osm_gps_map_track_get_color(track, &color); if (points == NULL) return; + gboolean path_editable = FALSE; + g_object_get(track, "editable", &path_editable, NULL); + cairo_set_line_width (cr, lw); - cairo_set_source_rgba (cr, color.red/65535.0, color.green/65535.0, color.blue/65535.0, alpha); + cairo_set_source_rgba (cr, color.red, color.green, color.blue, alpha); cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); map_x0 = priv->map_x - EXTRA_BORDER; map_y0 = priv->map_y - EXTRA_BORDER; + + int last_x = 0, last_y = 0; for(pt = points; pt != NULL; pt = pt->next) { OsmGpsMapPoint *tp = pt->data; @@ -1174,24 +1184,42 @@ osm_gps_map_print_track (OsmGpsMap *map, OsmGpsMapTrack *track, cairo_t *cr) y = lat2pixel(priv->map_zoom, tp->rlat) - map_y0; /* first time through loop */ - if (pt == points) { + if (pt == points) cairo_move_to(cr, x, y); - } cairo_line_to(cr, x, y); + cairo_stroke(cr); + if(path_editable) + { + cairo_arc (cr, x, y, DOT_RADIUS, 0.0, 2 * M_PI); + cairo_stroke(cr); + + if(pt != points) + { + cairo_set_source_rgba (cr, color.red, color.green, color.blue, alpha*0.75); + cairo_arc(cr, (last_x + x)/2.0, (last_y+y)/2.0, DOT_RADIUS, 0.0, 2*M_PI); + cairo_stroke(cr); + cairo_set_source_rgba (cr, color.red, color.green, color.blue, alpha); + } + } + + cairo_move_to(cr, x, y); max_x = MAX(x,max_x); min_x = MIN(x,min_x); max_y = MAX(y,max_y); min_y = MIN(y,min_y); + + last_x = x; + last_y = y; } gtk_widget_queue_draw_area ( - GTK_WIDGET(map), - min_x - lw, - min_y - lw, - max_x + (lw * 2), - max_y + (lw * 2)); + GTK_WIDGET(map), + min_x - lw, + min_y - lw, + max_x + (lw * 2), + max_y + (lw * 2)); cairo_stroke(cr); } @@ -1216,6 +1244,124 @@ osm_gps_map_print_tracks (OsmGpsMap *map, cairo_t *cr) } } +static void +osm_gps_map_print_polygon (OsmGpsMap *map, OsmGpsMapPolygon *poly, cairo_t *cr) +{ + OsmGpsMapPrivate *priv = map->priv; + + GSList *pt,*points; + int x,y; + int min_x = 0,min_y = 0,max_x = 0,max_y = 0; + gfloat lw, alpha; + int map_x0, map_y0; + GdkRGBA color; + + OsmGpsMapTrack* track = osm_gps_map_polygon_get_track(poly); + + if(!track) + return; + g_object_get (track, + "track", &points, + "line-width", &lw, + "alpha", &alpha, + NULL); + osm_gps_map_track_get_color(track, &color); + + if (points == NULL) + return; + + gboolean path_editable = FALSE; + gboolean poly_shaded = FALSE; + g_object_get(poly, "editable", &path_editable, NULL); + g_object_get(poly, "shaded", &poly_shaded, NULL); + + cairo_set_line_width (cr, lw); + cairo_set_source_rgba (cr, color.red, color.green, color.blue, alpha); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + + map_x0 = priv->map_x - EXTRA_BORDER; + map_y0 = priv->map_y - EXTRA_BORDER; + + int first_x = 0, first_y = 0; + for(pt = points; pt != NULL; pt = pt->next) + { + OsmGpsMapPoint *tp = pt->data; + + x = lon2pixel(priv->map_zoom, tp->rlon) - map_x0; + y = lat2pixel(priv->map_zoom, tp->rlat) - map_y0; + + /* first time through loop */ + if (pt == points) + { + cairo_move_to(cr, x, y); + first_x = x; first_y = y; + } + + cairo_line_to(cr, x, y); + } + //close off polygon + cairo_line_to(cr, first_x, first_y); + if(poly_shaded) + cairo_fill(cr); + else + cairo_stroke(cr); + + if(path_editable) + { + int last_x = 0, last_y = 0; + for(pt = points; pt != NULL; pt = pt->next) + { + OsmGpsMapPoint *tp = pt->data; + + x = lon2pixel(priv->map_zoom, tp->rlon) - map_x0; + y = lat2pixel(priv->map_zoom, tp->rlat) - map_y0; + + cairo_arc (cr, x, y, DOT_RADIUS, 0.0, 2 * M_PI); + cairo_stroke(cr); + + if(pt != points) + { + cairo_set_source_rgba (cr, color.red, color.green, color.blue, alpha*0.75); + cairo_arc(cr, (last_x + x)/2.0, (last_y+y)/2.0, DOT_RADIUS, 0.0, 2*M_PI); + cairo_stroke(cr); + cairo_set_source_rgba (cr, color.red, color.green, color.blue, alpha); + } + last_x = x; last_y = y; + } + + x = first_x; y = first_y; + cairo_set_source_rgba (cr, color.red, color.green, color.blue, alpha*0.75); + cairo_arc(cr, (last_x + x)/2.0, (last_y+y)/2.0, DOT_RADIUS, 0.0, 2*M_PI); + cairo_stroke(cr); + cairo_set_source_rgba (cr, color.red, color.green, color.blue, alpha); + } + + gtk_widget_queue_draw_area ( + GTK_WIDGET(map), + min_x - lw, + min_y - lw, + max_x + (lw * 2), + max_y + (lw * 2)); + +} + +static void +osm_gps_map_print_polygons (OsmGpsMap *map, cairo_t* cr) +{ + GSList *tmp; + OsmGpsMapPrivate *priv = map->priv; + + if (priv->polygons) { + tmp = priv->polygons; + while (tmp != NULL) { + osm_gps_map_print_polygon (map, OSM_GPS_MAP_POLYGON(tmp->data), cr); + tmp = g_slist_next(tmp); + } + } +} + + static gboolean osm_gps_map_purge_cache_check(gpointer key, gpointer value, gpointer user) { @@ -1235,7 +1381,7 @@ osm_gps_map_purge_cache (OsmGpsMap *map) g_hash_table_foreach_remove(priv->tile_cache, osm_gps_map_purge_cache_check, priv); } -static gboolean +gboolean osm_gps_map_map_redraw (OsmGpsMap *map) { cairo_t *cr; @@ -1285,6 +1431,7 @@ osm_gps_map_map_redraw (OsmGpsMap *map) osm_gps_map_fill_tiles_pixel(map, cr); osm_gps_map_print_tracks(map, cr); + osm_gps_map_print_polygons(map, cr); osm_gps_map_print_images(map, cr); /* draw the gps point using the appropriate virtual private method */ @@ -1310,7 +1457,7 @@ osm_gps_map_map_redraw (OsmGpsMap *map) return FALSE; } -static void +void osm_gps_map_map_redraw_idle (OsmGpsMap *map) { OsmGpsMapPrivate *priv = map->priv; @@ -1563,6 +1710,8 @@ osm_gps_map_setup(OsmGpsMap *map) g_free(priv->repo_uri); priv->repo_uri = g_strdup(uri); + + g_free(priv->image_format); priv->image_format = g_strdup( osm_gps_map_source_get_image_format(priv->map_source)); priv->max_zoom = osm_gps_map_source_get_max_zoom(priv->map_source); @@ -1574,16 +1723,19 @@ osm_gps_map_setup(OsmGpsMap *map) /* setup the tile cache */ if ( g_strcmp0(priv->tile_dir, OSM_GPS_MAP_CACHE_DISABLED) == 0 ) { + g_free(priv->cache_dir); priv->cache_dir = NULL; } else if ( g_strcmp0(priv->tile_dir, OSM_GPS_MAP_CACHE_AUTO) == 0 ) { char *base = osm_gps_map_get_cache_base_dir(priv); char *md5 = g_compute_checksum_for_string (G_CHECKSUM_MD5, priv->repo_uri, -1); + g_free(priv->cache_dir); priv->cache_dir = g_strdup_printf("%s%c%s", base, G_DIR_SEPARATOR, md5); g_free(base); g_free(md5); } else if ( g_strcmp0(priv->tile_dir, OSM_GPS_MAP_CACHE_FRIENDLY) == 0 ) { char *base = osm_gps_map_get_cache_base_dir(priv); const char *fname = osm_gps_map_source_get_friendly_name(priv->map_source); + g_free(priv->cache_dir); priv->cache_dir = g_strdup_printf("%s%c%s", base, G_DIR_SEPARATOR, fname); g_free(base); } else { @@ -1678,10 +1830,13 @@ osm_gps_map_finalize (GObject *object) if (priv->tile_dir) g_free(priv->tile_dir); + g_free(priv->tile_base_dir); + if (priv->cache_dir) g_free(priv->cache_dir); g_free(priv->repo_uri); + g_free(priv->proxy_uri); g_free(priv->image_format); /* trip and tracks contain simple non GObject types, so free them here */ @@ -1712,10 +1867,12 @@ osm_gps_map_set_property (GObject *object, guint prop_id, const GValue *value, G priv->map_auto_download_enabled = g_value_get_boolean (value); break; case PROP_REPO_URI: + g_free(priv->repo_uri); priv->repo_uri = g_value_dup_string (value); break; case PROP_PROXY_URI: if ( g_value_get_string(value) ) { + g_free(priv->proxy_uri); priv->proxy_uri = g_value_dup_string (value); g_debug("Setting proxy server: %s", priv->proxy_uri); @@ -1726,25 +1883,32 @@ osm_gps_map_set_property (GObject *object, guint prop_id, const GValue *value, G g_object_set_property(G_OBJECT(priv->soup_session),SOUP_SESSION_PROXY_URI,&val); } else { + g_free(priv->proxy_uri); priv->proxy_uri = NULL; } break; case PROP_TILE_CACHE_DIR: if ( g_value_get_string(value) ) { + g_free(priv->tile_dir); priv->tile_dir = g_value_dup_string (value); if ((g_strcmp0(priv->tile_dir, OSM_GPS_MAP_CACHE_DISABLED) == 0) || (g_strcmp0(priv->tile_dir, OSM_GPS_MAP_CACHE_AUTO) == 0) || (g_strcmp0(priv->tile_dir, OSM_GPS_MAP_CACHE_FRIENDLY) == 0)) { /* this case is handled by osm_gps_map_setup */ } else { + if (priv->cache_dir) + g_free(priv->cache_dir); priv->cache_dir = g_strdup(priv->tile_dir); g_debug("Cache dir: %s", priv->cache_dir); } } else { + if (priv->tile_dir) + g_free(priv->tile_dir); priv->tile_dir = g_strdup(OSM_GPS_MAP_CACHE_DISABLED); } break; case PROP_TILE_CACHE_BASE_DIR: + g_free(priv->tile_base_dir); priv->tile_base_dir = g_value_dup_string (value); break; case PROP_TILE_ZOOM_OFFSET: @@ -1794,6 +1958,7 @@ osm_gps_map_set_property (GObject *object, guint prop_id, const GValue *value, G } } break; case PROP_IMAGE_FORMAT: + g_free(priv->image_format); priv->image_format = g_value_dup_string (value); break; case PROP_DRAG_LIMIT: @@ -1908,7 +2073,7 @@ osm_gps_map_scroll_event (GtkWidget *widget, GdkEventScroll *event) { OsmGpsMap *map; OsmGpsMapPoint *pt; - float lat, lon; + float lat, lon, c_lat, c_lon; map = OSM_GPS_MAP(widget); pt = osm_gps_map_point_new_degrees(0.0,0.0); @@ -1917,10 +2082,20 @@ osm_gps_map_scroll_event (GtkWidget *widget, GdkEventScroll *event) osm_gps_map_convert_screen_to_geographic(map, event->x, event->y, pt); osm_gps_map_point_get_degrees (pt, &lat, &lon); - if (event->direction == GDK_SCROLL_UP) + c_lat = rad2deg(map->priv->center_rlat); + c_lon = rad2deg(map->priv->center_rlon); + + + + if ((event->direction == GDK_SCROLL_UP) && (map->priv->map_zoom < map->priv->max_zoom)) { + lat = c_lat + ((lat - c_lat)/2.0); + lon = c_lon + ((lon - c_lon)/2.0); osm_gps_map_set_center_and_zoom(map, lat, lon, map->priv->map_zoom+1); - else if (event->direction == GDK_SCROLL_DOWN) + } else if ((event->direction == GDK_SCROLL_DOWN) && (map->priv->map_zoom > map->priv->min_zoom)) { + lat = c_lat + ((c_lat - lat)*1.0); + lon = c_lon + ((c_lon - lon)*1.0); osm_gps_map_set_center_and_zoom(map, lat, lon, map->priv->map_zoom-1); + } osm_gps_map_point_free (pt); @@ -1933,15 +2108,148 @@ osm_gps_map_button_press (GtkWidget *widget, GdkEventButton *event) OsmGpsMap *map = OSM_GPS_MAP(widget); OsmGpsMapPrivate *priv = map->priv; - if (priv->layers) { + if (priv->layers) + { GSList *list; - for(list = priv->layers; list != NULL; list = list->next) { + for(list = priv->layers; list != NULL; list = list->next) + { OsmGpsMapLayer *layer = list->data; if (osm_gps_map_layer_button_press(layer, map, event)) return FALSE; } } + if(event->button == 1) + { + GSList* tracks = priv->tracks; + while(tracks) + { + OsmGpsMapTrack* track = tracks->data; + gboolean path_editable = FALSE; + g_object_get(track, "editable", &path_editable, NULL); + if(path_editable) + { + GSList* points = osm_gps_map_track_get_points(track); + int ctr = 0; + int last_x = 0; + int last_y = 0; + while(points) + { + //if the mouse has gone down on a point, start dragging it + int cx, cy; + OsmGpsMapPoint* point = (OsmGpsMapPoint*)points->data; + osm_gps_map_convert_geographic_to_screen(map, point, &cx, &cy); + + float dist_sqrd = (event->x - cx) * (event->x-cx) + (event->y-cy) * (event->y-cy); + if(dist_sqrd <= ((DOT_RADIUS + 1) * (DOT_RADIUS + 1))) + { + priv->is_button_down = TRUE; + priv->drag_point = point; + priv->drag_track = track; + priv->is_dragging_point = TRUE; + osm_gps_map_map_redraw(map); + return FALSE; + } + + //add a new point if a 'breaker' has been clicked + if(ctr != 0) + { + int ptx = (last_x+cx)/2.0; + int pty = (last_y+cy)/2.0; + dist_sqrd = (event->x - ptx) * (event->x-ptx) + (event->y-pty) * (event->y-pty); + if(dist_sqrd <= ((DOT_RADIUS + 1) * (DOT_RADIUS + 1))) + { + OsmGpsMapPoint* newpoint = malloc(sizeof(OsmGpsMapPoint)); + osm_gps_map_convert_screen_to_geographic(map, ptx, pty, newpoint); + osm_gps_map_track_insert_point(track, newpoint, ctr); + osm_gps_map_map_redraw(map); + return FALSE; + } + } + + last_x = cx; + last_y = cy; + points = points->next; + ctr++; + } + } + tracks = tracks->next; + } + + GSList* polys = priv->polygons; + while(polys) + { + OsmGpsMapPolygon* poly = polys->data; + gboolean path_editable = FALSE; + OsmGpsMapTrack* track = osm_gps_map_polygon_get_track(poly); + g_object_get(poly, "editable", &path_editable, NULL); + if(path_editable) + { + GSList* points = osm_gps_map_track_get_points(track); + int ctr = 0; + int last_x = 0; + int last_y = 0; + int first_x = 0; int first_y = 0; + while(points) + { + //if the mouse has gone down on a point, start dragging it + int cx, cy; + OsmGpsMapPoint* point = (OsmGpsMapPoint*)points->data; + osm_gps_map_convert_geographic_to_screen(map, point, &cx, &cy); + + float dist_sqrd = (event->x - cx) * (event->x-cx) + (event->y-cy) * (event->y-cy); + if(dist_sqrd <= ((DOT_RADIUS + 1) * (DOT_RADIUS + 1))) + { + priv->is_button_down = TRUE; + priv->drag_point = point; + priv->drag_track = track; + priv->is_dragging_point = TRUE; + osm_gps_map_map_redraw(map); + return FALSE; + } + + //add a new point if a 'breaker' has been clicked + if(ctr != 0) + { + int ptx = (last_x+cx)/2.0; + int pty = (last_y+cy)/2.0; + dist_sqrd = (event->x - ptx) * (event->x-ptx) + (event->y-pty) * (event->y-pty); + if(dist_sqrd <= ((DOT_RADIUS + 1) * (DOT_RADIUS + 1))) + { + OsmGpsMapPoint* newpoint = malloc(sizeof(OsmGpsMapPoint)); + osm_gps_map_convert_screen_to_geographic(map, ptx, pty, newpoint); + osm_gps_map_track_insert_point(track, newpoint, ctr); + osm_gps_map_map_redraw(map); + return FALSE; + } + } + else + { + first_x = cx; first_y = cy; + } + + last_x = cx; + last_y = cy; + points = points->next; + ctr++; + } + + int ptx = (last_x+first_x)/2.0; + int pty = (last_y+first_y)/2.0; + float dist_sqrd = (event->x - ptx) * (event->x-ptx) + (event->y-pty) * (event->y-pty); + if(dist_sqrd <= ((DOT_RADIUS + 1) * (DOT_RADIUS + 1))) + { + OsmGpsMapPoint* newpoint = malloc(sizeof(OsmGpsMapPoint)); + osm_gps_map_convert_screen_to_geographic(map, ptx, pty, newpoint); + osm_gps_map_track_insert_point(track, newpoint, ctr); + osm_gps_map_map_redraw(map); + return FALSE; + } + } + polys = polys->next; + } + } + priv->is_button_down = TRUE; priv->drag_counter = 0; priv->drag_start_mouse_x = (int) event->x; @@ -1976,6 +2284,13 @@ osm_gps_map_button_release (GtkWidget *widget, GdkEventButton *event) osm_gps_map_map_redraw_idle(map); } + if( priv->is_dragging_point) + { + priv->is_dragging_point = FALSE; + osm_gps_map_convert_screen_to_geographic(map, event->x, event->y, priv->drag_point); + g_signal_emit_by_name(priv->drag_track, "point-changed"); + } + priv->drag_counter = -1; priv->is_button_down = FALSE; @@ -2005,6 +2320,13 @@ osm_gps_map_motion_notify (GtkWidget *widget, GdkEventMotion *event) if(!priv->is_button_down) return FALSE; + if(priv->is_dragging_point) + { + osm_gps_map_convert_screen_to_geographic(map, event->x, event->y, priv->drag_point); + osm_gps_map_map_redraw_idle(map); + return FALSE; + } + if (event->is_hint) // gdk_window_get_pointer (event->window, &x, &y, &state); gdk_window_get_device_position( event->window, pointer, &x, &y, &state); @@ -2020,14 +2342,14 @@ osm_gps_map_motion_notify (GtkWidget *widget, GdkEventMotion *event) if (!(state & GDK_BUTTON1_MASK)) return FALSE; - if (priv->drag_counter < 0) + if (priv->drag_counter < 0) return FALSE; /* not yet dragged far enough? */ if(!priv->drag_counter && - ( (x - priv->drag_start_mouse_x) * (x - priv->drag_start_mouse_x) + - (y - priv->drag_start_mouse_y) * (y - priv->drag_start_mouse_y) < - priv->drag_limit*priv->drag_limit)) + ( (x - priv->drag_start_mouse_x) * (x - priv->drag_start_mouse_x) + + (y - priv->drag_start_mouse_y) * (y - priv->drag_start_mouse_y) < + priv->drag_limit*priv->drag_limit)) return FALSE; priv->drag_counter++; @@ -2042,7 +2364,7 @@ osm_gps_map_motion_notify (GtkWidget *widget, GdkEventMotion *event) /* instead of redrawing directly just add an idle function */ if (!priv->drag_expose_source) - priv->drag_expose_source = + priv->drag_expose_source = g_idle_add ((GSourceFunc)osm_gps_map_idle_expose, widget); return FALSE; @@ -2074,7 +2396,7 @@ osm_gps_map_configure (GtkWidget *widget, GdkEventConfigure *event) gint pixel_y = lat2pixel(priv->map_zoom, priv->center_rlat); priv->map_x = pixel_x - w/2; - priv->map_y = pixel_y - w/2; + priv->map_y = pixel_y - h/2; osm_gps_map_map_redraw(OSM_GPS_MAP(widget)); @@ -2618,6 +2940,21 @@ osm_gps_map_get_bbox (OsmGpsMap *map, OsmGpsMapPoint *pt1, OsmGpsMapPoint *pt2) } /** + * osm_gps_map_zoom_fit_bbox: + * Zoom and center the map so that both points fit inside the window. + **/ +void +osm_gps_map_zoom_fit_bbox (OsmGpsMap *map, float latitude1, float latitude2, float longitude1, float longitude2) +{ + GtkAllocation allocation; + int zoom; + gtk_widget_get_allocation (GTK_WIDGET (map), &allocation); + zoom = latlon2zoom (allocation.height, allocation.width, deg2rad(latitude1), deg2rad(latitude2), deg2rad(longitude1), deg2rad(longitude2)); + osm_gps_map_set_center (map, (latitude1 + latitude2) / 2, (longitude1 + longitude2) / 2); + osm_gps_map_set_zoom (map, zoom); +} + +/** * osm_gps_map_set_center_and_zoom: * * Since: 0.7.0 @@ -2886,6 +3223,49 @@ osm_gps_map_track_remove (OsmGpsMap *map, OsmGpsMapTrack *track) return data != NULL; } +void +osm_gps_map_polygon_add (OsmGpsMap *map, OsmGpsMapPolygon *poly) +{ + OsmGpsMapPrivate *priv; + + g_return_if_fail (OSM_IS_GPS_MAP (map)); + priv = map->priv; + + g_object_ref(poly); + + OsmGpsMapTrack* track = osm_gps_map_polygon_get_track(poly); + g_signal_connect(track, "point-added", + G_CALLBACK(on_gps_point_added), map); + g_signal_connect(track, "notify", + G_CALLBACK(on_track_changed), map); + + priv->polygons = g_slist_append(priv->polygons, poly); + osm_gps_map_map_redraw_idle(map); +} + +void +osm_gps_map_polygon_remove_all(OsmGpsMap *map) +{ + g_return_if_fail (OSM_IS_GPS_MAP (map)); + + gslist_of_gobjects_free(&map->priv->polygons); + osm_gps_map_map_redraw_idle(map); +} + +gboolean +osm_gps_map_polygon_remove(OsmGpsMap *map, OsmGpsMapPolygon *poly) +{ + GSList *data; + + g_return_val_if_fail (OSM_IS_GPS_MAP (map), FALSE); + g_return_val_if_fail (poly != NULL, FALSE); + + data = gslist_remove_one_gobject (&map->priv->polygons, G_OBJECT(poly)); + osm_gps_map_map_redraw_idle(map); + return data != NULL; +} + + /** * osm_gps_map_gps_clear: * diff --git a/src/osm-gps-map-widget.h b/src/osm-gps-map-widget.h index b310361..f2f66aa 100644 --- a/src/osm-gps-map-widget.h +++ b/src/osm-gps-map-widget.h @@ -44,6 +44,7 @@ typedef struct _OsmGpsMapPrivate OsmGpsMapPrivate; #include "osm-gps-map-layer.h" #include "osm-gps-map-point.h" #include "osm-gps-map-track.h" +#include "osm-gps-map-polygon.h" #include "osm-gps-map-image.h" struct _OsmGpsMapClass @@ -84,6 +85,7 @@ gchar* osm_gps_map_get_default_cache_directory (void); void osm_gps_map_download_maps (OsmGpsMap *map, OsmGpsMapPoint *pt1, OsmGpsMapPoint *pt2, int zoom_start, int zoom_end); void osm_gps_map_download_cancel_all (OsmGpsMap *map); void osm_gps_map_get_bbox (OsmGpsMap *map, OsmGpsMapPoint *pt1, OsmGpsMapPoint *pt2); +void osm_gps_map_zoom_fit_bbox (OsmGpsMap *map, float latitude1, float latitude2, float longitude1, float longitude2); void osm_gps_map_set_center_and_zoom (OsmGpsMap *map, float latitude, float longitude, int zoom); void osm_gps_map_set_center (OsmGpsMap *map, float latitude, float longitude); int osm_gps_map_set_zoom (OsmGpsMap *map, int zoom); @@ -96,6 +98,9 @@ void osm_gps_map_set_keyboard_shortcut (OsmGpsMap *map, OsmGpsM void osm_gps_map_track_add (OsmGpsMap *map, OsmGpsMapTrack *track); void osm_gps_map_track_remove_all (OsmGpsMap *map); gboolean osm_gps_map_track_remove (OsmGpsMap *map, OsmGpsMapTrack *track); +void osm_gps_map_polygon_add (OsmGpsMap *map, OsmGpsMapPolygon *poly); +void osm_gps_map_polygon_remove_all (OsmGpsMap *map); +gboolean osm_gps_map_polygon_remove (OsmGpsMap *map, OsmGpsMapPolygon *poly); void osm_gps_map_gps_add (OsmGpsMap *map, float latitude, float longitude, float heading); void osm_gps_map_gps_clear (OsmGpsMap *map); OsmGpsMapTrack *osm_gps_map_gps_get_track (OsmGpsMap *map); @@ -111,6 +116,8 @@ void osm_gps_map_layer_remove_all (OsmGpsMap *map); void osm_gps_map_convert_screen_to_geographic(OsmGpsMap *map, gint pixel_x, gint pixel_y, OsmGpsMapPoint *pt); void osm_gps_map_convert_geographic_to_screen(OsmGpsMap *map, OsmGpsMapPoint *pt, gint *pixel_x, gint *pixel_y); OsmGpsMapPoint *osm_gps_map_get_event_location (OsmGpsMap *map, GdkEventButton *event); +gboolean osm_gps_map_map_redraw (OsmGpsMap *map); +void osm_gps_map_map_redraw_idle (OsmGpsMap *map); G_END_DECLS -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/osm-gps-map.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel